From 758196cc70d9019ab52f5d0eda390b7bd01eb745 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Tue, 4 Jun 2019 20:09:55 +0200 Subject: [PATCH 1/5] Midway8080v2_Mist->Midway8080v2_MiST On Linux, it creates two different directories --- .../Invaders.qpf | 0 .../Invaders.qsf | 0 .../Release/Invaders.rbf | Bin .../clean.bat | 0 .../rtl/Invaders_mist.sv | 0 .../rtl/build_id.tcl | 0 .../rtl/dac.vhd | 0 .../rtl/hq2x.sv | 0 .../rtl/invaders.vhd | 0 .../rtl/invaders_audio.vhd | 0 .../rtl/invaders_top.vhd | 0 .../rtl/invaders_video.vhd | 0 .../rtl/keyboard.v | 0 .../rtl/mist_io.v | 0 .../rtl/mw8080.vhd | 0 .../rtl/osd.v | 0 .../rtl/pll.qip | 0 .../rtl/pll.vhd | 0 .../rtl/scandoubler.v | 0 .../rtl/video_mixer.sv | 0 .../Midway8080v2_Mist/rtl/build_id.v | 2 -- 21 files changed, 2 deletions(-) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/Invaders.qpf (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/Invaders.qsf (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/Release/Invaders.rbf (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/clean.bat (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/rtl/Invaders_mist.sv (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/rtl/build_id.tcl (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/rtl/dac.vhd (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/rtl/hq2x.sv (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/rtl/invaders.vhd (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/rtl/invaders_audio.vhd (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/rtl/invaders_top.vhd (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/rtl/invaders_video.vhd (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/rtl/keyboard.v (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/rtl/mist_io.v (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/rtl/mw8080.vhd (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/rtl/osd.v (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/rtl/pll.qip (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/rtl/pll.vhd (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/rtl/scandoubler.v (100%) rename Arcade_MiST/Midway8080 Hardware/{Midway8080v2_Mist => Midway8080v2_MiST}/rtl/video_mixer.sv (100%) delete mode 100644 Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/build_id.v diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/Invaders.qpf b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/Invaders.qpf similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/Invaders.qpf rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/Invaders.qpf diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/Invaders.qsf b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/Invaders.qsf similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/Invaders.qsf rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/Invaders.qsf diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/Release/Invaders.rbf b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/Release/Invaders.rbf similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/Release/Invaders.rbf rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/Release/Invaders.rbf diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/clean.bat b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/clean.bat similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/clean.bat rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/clean.bat diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/Invaders_mist.sv b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/Invaders_mist.sv similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/Invaders_mist.sv rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/Invaders_mist.sv diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/build_id.tcl b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/build_id.tcl similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/build_id.tcl rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/build_id.tcl diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/dac.vhd b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/dac.vhd similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/dac.vhd rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/dac.vhd diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/hq2x.sv b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/hq2x.sv similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/hq2x.sv rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/hq2x.sv diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders.vhd b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/invaders.vhd similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders.vhd rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/invaders.vhd diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_audio.vhd b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/invaders_audio.vhd similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_audio.vhd rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/invaders_audio.vhd diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_top.vhd b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/invaders_top.vhd similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_top.vhd rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/invaders_top.vhd diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_video.vhd b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/invaders_video.vhd similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/invaders_video.vhd rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/invaders_video.vhd diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/keyboard.v b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/keyboard.v similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/keyboard.v rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/keyboard.v diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/mist_io.v b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/mist_io.v similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/mist_io.v rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/mist_io.v diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/mw8080.vhd b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/mw8080.vhd similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/mw8080.vhd rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/mw8080.vhd diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/osd.v b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/osd.v similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/osd.v rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/osd.v diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/pll.qip b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/pll.qip similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/pll.qip rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/pll.qip diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/pll.vhd b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/pll.vhd similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/pll.vhd rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/pll.vhd diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/scandoubler.v b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/scandoubler.v similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/scandoubler.v rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/scandoubler.v diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/video_mixer.sv b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/video_mixer.sv similarity index 100% rename from Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/video_mixer.sv rename to Arcade_MiST/Midway8080 Hardware/Midway8080v2_MiST/rtl/video_mixer.sv diff --git a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/build_id.v b/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/build_id.v deleted file mode 100644 index c74c7f56..00000000 --- a/Arcade_MiST/Midway8080 Hardware/Midway8080v2_Mist/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190604" -`define BUILD_TIME "154728" From a9e7fcf9460967481ff76e24368dd63426204bbe Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Tue, 4 Jun 2019 20:11:29 +0200 Subject: [PATCH 2/5] Remove generated build_id.v files They're always conflicting after a synthesis --- .../Atari Discrete Logic/ComputerSpace_MiST/rtl/build_id.v | 2 -- Arcade_MiST/Berzerk Hardware/Berzerk_MiST/rtl/build_id.v | 2 -- Arcade_MiST/Berzerk Hardware/Frenzy_MiST/rtl/build_id.v | 2 -- Arcade_MiST/Custom Hardware/Galaga_MiST/rtl/build_id.v | 2 -- .../Burger_Time_MiST/rtl/build_id.v | 2 -- .../Burnin Rubber_MiST/rtl/build_id.v | 2 -- .../Z80 Based/AzurianAttack_MiST/rtl/build_id.v | 2 -- .../Galaxian Hardware/Z80 Based/BlackHole_MiST/rtl/build_id.v | 2 -- .../Galaxian Hardware/Z80 Based/Catacomb_MiST/rtl/build_id.v | 2 -- .../Galaxian Hardware/Z80 Based/ChewingGum_MiST/rtl/build_id.v | 2 -- .../Galaxian Hardware/Z80 Based/Galaxian_MiST/rtl/build_id.v | 2 -- .../Galaxian Hardware/Z80 Based/KingBaloon_MiST/rtl/build_id.v | 2 -- .../Galaxian Hardware/Z80 Based/MoonCresta_MiST/rtl/build_id.v | 2 -- .../Z80 Based/MrDoNightmare_MiST/rtl/build_id.v | 2 -- .../Galaxian Hardware/Z80 Based/Omega_MiST/rtl/build_id.v | 2 -- .../Galaxian Hardware/Z80 Based/Orbitron_MiST/rtl/build_id.v | 2 -- .../Galaxian Hardware/Z80 Based/Pisces_MiST/rtl/build_id.v | 2 -- .../Z80 Based/TripleDrawPoker_MiST/rtl/build_id.v | 2 -- .../Galaxian Hardware/Z80 Based/Victory_MiST/rtl/build_id.v | 2 -- .../Galaxian Hardware/Z80 Based/WarOfBugs_MiST/rtl/build_id.v | 2 -- .../Galaxian Hardware/Z80 Based/ZigZag_MiST/rtl/build_id.v | 2 -- Arcade_MiST/Konami Classic/Time_Pilot_MiST/rtl/build_id.v | 2 -- Arcade_MiST/Ladybug Hardware/CosmicAvenger_MiST/rtl/build_id.v | 2 -- Arcade_MiST/Ladybug Hardware/Dorodon_MiST/rtl/build_id.v | 2 -- Arcade_MiST/Ladybug Hardware/LadyBug_MiST/rtl/build_id.v | 2 -- Arcade_MiST/Ladybug Hardware/Snapjack_MiST/rtl/build_id.v | 2 -- Arcade_MiST/Nintendo Donkey Kong Hardware/rtl/build_id.v | 2 -- Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/build_id.v | 2 -- Arcade_MiST/Non Arcade/FlappyBird_MiST/rtl/build_id.v | 2 -- Arcade_MiST/Non Arcade/RiverRaid_MiST(Clone)/rtl/build_id.v | 2 -- Arcade_MiST/Phoenix Hardware/Capitol_MIST/rtl/build_id.v | 2 -- Arcade_MiST/Phoenix Hardware/Phoenix_MIST/rtl/build_id.v | 2 -- Computer_MiST/Acorn - Electron_MiST/rtl/build_id.v | 2 -- Computer_MiST/Apple - 1_MiST/rtl/build_id.v | 2 -- Computer_MiST/Apple - 2_MiST/rtl/build_id.v | 2 -- Computer_MiST/Bashkiria2M_MiST/rtl/build_id.v | 2 -- Computer_MiST/Commodore - Pet2001_MiST/rtl/build_id.v | 2 -- Computer_MiST/Galaksija_MiST/rtl/build_id.v | 2 -- Computer_MiST/ITCI - Cobra_MiST/rtl/build_id.v | 2 -- Computer_MiST/Jupiter Cantab - JupiterACE_MiST/rtl/build_id.v | 2 -- Computer_MiST/ORAO_MiST/rtl/build_id.v | 2 -- Computer_MiST/Robotron - KC87_MiST/rtl/build_id.v | 2 -- Computer_MiST/Sharp - MZ-80_MiST_New/rtl/build_id.v | 2 -- 43 files changed, 86 deletions(-) delete mode 100644 Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Berzerk Hardware/Berzerk_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Berzerk Hardware/Frenzy_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Custom Hardware/Galaga_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Data East Burger Time Hardware/Burger_Time_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Data East Burger Time Hardware/Burnin Rubber_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Galaxian Hardware/Z80 Based/AzurianAttack_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Galaxian Hardware/Z80 Based/BlackHole_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Galaxian Hardware/Z80 Based/Catacomb_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Galaxian Hardware/Z80 Based/ChewingGum_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Galaxian Hardware/Z80 Based/Galaxian_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Galaxian Hardware/Z80 Based/KingBaloon_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Galaxian Hardware/Z80 Based/MoonCresta_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Galaxian Hardware/Z80 Based/MrDoNightmare_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Galaxian Hardware/Z80 Based/Omega_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Galaxian Hardware/Z80 Based/Orbitron_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Galaxian Hardware/Z80 Based/Pisces_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Galaxian Hardware/Z80 Based/TripleDrawPoker_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Galaxian Hardware/Z80 Based/Victory_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Galaxian Hardware/Z80 Based/WarOfBugs_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Galaxian Hardware/Z80 Based/ZigZag_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Konami Classic/Time_Pilot_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Ladybug Hardware/CosmicAvenger_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Ladybug Hardware/Dorodon_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Ladybug Hardware/LadyBug_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Ladybug Hardware/Snapjack_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Nintendo Donkey Kong Hardware/rtl/build_id.v delete mode 100644 Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Non Arcade/FlappyBird_MiST/rtl/build_id.v delete mode 100644 Arcade_MiST/Non Arcade/RiverRaid_MiST(Clone)/rtl/build_id.v delete mode 100644 Arcade_MiST/Phoenix Hardware/Capitol_MIST/rtl/build_id.v delete mode 100644 Arcade_MiST/Phoenix Hardware/Phoenix_MIST/rtl/build_id.v delete mode 100644 Computer_MiST/Acorn - Electron_MiST/rtl/build_id.v delete mode 100644 Computer_MiST/Apple - 1_MiST/rtl/build_id.v delete mode 100644 Computer_MiST/Apple - 2_MiST/rtl/build_id.v delete mode 100644 Computer_MiST/Bashkiria2M_MiST/rtl/build_id.v delete mode 100644 Computer_MiST/Commodore - Pet2001_MiST/rtl/build_id.v delete mode 100644 Computer_MiST/Galaksija_MiST/rtl/build_id.v delete mode 100644 Computer_MiST/ITCI - Cobra_MiST/rtl/build_id.v delete mode 100644 Computer_MiST/Jupiter Cantab - JupiterACE_MiST/rtl/build_id.v delete mode 100644 Computer_MiST/ORAO_MiST/rtl/build_id.v delete mode 100644 Computer_MiST/Robotron - KC87_MiST/rtl/build_id.v delete mode 100644 Computer_MiST/Sharp - MZ-80_MiST_New/rtl/build_id.v diff --git a/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/build_id.v b/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/build_id.v deleted file mode 100644 index 63ebc693..00000000 --- a/Arcade_MiST/Atari Discrete Logic/ComputerSpace_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190307" -`define BUILD_TIME "205523" diff --git a/Arcade_MiST/Berzerk Hardware/Berzerk_MiST/rtl/build_id.v b/Arcade_MiST/Berzerk Hardware/Berzerk_MiST/rtl/build_id.v deleted file mode 100644 index 08386795..00000000 --- a/Arcade_MiST/Berzerk Hardware/Berzerk_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190320" -`define BUILD_TIME "193746" diff --git a/Arcade_MiST/Berzerk Hardware/Frenzy_MiST/rtl/build_id.v b/Arcade_MiST/Berzerk Hardware/Frenzy_MiST/rtl/build_id.v deleted file mode 100644 index 0dcc2df0..00000000 --- a/Arcade_MiST/Berzerk Hardware/Frenzy_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190513" -`define BUILD_TIME "152214" diff --git a/Arcade_MiST/Custom Hardware/Galaga_MiST/rtl/build_id.v b/Arcade_MiST/Custom Hardware/Galaga_MiST/rtl/build_id.v deleted file mode 100644 index 35a7b1c4..00000000 --- a/Arcade_MiST/Custom Hardware/Galaga_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190308" -`define BUILD_TIME "213631" diff --git a/Arcade_MiST/Data East Burger Time Hardware/Burger_Time_MiST/rtl/build_id.v b/Arcade_MiST/Data East Burger Time Hardware/Burger_Time_MiST/rtl/build_id.v deleted file mode 100644 index 89166e20..00000000 --- a/Arcade_MiST/Data East Burger Time Hardware/Burger_Time_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190303" -`define BUILD_TIME "191855" diff --git a/Arcade_MiST/Data East Burger Time Hardware/Burnin Rubber_MiST/rtl/build_id.v b/Arcade_MiST/Data East Burger Time Hardware/Burnin Rubber_MiST/rtl/build_id.v deleted file mode 100644 index 48cca05e..00000000 --- a/Arcade_MiST/Data East Burger Time Hardware/Burnin Rubber_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190303" -`define BUILD_TIME "192419" diff --git a/Arcade_MiST/Galaxian Hardware/Z80 Based/AzurianAttack_MiST/rtl/build_id.v b/Arcade_MiST/Galaxian Hardware/Z80 Based/AzurianAttack_MiST/rtl/build_id.v deleted file mode 100644 index 4062a511..00000000 --- a/Arcade_MiST/Galaxian Hardware/Z80 Based/AzurianAttack_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190310" -`define BUILD_TIME "162222" diff --git a/Arcade_MiST/Galaxian Hardware/Z80 Based/BlackHole_MiST/rtl/build_id.v b/Arcade_MiST/Galaxian Hardware/Z80 Based/BlackHole_MiST/rtl/build_id.v deleted file mode 100644 index 1281dc7d..00000000 --- a/Arcade_MiST/Galaxian Hardware/Z80 Based/BlackHole_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190310" -`define BUILD_TIME "163237" diff --git a/Arcade_MiST/Galaxian Hardware/Z80 Based/Catacomb_MiST/rtl/build_id.v b/Arcade_MiST/Galaxian Hardware/Z80 Based/Catacomb_MiST/rtl/build_id.v deleted file mode 100644 index d69ab7d2..00000000 --- a/Arcade_MiST/Galaxian Hardware/Z80 Based/Catacomb_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190310" -`define BUILD_TIME "175804" diff --git a/Arcade_MiST/Galaxian Hardware/Z80 Based/ChewingGum_MiST/rtl/build_id.v b/Arcade_MiST/Galaxian Hardware/Z80 Based/ChewingGum_MiST/rtl/build_id.v deleted file mode 100644 index d9e90800..00000000 --- a/Arcade_MiST/Galaxian Hardware/Z80 Based/ChewingGum_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190510" -`define BUILD_TIME "092251" diff --git a/Arcade_MiST/Galaxian Hardware/Z80 Based/Galaxian_MiST/rtl/build_id.v b/Arcade_MiST/Galaxian Hardware/Z80 Based/Galaxian_MiST/rtl/build_id.v deleted file mode 100644 index 5cc1e326..00000000 --- a/Arcade_MiST/Galaxian Hardware/Z80 Based/Galaxian_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190310" -`define BUILD_TIME "164636" diff --git a/Arcade_MiST/Galaxian Hardware/Z80 Based/KingBaloon_MiST/rtl/build_id.v b/Arcade_MiST/Galaxian Hardware/Z80 Based/KingBaloon_MiST/rtl/build_id.v deleted file mode 100644 index a7df5711..00000000 --- a/Arcade_MiST/Galaxian Hardware/Z80 Based/KingBaloon_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190310" -`define BUILD_TIME "163929" diff --git a/Arcade_MiST/Galaxian Hardware/Z80 Based/MoonCresta_MiST/rtl/build_id.v b/Arcade_MiST/Galaxian Hardware/Z80 Based/MoonCresta_MiST/rtl/build_id.v deleted file mode 100644 index 3f8a5f01..00000000 --- a/Arcade_MiST/Galaxian Hardware/Z80 Based/MoonCresta_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190310" -`define BUILD_TIME "165356" diff --git a/Arcade_MiST/Galaxian Hardware/Z80 Based/MrDoNightmare_MiST/rtl/build_id.v b/Arcade_MiST/Galaxian Hardware/Z80 Based/MrDoNightmare_MiST/rtl/build_id.v deleted file mode 100644 index 02bc7718..00000000 --- a/Arcade_MiST/Galaxian Hardware/Z80 Based/MrDoNightmare_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190310" -`define BUILD_TIME "165958" diff --git a/Arcade_MiST/Galaxian Hardware/Z80 Based/Omega_MiST/rtl/build_id.v b/Arcade_MiST/Galaxian Hardware/Z80 Based/Omega_MiST/rtl/build_id.v deleted file mode 100644 index 42a9a55c..00000000 --- a/Arcade_MiST/Galaxian Hardware/Z80 Based/Omega_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190310" -`define BUILD_TIME "170856" diff --git a/Arcade_MiST/Galaxian Hardware/Z80 Based/Orbitron_MiST/rtl/build_id.v b/Arcade_MiST/Galaxian Hardware/Z80 Based/Orbitron_MiST/rtl/build_id.v deleted file mode 100644 index 1ef00ab6..00000000 --- a/Arcade_MiST/Galaxian Hardware/Z80 Based/Orbitron_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190310" -`define BUILD_TIME "171524" diff --git a/Arcade_MiST/Galaxian Hardware/Z80 Based/Pisces_MiST/rtl/build_id.v b/Arcade_MiST/Galaxian Hardware/Z80 Based/Pisces_MiST/rtl/build_id.v deleted file mode 100644 index dfb30211..00000000 --- a/Arcade_MiST/Galaxian Hardware/Z80 Based/Pisces_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190310" -`define BUILD_TIME "172238" diff --git a/Arcade_MiST/Galaxian Hardware/Z80 Based/TripleDrawPoker_MiST/rtl/build_id.v b/Arcade_MiST/Galaxian Hardware/Z80 Based/TripleDrawPoker_MiST/rtl/build_id.v deleted file mode 100644 index ab3bcdfb..00000000 --- a/Arcade_MiST/Galaxian Hardware/Z80 Based/TripleDrawPoker_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190311" -`define BUILD_TIME "181510" diff --git a/Arcade_MiST/Galaxian Hardware/Z80 Based/Victory_MiST/rtl/build_id.v b/Arcade_MiST/Galaxian Hardware/Z80 Based/Victory_MiST/rtl/build_id.v deleted file mode 100644 index 7062eadd..00000000 --- a/Arcade_MiST/Galaxian Hardware/Z80 Based/Victory_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190518" -`define BUILD_TIME "233058" diff --git a/Arcade_MiST/Galaxian Hardware/Z80 Based/WarOfBugs_MiST/rtl/build_id.v b/Arcade_MiST/Galaxian Hardware/Z80 Based/WarOfBugs_MiST/rtl/build_id.v deleted file mode 100644 index bbdfe1c3..00000000 --- a/Arcade_MiST/Galaxian Hardware/Z80 Based/WarOfBugs_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190310" -`define BUILD_TIME "173056" diff --git a/Arcade_MiST/Galaxian Hardware/Z80 Based/ZigZag_MiST/rtl/build_id.v b/Arcade_MiST/Galaxian Hardware/Z80 Based/ZigZag_MiST/rtl/build_id.v deleted file mode 100644 index c758cee9..00000000 --- a/Arcade_MiST/Galaxian Hardware/Z80 Based/ZigZag_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190510" -`define BUILD_TIME "143250" diff --git a/Arcade_MiST/Konami Classic/Time_Pilot_MiST/rtl/build_id.v b/Arcade_MiST/Konami Classic/Time_Pilot_MiST/rtl/build_id.v deleted file mode 100644 index 880c953c..00000000 --- a/Arcade_MiST/Konami Classic/Time_Pilot_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190309" -`define BUILD_TIME "175043" diff --git a/Arcade_MiST/Ladybug Hardware/CosmicAvenger_MiST/rtl/build_id.v b/Arcade_MiST/Ladybug Hardware/CosmicAvenger_MiST/rtl/build_id.v deleted file mode 100644 index fbeb1c0b..00000000 --- a/Arcade_MiST/Ladybug Hardware/CosmicAvenger_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190309" -`define BUILD_TIME "012154" diff --git a/Arcade_MiST/Ladybug Hardware/Dorodon_MiST/rtl/build_id.v b/Arcade_MiST/Ladybug Hardware/Dorodon_MiST/rtl/build_id.v deleted file mode 100644 index a515ec27..00000000 --- a/Arcade_MiST/Ladybug Hardware/Dorodon_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190309" -`define BUILD_TIME "013952" diff --git a/Arcade_MiST/Ladybug Hardware/LadyBug_MiST/rtl/build_id.v b/Arcade_MiST/Ladybug Hardware/LadyBug_MiST/rtl/build_id.v deleted file mode 100644 index 0ff3fc76..00000000 --- a/Arcade_MiST/Ladybug Hardware/LadyBug_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190309" -`define BUILD_TIME "020951" diff --git a/Arcade_MiST/Ladybug Hardware/Snapjack_MiST/rtl/build_id.v b/Arcade_MiST/Ladybug Hardware/Snapjack_MiST/rtl/build_id.v deleted file mode 100644 index 6b46f0ef..00000000 --- a/Arcade_MiST/Ladybug Hardware/Snapjack_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190309" -`define BUILD_TIME "014903" diff --git a/Arcade_MiST/Nintendo Donkey Kong Hardware/rtl/build_id.v b/Arcade_MiST/Nintendo Donkey Kong Hardware/rtl/build_id.v deleted file mode 100644 index 2893f858..00000000 --- a/Arcade_MiST/Nintendo Donkey Kong Hardware/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190504" -`define BUILD_TIME "125535" diff --git a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/build_id.v b/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/build_id.v deleted file mode 100644 index f9432adb..00000000 --- a/Arcade_MiST/Non Arcade/Arkanoid_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "181204" -`define BUILD_TIME "062230" diff --git a/Arcade_MiST/Non Arcade/FlappyBird_MiST/rtl/build_id.v b/Arcade_MiST/Non Arcade/FlappyBird_MiST/rtl/build_id.v deleted file mode 100644 index a392e03f..00000000 --- a/Arcade_MiST/Non Arcade/FlappyBird_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "181006" -`define BUILD_TIME "142606" diff --git a/Arcade_MiST/Non Arcade/RiverRaid_MiST(Clone)/rtl/build_id.v b/Arcade_MiST/Non Arcade/RiverRaid_MiST(Clone)/rtl/build_id.v deleted file mode 100644 index a966c8e6..00000000 --- a/Arcade_MiST/Non Arcade/RiverRaid_MiST(Clone)/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "171116" -`define BUILD_TIME "061557" diff --git a/Arcade_MiST/Phoenix Hardware/Capitol_MIST/rtl/build_id.v b/Arcade_MiST/Phoenix Hardware/Capitol_MIST/rtl/build_id.v deleted file mode 100644 index 926fdbc9..00000000 --- a/Arcade_MiST/Phoenix Hardware/Capitol_MIST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190312" -`define BUILD_TIME "215035" diff --git a/Arcade_MiST/Phoenix Hardware/Phoenix_MIST/rtl/build_id.v b/Arcade_MiST/Phoenix Hardware/Phoenix_MIST/rtl/build_id.v deleted file mode 100644 index 926fdbc9..00000000 --- a/Arcade_MiST/Phoenix Hardware/Phoenix_MIST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190312" -`define BUILD_TIME "215035" diff --git a/Computer_MiST/Acorn - Electron_MiST/rtl/build_id.v b/Computer_MiST/Acorn - Electron_MiST/rtl/build_id.v deleted file mode 100644 index 565cec23..00000000 --- a/Computer_MiST/Acorn - Electron_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "180123" -`define BUILD_TIME "014157" diff --git a/Computer_MiST/Apple - 1_MiST/rtl/build_id.v b/Computer_MiST/Apple - 1_MiST/rtl/build_id.v deleted file mode 100644 index 8b376d23..00000000 --- a/Computer_MiST/Apple - 1_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "180410" -`define BUILD_TIME "115601" diff --git a/Computer_MiST/Apple - 2_MiST/rtl/build_id.v b/Computer_MiST/Apple - 2_MiST/rtl/build_id.v deleted file mode 100644 index fa4fc18c..00000000 --- a/Computer_MiST/Apple - 2_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "180506" -`define BUILD_TIME "191822" diff --git a/Computer_MiST/Bashkiria2M_MiST/rtl/build_id.v b/Computer_MiST/Bashkiria2M_MiST/rtl/build_id.v deleted file mode 100644 index 9e25326f..00000000 --- a/Computer_MiST/Bashkiria2M_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "180205" -`define BUILD_TIME "195626" diff --git a/Computer_MiST/Commodore - Pet2001_MiST/rtl/build_id.v b/Computer_MiST/Commodore - Pet2001_MiST/rtl/build_id.v deleted file mode 100644 index e91154fa..00000000 --- a/Computer_MiST/Commodore - Pet2001_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "180708" -`define BUILD_TIME "052311" diff --git a/Computer_MiST/Galaksija_MiST/rtl/build_id.v b/Computer_MiST/Galaksija_MiST/rtl/build_id.v deleted file mode 100644 index 0e492bbf..00000000 --- a/Computer_MiST/Galaksija_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "190604" -`define BUILD_TIME "171020" diff --git a/Computer_MiST/ITCI - Cobra_MiST/rtl/build_id.v b/Computer_MiST/ITCI - Cobra_MiST/rtl/build_id.v deleted file mode 100644 index 9aede795..00000000 --- a/Computer_MiST/ITCI - Cobra_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "180517" -`define BUILD_TIME "082328" diff --git a/Computer_MiST/Jupiter Cantab - JupiterACE_MiST/rtl/build_id.v b/Computer_MiST/Jupiter Cantab - JupiterACE_MiST/rtl/build_id.v deleted file mode 100644 index 8318a533..00000000 --- a/Computer_MiST/Jupiter Cantab - JupiterACE_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "181231" -`define BUILD_TIME "044701" diff --git a/Computer_MiST/ORAO_MiST/rtl/build_id.v b/Computer_MiST/ORAO_MiST/rtl/build_id.v deleted file mode 100644 index a4f360fe..00000000 --- a/Computer_MiST/ORAO_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "180511" -`define BUILD_TIME "215937" diff --git a/Computer_MiST/Robotron - KC87_MiST/rtl/build_id.v b/Computer_MiST/Robotron - KC87_MiST/rtl/build_id.v deleted file mode 100644 index c95f4726..00000000 --- a/Computer_MiST/Robotron - KC87_MiST/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "180624" -`define BUILD_TIME "132954" diff --git a/Computer_MiST/Sharp - MZ-80_MiST_New/rtl/build_id.v b/Computer_MiST/Sharp - MZ-80_MiST_New/rtl/build_id.v deleted file mode 100644 index b04cd4ab..00000000 --- a/Computer_MiST/Sharp - MZ-80_MiST_New/rtl/build_id.v +++ /dev/null @@ -1,2 +0,0 @@ -`define BUILD_DATE "181212" -`define BUILD_TIME "194439" From 41da646d9c61a5637b39177726985f920c41c2a1 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Wed, 5 Jun 2019 22:23:11 +0200 Subject: [PATCH 3/5] TraverseUSA: new arcade core --- .../TraverseUSA_MiST/ReadMe.txt | 17 + .../Release/TraverseUSA_MiST.rbf | Bin 0 -> 357380 bytes .../TraverseUSA_MiST/TraverseUSA_MiST.qpf | 31 + .../TraverseUSA_MiST/TraverseUSA_MiST.qsf | 181 + .../TraverseUSA_MiST/TraverseUSA_MiST.sdc | 137 + .../binaries/linux32/duplicate_byte | Bin 0 -> 7356 bytes .../binaries/linux32/make_travusa_proms.sh | 34 + .../binaries/linux32/make_vhdl_prom | Bin 0 -> 11712 bytes .../binaries/win32/duplicate_byte.exe | Bin 0 -> 97353 bytes .../binaries/win32/make_travusa_proms.bat | 32 + .../binaries/win32/make_vhdl_prom.exe | Bin 0 -> 100636 bytes .../binaries/win64/duplicate_byte.exe | Bin 0 -> 117095 bytes .../binaries/win64/make_travusa_proms.bat | 32 + .../binaries/win64/make_vhdl_prom.exe | Bin 0 -> 119861 bytes .../TraverseUSA_MiST/rtl/TraverseUSA_MiST.sv | 275 + .../TraverseUSA_MiST/rtl/YM2149.sv | 329 + .../rtl/YM2149_linmix_sep.vhd | 574 ++ .../TraverseUSA_MiST/rtl/build_id.tcl | 35 + .../TraverseUSA_MiST/rtl/cpu09l_128.vhd | 5906 +++++++++++++++++ .../TraverseUSA_MiST/rtl/cpu68.vhd | 3963 +++++++++++ .../TraverseUSA_MiST/rtl/dac.vhd | 48 + .../TraverseUSA_MiST/rtl/data_io.v | 115 + .../TraverseUSA_MiST/rtl/gen_ram.vhd | 84 + .../rtl/moon_patrol_sound_board.vhd | 424 ++ .../TraverseUSA_MiST/rtl/pll_mist.ppf | 12 + .../TraverseUSA_MiST/rtl/pll_mist.qip | 4 + .../TraverseUSA_MiST/rtl/pll_mist.vhd | 397 ++ .../rtl/proms/travusa_chr_bit1.vhd | 534 ++ .../rtl/proms/travusa_chr_bit2.vhd | 534 ++ .../rtl/proms/travusa_chr_bit3.vhd | 534 ++ .../rtl/proms/travusa_chr_palette.vhd | 54 + .../rtl/proms/travusa_sound.vhd | 278 + .../rtl/proms/travusa_spr_bit1.vhd | 534 ++ .../rtl/proms/travusa_spr_bit2.vhd | 534 ++ .../rtl/proms/travusa_spr_bit3.vhd | 534 ++ .../rtl/proms/travusa_spr_palette.vhd | 38 + .../rtl/proms/travusa_spr_rgb_lut.vhd | 24 + .../TraverseUSA_MiST/rtl/rtl_T80/T80.vhd | 1175 ++++ .../TraverseUSA_MiST/rtl/rtl_T80/T80_ALU.vhd | 376 ++ .../rtl/rtl_T80/T80_MCode.vhd | 2035 ++++++ .../TraverseUSA_MiST/rtl/rtl_T80/T80_Pack.vhd | 228 + .../TraverseUSA_MiST/rtl/rtl_T80/T80_Reg.vhd | 152 + .../TraverseUSA_MiST/rtl/rtl_T80/T80se.vhd | 192 + .../TraverseUSA_MiST/rtl/sdram.sv | 254 + .../TraverseUSA_MiST/rtl/traverse_usa.vhd | 895 +++ .../rtl/traverse_usa_de10_lite.vhd | 363 + .../TraverseUSA_MiST/rtl/ym_2149_linmix.vhd | 645 ++ 47 files changed, 22543 insertions(+) create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/ReadMe.txt create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/Release/TraverseUSA_MiST.rbf create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/TraverseUSA_MiST.qpf create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/TraverseUSA_MiST.qsf create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/TraverseUSA_MiST.sdc create mode 100755 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/linux32/duplicate_byte create mode 100755 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/linux32/make_travusa_proms.sh create mode 100755 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/linux32/make_vhdl_prom create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win32/duplicate_byte.exe create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win32/make_travusa_proms.bat create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win32/make_vhdl_prom.exe create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win64/duplicate_byte.exe create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win64/make_travusa_proms.bat create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win64/make_vhdl_prom.exe create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/TraverseUSA_MiST.sv create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/YM2149.sv create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/YM2149_linmix_sep.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/build_id.tcl create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/cpu09l_128.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/cpu68.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/dac.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/data_io.v create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/gen_ram.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/moon_patrol_sound_board.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/pll_mist.ppf create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/pll_mist.qip create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/pll_mist.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_chr_bit1.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_chr_bit2.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_chr_bit3.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_chr_palette.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_sound.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_bit1.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_bit2.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_bit3.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_palette.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_rgb_lut.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80_ALU.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80_MCode.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80_Pack.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80_Reg.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80se.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/sdram.sv create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/traverse_usa.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/traverse_usa_de10_lite.vhd create mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/ym_2149_linmix.vhd diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/ReadMe.txt b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/ReadMe.txt new file mode 100644 index 00000000..1af441c9 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/ReadMe.txt @@ -0,0 +1,17 @@ +Traverse USA by Dar (darfpga@aol.fr) (16/03/2019) + +Port to MiST + +TRAVERSE.ROM is required at the root of the SD-Card. + +Creating in Windows: +copy /B zr1-0.m3 + zr1-5.l3 + zr1-6a.k3 + zr1-7.j3 TRAVERSE.ROM + +Creating in Linux: +cat zr1-0.m3 zr1-5.l3 zr1-6a.k3 zr1-7.j3 > TRAVERSE.ROM + +Some ROM files contain different names, like: +zippyrac.000 +zippyrac.005 +zippyrac.006 +zippyrac.007 diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/Release/TraverseUSA_MiST.rbf b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/Release/TraverseUSA_MiST.rbf new file mode 100644 index 0000000000000000000000000000000000000000..e2930c8a22b6aa7d827530aff674493d981bd935 GIT binary patch literal 357380 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%0Du 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 z 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

JJ)ATowSFP6XbjNQpeN-IPv;?ZTv-joU^ z{FDjXtL)7OQqISfNz4b3H822T3==>lQfh+RGK@3Aa7#mZ$c7PxmvKt`+o-#^B2a%6 z1JYy+8&M2l6F<0{70`C4{;0>KW;7_OpF8MC)k0)ZSO zAuSLeu@Q$bBT>t~ed!ki ztMsHl!q85wmURmKrG8CQ>Oo)+@L?ShoIHQ!NJ1uZQxW4dJsy!-j zdK4ikDSlJIObK&l~M1F}Pz@TF)q*#PCjx1%E1=BY1b4KAZewp@xrxYHMT1mx8f4?BCyZkili75e#RC*o z3S$-5h}Is5WT{IEwYb7Z%%A(}T}Z!ll9sS~NV=FMt$4PaU1=*RJgaf6MHLK(p|6$< zr0}50>9KQO@_aUcOAJ>GAuP;y9XAL~6_$MRBAOWbG^jF-EPHDlu-Q2Azf=&cAxTdh zzvqm8<)qp8lh9%Yu$Qb|K@0UhYhIuo6QyH;IOfOa+E#w%LHfJqtTlUhpT${U{d#c7 z{l-&)T8M<#jdPagEzyFM+mXXZIc|tlB3nx5E!>+S^jng5jyuGar@hs(E7YJsxhu5c zAuAUz?qPXSb1e&38!U)?D@K%-wkYn4zd`K}1vDPc{An@TrOwx#06s>MoP@0R8IDIKu zyIJV%Z`6iP(pqLSVsdg5BC?F>;n3ORE}ErkkgM@1GScTCQW9n8C=`LOANHSN?*?=J z(IveIE_j7M{GUELc65{<_q~IU^WXD7=`R@%@X|GZscu)(xBRNhcbN|c`6JQm=Y97W zeRut)@8=(nI03pe5Zj%jRWjUwIgXqQ#L|J|JduRz>6IYAmgKyB%#HBlhus!`vuYyU zZGZl=R!xMTwIG7q0E)UX9puk<^XoCT$ex}HhKlhb7V|gbIN9x~RQtg*FX(U9C?MGM z`kT?Qg}8bxt(lEH$8WD@OIPafDg@M!XSG;?jLO!F6XL8(u1Y^wfY}f z*0=xf@$qN=!b-oc?d>>WeQWLZqu`)(l_t15)vy!P)9--~5DkqPtjo z>#=VGww(pFyb0>4zFzYW`8YmdiU(ha^RMJGw-y!ahHL} z>*kHm9o+|=CN|!#0(h>+&>~K~v<8AXQT>>V{FuL@} z41X9GJchVrf=UOIu`k7HB3DD+ak_C^XE=8^L+T5SCZ8%lj$__p#+zFDaXu55)#Jd# zfXr{k=jjXap993uHjYP~y%7fOJFUytd2Nw~MQj7C#SGWU-0s~ow2%yov{cF#pt~GTz z3Gc)PW6*+uu^F#B%D`HvU-u6W!u@^l=dJ5&>axj>J{tE@wP+3dL5685q%zI`cM*($ zCjtqQPFPYwCCSgn(j8U>UI@s_P(l$T%u~p3YSxrSZ!9dp2Tavct>2LHQS)Mq{IMcF zXE{|r5xKy4&N}b>*=F$9TwzF5#y~8OPGVKz43;0tRX?}OdVQP0z1>4qeLC?LxO3L= zwG0eT)W>l70skyz6MlL#QZ|3Z8jQ(=L6(Ryez6111c?B4f=abLX z)xcXV{F%o=$@>B~IY4Vb3ymS(gj$n}DzZyws_3+Aqm00u8|XR4cj0c##5JT%4`n

XufpoufPd2LDhz;S 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 J-}*ZX{~uVPI*0%O literal 0 HcmV?d00001 diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/TraverseUSA_MiST.qpf b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/TraverseUSA_MiST.qpf new file mode 100644 index 00000000..d0c46139 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/TraverseUSA_MiST.qpf @@ -0,0 +1,31 @@ +# -------------------------------------------------------------------------- # +# +# 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. +# +# -------------------------------------------------------------------------- # +# +# Quartus Prime +# Version 17.0.1 Build 598 06/07/2017 SJ Standard Edition +# Date created = 04:04:47 October 16, 2017 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "17.0" +DATE = "04:04:47 October 16, 2017" + +# Revisions + +PROJECT_REVISION = "TraverseUSA_MiST" diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/TraverseUSA_MiST.qsf b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/TraverseUSA_MiST.qsf new file mode 100644 index 00000000..66fc4b2b --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/TraverseUSA_MiST.qsf @@ -0,0 +1,181 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera 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 Altera Program License +# Subscription Agreement, Altera 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 Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 32-bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 21:22:13 June 04, 2019 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# TraverseUSA_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + +# Project-Wide Assignments +# ======================== +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:22:13 JUNE 04, 2019" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:rtl/build_id.tcl" + +# Pin & Location Assignments +# ========================== +set_location_assignment PIN_7 -to LED +set_location_assignment PIN_54 -to CLOCK_27 +set_location_assignment PIN_144 -to VGA_R[5] +set_location_assignment PIN_143 -to VGA_R[4] +set_location_assignment PIN_142 -to VGA_R[3] +set_location_assignment PIN_141 -to VGA_R[2] +set_location_assignment PIN_137 -to VGA_R[1] +set_location_assignment PIN_135 -to VGA_R[0] +set_location_assignment PIN_133 -to VGA_B[5] +set_location_assignment PIN_132 -to VGA_B[4] +set_location_assignment PIN_125 -to VGA_B[3] +set_location_assignment PIN_121 -to VGA_B[2] +set_location_assignment PIN_120 -to VGA_B[1] +set_location_assignment PIN_115 -to VGA_B[0] +set_location_assignment PIN_114 -to VGA_G[5] +set_location_assignment PIN_113 -to VGA_G[4] +set_location_assignment PIN_112 -to VGA_G[3] +set_location_assignment PIN_111 -to VGA_G[2] +set_location_assignment PIN_110 -to VGA_G[1] +set_location_assignment PIN_106 -to VGA_G[0] +set_location_assignment PIN_136 -to VGA_VS +set_location_assignment PIN_119 -to VGA_HS +set_location_assignment PIN_65 -to AUDIO_L +set_location_assignment PIN_80 -to AUDIO_R +set_location_assignment PIN_105 -to SPI_DO +set_location_assignment PIN_88 -to SPI_DI +set_location_assignment PIN_126 -to SPI_SCK +set_location_assignment PIN_127 -to SPI_SS2 +set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_13 -to CONF_DATA0 +set_location_assignment PLL_1 -to "pll:pll|altpll:altpll_component" +set_location_assignment PIN_49 -to SDRAM_A[0] +set_location_assignment PIN_44 -to SDRAM_A[1] +set_location_assignment PIN_42 -to SDRAM_A[2] +set_location_assignment PIN_39 -to SDRAM_A[3] +set_location_assignment PIN_4 -to SDRAM_A[4] +set_location_assignment PIN_6 -to SDRAM_A[5] +set_location_assignment PIN_8 -to SDRAM_A[6] +set_location_assignment PIN_10 -to SDRAM_A[7] +set_location_assignment PIN_11 -to SDRAM_A[8] +set_location_assignment PIN_28 -to SDRAM_A[9] +set_location_assignment PIN_50 -to SDRAM_A[10] +set_location_assignment PIN_30 -to SDRAM_A[11] +set_location_assignment PIN_32 -to SDRAM_A[12] +set_location_assignment PIN_83 -to SDRAM_DQ[0] +set_location_assignment PIN_79 -to SDRAM_DQ[1] +set_location_assignment PIN_77 -to SDRAM_DQ[2] +set_location_assignment PIN_76 -to SDRAM_DQ[3] +set_location_assignment PIN_72 -to SDRAM_DQ[4] +set_location_assignment PIN_71 -to SDRAM_DQ[5] +set_location_assignment PIN_69 -to SDRAM_DQ[6] +set_location_assignment PIN_68 -to SDRAM_DQ[7] +set_location_assignment PIN_86 -to SDRAM_DQ[8] +set_location_assignment PIN_87 -to SDRAM_DQ[9] +set_location_assignment PIN_98 -to SDRAM_DQ[10] +set_location_assignment PIN_99 -to SDRAM_DQ[11] +set_location_assignment PIN_100 -to SDRAM_DQ[12] +set_location_assignment PIN_101 -to SDRAM_DQ[13] +set_location_assignment PIN_103 -to SDRAM_DQ[14] +set_location_assignment PIN_104 -to SDRAM_DQ[15] +set_location_assignment PIN_58 -to SDRAM_BA[0] +set_location_assignment PIN_51 -to SDRAM_BA[1] +set_location_assignment PIN_85 -to SDRAM_DQMH +set_location_assignment PIN_67 -to SDRAM_DQML +set_location_assignment PIN_60 -to SDRAM_nRAS +set_location_assignment PIN_64 -to SDRAM_nCAS +set_location_assignment PIN_66 -to SDRAM_nWE +set_location_assignment PIN_59 -to SDRAM_nCS +set_location_assignment PIN_33 -to SDRAM_CKE +set_location_assignment PIN_43 -to SDRAM_CLK + +set_global_assignment -name FAMILY "Cyclone III" +set_global_assignment -name DEVICE EP3C25E144C8 +set_global_assignment -name TOP_LEVEL_ENTITY TraverseUSA_MiST +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name LAST_QUARTUS_VERSION 13.1 +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 144 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name ENABLE_CONFIGURATION_PINS OFF +set_global_assignment -name ENABLE_NCE_PIN OFF +set_global_assignment -name ENABLE_BOOT_SEL_PIN OFF +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "PASSIVE SERIAL" +set_global_assignment -name USE_CONFIGURATION_DEVICE OFF +set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF +set_global_assignment -name FORCE_CONFIGURATION_VCCIO ON +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise +set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise +set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "NO HEAT SINK WITH STILL AIR" +set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" +set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS ON +set_global_assignment -name SMART_RECOMPILE ON +set_global_assignment -name TIMEQUEST_DO_CCPP_REMOVAL ON +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top +set_global_assignment -name GENERATE_RBF_FILE ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name QIP_FILE rtl/pll_mist.qip +set_global_assignment -name SYSTEMVERILOG_FILE rtl/YM2149.sv +set_global_assignment -name VERILOG_FILE rtl/data_io.v +set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv +set_global_assignment -name VHDL_FILE rtl/proms/travusa_spr_rgb_lut.vhd +set_global_assignment -name VHDL_FILE rtl/proms/travusa_spr_palette.vhd +set_global_assignment -name VHDL_FILE rtl/proms/travusa_spr_bit3.vhd +set_global_assignment -name VHDL_FILE rtl/proms/travusa_spr_bit2.vhd +set_global_assignment -name VHDL_FILE rtl/proms/travusa_spr_bit1.vhd +set_global_assignment -name VHDL_FILE rtl/proms/travusa_sound.vhd +set_global_assignment -name VHDL_FILE rtl/proms/travusa_chr_palette.vhd +set_global_assignment -name VHDL_FILE rtl/proms/travusa_chr_bit3.vhd +set_global_assignment -name VHDL_FILE rtl/proms/travusa_chr_bit2.vhd +set_global_assignment -name VHDL_FILE rtl/proms/travusa_chr_bit1.vhd +set_global_assignment -name VHDL_FILE rtl/rtl_T80/T80.vhd +set_global_assignment -name VHDL_FILE rtl/rtl_T80/T80se.vhd +set_global_assignment -name VHDL_FILE rtl/rtl_T80/T80_Reg.vhd +set_global_assignment -name VHDL_FILE rtl/rtl_T80/T80_Pack.vhd +set_global_assignment -name VHDL_FILE rtl/rtl_T80/T80_MCode.vhd +set_global_assignment -name VHDL_FILE rtl/rtl_T80/T80_ALU.vhd +set_global_assignment -name SYSTEMVERILOG_FILE rtl/TraverseUSA_MiST.sv +set_global_assignment -name VHDL_FILE rtl/traverse_usa.vhd +set_global_assignment -name VHDL_FILE rtl/moon_patrol_sound_board.vhd +set_global_assignment -name VHDL_FILE rtl/gen_ram.vhd +set_global_assignment -name VHDL_FILE rtl/dac.vhd +set_global_assignment -name VHDL_FILE rtl/cpu68.vhd +set_global_assignment -name VHDL_FILE rtl/cpu09l_128.vhd +set_global_assignment -name VERILOG_FILE rtl/build_id.v +set_global_assignment -name QIP_FILE ../../../common/mist/mist.qip +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/TraverseUSA_MiST.sdc b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/TraverseUSA_MiST.sdc new file mode 100644 index 00000000..fca44902 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/TraverseUSA_MiST.sdc @@ -0,0 +1,137 @@ +## Generated SDC file "vectrex_MiST.out.sdc" + +## Copyright (C) 1991-2013 Altera Corporation +## Your use of Altera 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 Altera Program License +## Subscription Agreement, Altera 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 Altera and sold by +## Altera or its authorized distributors. Please refer to the +## applicable agreement for further details. + + +## VENDOR "Altera" +## PROGRAM "Quartus II" +## VERSION "Version 13.1.0 Build 162 10/23/2013 SJ Web Edition" + +## DATE "Sun Jun 24 12:53:00 2018" + +## +## DEVICE "EP3C25E144C8" +## + +# Clock constraints + +# Automatically constrain PLL and other generated clocks +derive_pll_clocks -create_base_clocks + +# Automatically calculate clock uncertainty to jitter and other effects. +derive_clock_uncertainty + +# tsu/th constraints + +# tco constraints + +# tpd constraints + +#************************************************************** +# Time Information +#************************************************************** + +set_time_format -unit ns -decimal_places 3 + + + +#************************************************************** +# Create Clock +#************************************************************** + +create_clock -name {SPI_SCK} -period 41.666 -waveform { 20.8 41.666 } [get_ports {SPI_SCK}] + +#************************************************************** +# Create Generated Clock +#************************************************************** + + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + +#************************************************************** +# Set Input Delay +#************************************************************** + +set_input_delay -add_delay -clock_fall -clock [get_clocks {CLOCK_27}] 1.000 [get_ports {CLOCK_27}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {CONF_DATA0}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DI}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SCK}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS2}] +set_input_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_SS3}] + +set_input_delay -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] -max 6.4 [get_ports SDRAM_DQ[*]] +set_input_delay -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] -min 3.2 [get_ports SDRAM_DQ[*]] + +#************************************************************** +# Set Output Delay +#************************************************************** + +set_output_delay -add_delay -clock_fall -clock [get_clocks {SPI_SCK}] 1.000 [get_ports {SPI_DO}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[1]}] 1.000 [get_ports {AUDIO_L}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[1]}] 1.000 [get_ports {AUDIO_R}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {LED}] +set_output_delay -add_delay -clock_fall -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] 1.000 [get_ports {VGA_*}] + +set_output_delay -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] -max 1.5 [get_ports {SDRAM_D* SDRAM_A* SDRAM_BA* SDRAM_n* SDRAM_CKE}] +set_output_delay -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] -min -0.8 [get_ports {SDRAM_D* SDRAM_A* SDRAM_BA* SDRAM_n* SDRAM_CKE}] +set_output_delay -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] -max 1.5 [get_ports {SDRAM_CLK}] +set_output_delay -clock [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] -min -0.8 [get_ports {SDRAM_CLK}] + +#************************************************************** +# Set Clock Groups +#************************************************************** + +set_clock_groups -asynchronous -group [get_clocks {SPI_SCK}] -group [get_clocks {pll|altpll_component|auto_generated|pll1|clk[*]}] + +#************************************************************** +# Set False Path +#************************************************************** + + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + +set_multicycle_path -to {VGA_*[*]} -setup 2 +set_multicycle_path -to {VGA_*[*]} -hold 1 + +set_multicycle_path -from [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] -to [get_clocks {pll|altpll_component|auto_generated|pll1|clk[1]}] -setup 2 +set_multicycle_path -from [get_clocks {pll|altpll_component|auto_generated|pll1|clk[0]}] -to [get_clocks {pll|altpll_component|auto_generated|pll1|clk[1]}] -hold 1 + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/linux32/duplicate_byte b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/linux32/duplicate_byte new file mode 100755 index 0000000000000000000000000000000000000000..f1dff2e906d91aa6738603764f875c8ed747b330 GIT binary patch literal 7356 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 travusa_cpu.bin +./make_vhdl_prom travusa_cpu.bin travusa_cpu.vhd + +./make_vhdl_prom zippyrac.001 travusa_chr_bit1.vhd +./make_vhdl_prom mr8.3c travusa_chr_bit2.vhd +./make_vhdl_prom mr9.3a travusa_chr_bit3.vhd + +./make_vhdl_prom mmi6349.ij travusa_chr_palette.vhd + +./make_vhdl_prom zippyrac.008 travusa_spr_bit1.vhd +./make_vhdl_prom zippyrac.009 travusa_spr_bit2.vhd +./make_vhdl_prom zippyrac.010 travusa_spr_bit3.vhd + +./make_vhdl_prom tbp24s10.3 travusa_spr_palette.vhd +./make_vhdl_prom tbp18s.2 travusa_spr_rgb_lut.vhd + +./make_vhdl_prom mr10.1a travusa_sound.vhd + +#rem zr1-0.m3 CRC(be066c0a) +#rem zr1-5.l3 CRC(145d6b34) +#rem zr1-6a.k3 CRC(e1b51383) +#rem zr1-7.j3 CRC(85cd1a51) +#rem mr10.1a CRC(a02ad8a0) +#rem zippyrac.001 CRC(aa8994dd) +#rem mr8.3c CRC(3a046dd1) +#rem mr9.3a CRC(1cc3d3f4) +#rem zr1-8.n3 CRC(3e2c7a6b) +#rem zr1-9.l3 CRC(13be6a14) +#rem zr1-10.k3 CRC(6fcc9fdb) +#rem mmi6349.ij CRC(c9724350) +#rem tbp18s.2 CRC(a1130007) +#rem tbp24s10.3 CRC(76062638) diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/linux32/make_vhdl_prom b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/linux32/make_vhdl_prom new file mode 100755 index 0000000000000000000000000000000000000000..a71da100fba9d4d4695507309c652cabe0952e00 GIT binary patch literal 11712 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 literal 0 HcmV?d00001 diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win32/make_travusa_proms.bat b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win32/make_travusa_proms.bat new file mode 100644 index 00000000..ed0a1203 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win32/make_travusa_proms.bat @@ -0,0 +1,32 @@ +copy /B zr1-0.m3 + zr1-5.l3 + zr1-6a.k3 + zr1-7.j3 travusa_cpu.bin +make_vhdl_prom travusa_cpu.bin travusa_cpu.vhd + +make_vhdl_prom zippyrac.001 travusa_chr_bit1.vhd +make_vhdl_prom mr8.3c travusa_chr_bit2.vhd +make_vhdl_prom mr9.3a travusa_chr_bit3.vhd + +make_vhdl_prom mmi6349.ij travusa_chr_palette.vhd + +make_vhdl_prom zr1-8.n3 travusa_spr_bit1.vhd +make_vhdl_prom zr1-9.l3 travusa_spr_bit2.vhd +make_vhdl_prom zr1-10.k3 travusa_spr_bit3.vhd + +make_vhdl_prom tbp24s10.3 travusa_spr_palette.vhd +make_vhdl_prom tbp18s.2 travusa_spr_rgb_lut.vhd + +make_vhdl_prom mr10.1a travusa_sound.vhd + +rem zr1-0.m3 CRC(be066c0a) +rem zr1-5.l3 CRC(145d6b34) +rem zr1-6a.k3 CRC(e1b51383) +rem zr1-7.j3 CRC(85cd1a51) +rem mr10.1a CRC(a02ad8a0) +rem zippyrac.001 CRC(aa8994dd) +rem mr8.3c CRC(3a046dd1) +rem mr9.3a CRC(1cc3d3f4) +rem zr1-8.n3 CRC(3e2c7a6b) +rem zr1-9.l3 CRC(13be6a14) +rem zr1-10.k3 CRC(6fcc9fdb) +rem mmi6349.ij CRC(c9724350) +rem tbp18s.2 CRC(a1130007) +rem tbp24s10.3 CRC(76062638) diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win32/make_vhdl_prom.exe b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win32/make_vhdl_prom.exe new file mode 100644 index 0000000000000000000000000000000000000000..7dd3525d1be82e7c5a342be5560499d6fd15b784 GIT binary patch literal 100636 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 literal 0 HcmV?d00001 diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win64/duplicate_byte.exe b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win64/duplicate_byte.exe new file mode 100644 index 0000000000000000000000000000000000000000..425e90822b2f57da8560b09b172694a3f60cc33b GIT binary patch literal 117095 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 lpY(m?GR)K7P}>N1s;ft6^%!9m$`Dil~% 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 literal 0 HcmV?d00001 diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win64/make_travusa_proms.bat b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win64/make_travusa_proms.bat new file mode 100644 index 00000000..ed0a1203 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win64/make_travusa_proms.bat @@ -0,0 +1,32 @@ +copy /B zr1-0.m3 + zr1-5.l3 + zr1-6a.k3 + zr1-7.j3 travusa_cpu.bin +make_vhdl_prom travusa_cpu.bin travusa_cpu.vhd + +make_vhdl_prom zippyrac.001 travusa_chr_bit1.vhd +make_vhdl_prom mr8.3c travusa_chr_bit2.vhd +make_vhdl_prom mr9.3a travusa_chr_bit3.vhd + +make_vhdl_prom mmi6349.ij travusa_chr_palette.vhd + +make_vhdl_prom zr1-8.n3 travusa_spr_bit1.vhd +make_vhdl_prom zr1-9.l3 travusa_spr_bit2.vhd +make_vhdl_prom zr1-10.k3 travusa_spr_bit3.vhd + +make_vhdl_prom tbp24s10.3 travusa_spr_palette.vhd +make_vhdl_prom tbp18s.2 travusa_spr_rgb_lut.vhd + +make_vhdl_prom mr10.1a travusa_sound.vhd + +rem zr1-0.m3 CRC(be066c0a) +rem zr1-5.l3 CRC(145d6b34) +rem zr1-6a.k3 CRC(e1b51383) +rem zr1-7.j3 CRC(85cd1a51) +rem mr10.1a CRC(a02ad8a0) +rem zippyrac.001 CRC(aa8994dd) +rem mr8.3c CRC(3a046dd1) +rem mr9.3a CRC(1cc3d3f4) +rem zr1-8.n3 CRC(3e2c7a6b) +rem zr1-9.l3 CRC(13be6a14) +rem zr1-10.k3 CRC(6fcc9fdb) +rem mmi6349.ij CRC(c9724350) +rem tbp18s.2 CRC(a1130007) +rem tbp24s10.3 CRC(76062638) diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win64/make_vhdl_prom.exe b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/binaries/win64/make_vhdl_prom.exe new file mode 100644 index 0000000000000000000000000000000000000000..1e5618bf9417eaeb90556e3021a78e9860a815e8 GIT binary patch literal 119861 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 H%=`ZUgl>3))) +user_io( + .clk_sys (clk_sys ), + .conf_str (CONF_STR ), + .SPI_CLK (SPI_SCK ), + .SPI_SS_IO (CONF_DATA0 ), + .SPI_MISO (SPI_DO ), + .SPI_MOSI (SPI_DI ), + .buttons (buttons ), + .switches (switches ), + .scandoubler_disable (scandoublerD ), + .ypbpr (ypbpr ), + .key_strobe (key_strobe ), + .key_pressed (key_pressed ), + .key_code (key_code ), + .joystick_0 (joystick_0 ), + .joystick_1 (joystick_1 ), + .status (status ) + ); + +wire dac_o; +assign AUDIO_L = dac_o; +assign AUDIO_R = dac_o; + +dac #( + .C_bits(11)) +dac( + .clk_i(clk_aud), + .res_n_i(1), + .dac_i(audio), + .dac_o(dac_o) + ); + +// Rotated Normal +wire m_up = ~status[2] ? btn_left | joystick_0[1] | joystick_1[1] : btn_up | joystick_0[3] | joystick_1[3]; +wire m_down = ~status[2] ? btn_right | joystick_0[0] | joystick_1[0] : btn_down | joystick_0[2] | joystick_1[2]; +wire m_left = ~status[2] ? btn_down | joystick_0[2] | joystick_1[2] : btn_left | joystick_0[1] | joystick_1[1]; +wire m_right = ~status[2] ? btn_up | joystick_0[3] | joystick_1[3] : btn_right | joystick_0[0] | joystick_1[0]; +wire m_fire = btn_fire1 | joystick_0[4] | joystick_1[4]; +wire m_bomb = btn_fire2 | joystick_0[5] | joystick_1[5]; + +reg btn_one_player = 0; +reg btn_two_players = 0; +reg btn_left = 0; +reg btn_right = 0; +reg btn_down = 0; +reg btn_up = 0; +reg btn_fire1 = 0; +reg btn_fire2 = 0; +reg btn_fire3 = 0; +reg btn_coin = 0; +wire key_pressed; +wire [7:0] key_code; +wire key_strobe; + +always @(posedge clk_sys) begin + if(key_strobe) begin + case(key_code) + 'h75: btn_up <= key_pressed; // up + 'h72: btn_down <= key_pressed; // down + 'h6B: btn_left <= key_pressed; // left + 'h74: btn_right <= key_pressed; // right + 'h76: btn_coin <= key_pressed; // ESC + 'h05: btn_one_player <= key_pressed; // F1 + 'h06: btn_two_players <= key_pressed; // F2 + 'h14: btn_fire3 <= key_pressed; // ctrl + 'h11: btn_fire2 <= key_pressed; // alt + 'h29: btn_fire1 <= key_pressed; // Space + endcase + end +end + +endmodule diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/YM2149.sv b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/YM2149.sv new file mode 100644 index 00000000..eae73bb3 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/YM2149.sv @@ -0,0 +1,329 @@ +// +// Copyright (c) MikeJ - Jan 2005 +// Copyright (c) 2016-2018 Sorgelig +// +// All rights reserved +// +// Redistribution and use in source and synthezised forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// Redistributions in synthesized form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// Neither the name of the author nor the names of other contributors may +// be used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS CODE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// + + +// BDIR BC MODE +// 0 0 inactive +// 0 1 read value +// 1 0 write value +// 1 1 set address +// + +module YM2149 +( + input CLK, // Global clock + input CE, // PSG Clock enable + input RESET, // Chip RESET (set all Registers to '0', active hi) + input BDIR, // Bus Direction (0 - read , 1 - write) + input BC, // Bus control + input A8, + input A9_L, + input [7:0] DI, // Data In + output [7:0] DO, // Data Out + output [7:0] CHANNEL_A, // PSG Output channel A + output [7:0] CHANNEL_B, // PSG Output channel B + output [7:0] CHANNEL_C, // PSG Output channel C + + input SEL, + input MODE, + + output [5:0] ACTIVE, + + input [7:0] IOA_in, + output [7:0] IOA_out, + + input [7:0] IOB_in, + output [7:0] IOB_out +); + +assign ACTIVE = ~ymreg[7][5:0]; +assign IOA_out = ymreg[7][6] ? ymreg[14] : 8'hff; +assign IOB_out = ymreg[7][7] ? ymreg[15] : 8'hff; + +reg [7:0] addr; +reg [7:0] ymreg[16]; +wire cs = !A9_L & A8; + +// Write to PSG +reg env_reset; +always @(posedge CLK) begin + if(RESET) begin + ymreg <= '{default:0}; + ymreg[7] <= '1; + addr <= '0; + env_reset <= 0; + end else begin + env_reset <= 0; + if(cs & BDIR) begin + if(BC) addr <= DI; + else if(!addr[7:4]) begin + ymreg[addr[3:0]] <= DI; + env_reset <= (addr == 13); + end + end + end +end + +// Read from PSG +assign DO = dout; +reg [7:0] dout; +always_comb begin + dout = 8'hFF; + if(cs & ~BDIR & BC & !addr[7:4]) begin + case(addr[3:0]) + 0: dout = ymreg[0]; + 1: dout = ymreg[1][3:0]; + 2: dout = ymreg[2]; + 3: dout = ymreg[3][3:0]; + 4: dout = ymreg[4]; + 5: dout = ymreg[5][3:0]; + 6: dout = ymreg[6][4:0]; + 7: dout = ymreg[7]; + 8: dout = ymreg[8][4:0]; + 9: dout = ymreg[9][4:0]; + 10: dout = ymreg[10][4:0]; + 11: dout = ymreg[11]; + 12: dout = ymreg[12]; + 13: dout = ymreg[13][3:0]; + 14: dout = ymreg[7][6] ? ymreg[14] : IOA_in; + 15: dout = ymreg[7][7] ? ymreg[15] : IOB_in; + endcase + end +end + +reg ena_div; +reg ena_div_noise; + +// p_divider +always @(posedge CLK) begin + reg [3:0] cnt_div; + reg noise_div; + + if(CE) begin + ena_div <= 0; + ena_div_noise <= 0; + if(!cnt_div) begin + cnt_div <= {SEL, 3'b111}; + ena_div <= 1; + + noise_div <= (~noise_div); + if (noise_div) ena_div_noise <= 1; + end else begin + cnt_div <= cnt_div - 1'b1; + end + end +end + + +reg [2:0] noise_gen_op; + +// p_noise_gen +always @(posedge CLK) begin + reg [16:0] poly17; + reg [4:0] noise_gen_cnt; + + if(CE) begin + if (ena_div_noise) begin + if (!ymreg[6][4:0] || noise_gen_cnt >= ymreg[6][4:0] - 1'd1) begin + noise_gen_cnt <= 0; + poly17 <= {(poly17[0] ^ poly17[2] ^ !poly17), poly17[16:1]}; + end else begin + noise_gen_cnt <= noise_gen_cnt + 1'd1; + end + noise_gen_op <= {3{poly17[0]}}; + end + end +end + +wire [11:0] tone_gen_freq[1:3]; +assign tone_gen_freq[1] = {ymreg[1][3:0], ymreg[0]}; +assign tone_gen_freq[2] = {ymreg[3][3:0], ymreg[2]}; +assign tone_gen_freq[3] = {ymreg[5][3:0], ymreg[4]}; + +reg [3:1] tone_gen_op; + +//p_tone_gens +always @(posedge CLK) begin + integer i; + reg [11:0] tone_gen_cnt[1:3]; + + if(CE) begin + // looks like real chips count up - we need to get the Exact behaviour .. + + for (i = 1; i <= 3; i = i + 1) begin + if(ena_div) begin + if (tone_gen_freq[i]) begin + if (tone_gen_cnt[i] >= (tone_gen_freq[i] - 1'd1)) begin + tone_gen_cnt[i] <= 0; + tone_gen_op[i] <= ~tone_gen_op[i]; + end else begin + tone_gen_cnt[i] <= tone_gen_cnt[i] + 1'd1; + end + end else begin + tone_gen_op[i] <= ymreg[7][i]; + tone_gen_cnt[i] <= 0; + end + end + end + end +end + +reg env_ena; +wire [15:0] env_gen_comp = {ymreg[12], ymreg[11]} ? {ymreg[12], ymreg[11]} - 1'd1 : 16'd0; + +//p_envelope_freq +always @(posedge CLK) begin + reg [15:0] env_gen_cnt; + + if(CE) begin + env_ena <= 0; + if(ena_div) begin + if (env_gen_cnt >= env_gen_comp) begin + env_gen_cnt <= 0; + env_ena <= 1; + end else begin + env_gen_cnt <= (env_gen_cnt + 1'd1); + end + end + end +end + +reg [4:0] env_vol; + +wire is_bot = (env_vol == 5'b00000); +wire is_bot_p1 = (env_vol == 5'b00001); +wire is_top_m1 = (env_vol == 5'b11110); +wire is_top = (env_vol == 5'b11111); + +always @(posedge CLK) begin + reg env_hold; + reg env_inc; + + // envelope shapes + // C AtAlH + // 0 0 x x \___ + // + // 0 1 x x /___ + // + // 1 0 0 0 \\\\ + // + // 1 0 0 1 \___ + // + // 1 0 1 0 \/\/ + // ___ + // 1 0 1 1 \ + // + // 1 1 0 0 //// + // ___ + // 1 1 0 1 / + // + // 1 1 1 0 /\/\ + // + // 1 1 1 1 /___ + + if(env_reset | RESET) begin + // load initial state + if(!ymreg[13][2]) begin // attack + env_vol <= 5'b11111; + env_inc <= 0; // -1 + end else begin + env_vol <= 5'b00000; + env_inc <= 1; // +1 + end + env_hold <= 0; + end + else if(CE) begin + if (env_ena) begin + if (!env_hold) begin + if (env_inc) env_vol <= (env_vol + 5'b00001); + else env_vol <= (env_vol + 5'b11111); + end + + // envelope shape control. + if(!ymreg[13][3]) begin + if(!env_inc) begin // down + if(is_bot_p1) env_hold <= 1; + end else if (is_top) env_hold <= 1; + end else if(ymreg[13][0]) begin // hold = 1 + if(!env_inc) begin // down + if(ymreg[13][1]) begin // alt + if(is_bot) env_hold <= 1; + end else if(is_bot_p1) env_hold <= 1; + end else if(ymreg[13][1]) begin // alt + if(is_top) env_hold <= 1; + end else if(is_top_m1) env_hold <= 1; + end else if(ymreg[13][1]) begin // alternate + if(env_inc == 1'b0) begin // down + if(is_bot_p1) env_hold <= 1; + if(is_bot) begin + env_hold <= 0; + env_inc <= 1; + end + end else begin + if(is_top_m1) env_hold <= 1; + if(is_top) begin + env_hold <= 0; + env_inc <= 0; + end + end + end + end + end +end + +reg [5:0] A,B,C; +always @(posedge CLK) begin + A <= {MODE, ~((ymreg[7][0] | tone_gen_op[1]) & (ymreg[7][3] | noise_gen_op[0])) ? 5'd0 : ymreg[8][4] ? env_vol[4:0] : { ymreg[8][3:0], ymreg[8][3]}}; + B <= {MODE, ~((ymreg[7][1] | tone_gen_op[2]) & (ymreg[7][4] | noise_gen_op[1])) ? 5'd0 : ymreg[9][4] ? env_vol[4:0] : { ymreg[9][3:0], ymreg[9][3]}}; + C <= {MODE, ~((ymreg[7][2] | tone_gen_op[3]) & (ymreg[7][5] | noise_gen_op[2])) ? 5'd0 : ymreg[10][4] ? env_vol[4:0] : {ymreg[10][3:0], ymreg[10][3]}}; +end + +wire [7:0] volTable[64] = '{ + //YM2149 + 8'h00, 8'h01, 8'h01, 8'h02, 8'h02, 8'h03, 8'h03, 8'h04, + 8'h06, 8'h07, 8'h09, 8'h0a, 8'h0c, 8'h0e, 8'h11, 8'h13, + 8'h17, 8'h1b, 8'h20, 8'h25, 8'h2c, 8'h35, 8'h3e, 8'h47, + 8'h54, 8'h66, 8'h77, 8'h88, 8'ha1, 8'hc0, 8'he0, 8'hff, + + //AY8910 + 8'h00, 8'h00, 8'h03, 8'h03, 8'h04, 8'h04, 8'h06, 8'h06, + 8'h0a, 8'h0a, 8'h0f, 8'h0f, 8'h15, 8'h15, 8'h22, 8'h22, + 8'h28, 8'h28, 8'h41, 8'h41, 8'h5b, 8'h5b, 8'h72, 8'h72, + 8'h90, 8'h90, 8'hb5, 8'hb5, 8'hd7, 8'hd7, 8'hff, 8'hff +}; + +assign CHANNEL_A = volTable[A]; +assign CHANNEL_B = volTable[B]; +assign CHANNEL_C = volTable[C]; + +endmodule diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/YM2149_linmix_sep.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/YM2149_linmix_sep.vhd new file mode 100644 index 00000000..6ed2498a --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/YM2149_linmix_sep.vhd @@ -0,0 +1,574 @@ +-- changes for seperate audio outputs and enable now enables cpu access as well +-- +-- A simulation model of YM2149 (AY-3-8910 with bells on) + +-- Copyright (c) MikeJ - Jan 2005 +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS CODE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +-- Clues from MAME sound driver and Kazuhiro TSUJIKAWA +-- +-- These are the measured outputs from a real chip for a single Isolated channel into a 1K load (V) +-- vol 15 .. 0 +-- 3.27 2.995 2.741 2.588 2.452 2.372 2.301 2.258 2.220 2.198 2.178 2.166 2.155 2.148 2.141 2.132 +-- As the envelope volume is 5 bit, I have fitted a curve to the not quite log shape in order +-- to produced all the required values. +-- (The first part of the curve is a bit steeper and the last bit is more linear than expected) +-- +-- NOTE, this component uses LINEAR mixing of the three analogue channels, and is only +-- accurate for designs where the outputs are buffered and not simply wired together. +-- The ouput level is more complex in that case and requires a larger table. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity YM2149 is + port ( + -- data bus + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + O_DA_OE_L : out std_logic; + -- control + I_A9_L : in std_logic; + I_A8 : in std_logic; + I_BDIR : in std_logic; + I_BC2 : in std_logic; + I_BC1 : in std_logic; + I_SEL_L : in std_logic; + + O_AUDIO : out std_logic_vector(7 downto 0); + O_CHAN : out std_logic_vector(1 downto 0); + -- port a + I_IOA : in std_logic_vector(7 downto 0); + O_IOA : out std_logic_vector(7 downto 0); + O_IOA_OE_L : out std_logic; + -- port b + I_IOB : in std_logic_vector(7 downto 0); + O_IOB : out std_logic_vector(7 downto 0); + O_IOB_OE_L : out std_logic; + + ENA : in std_logic; -- clock enable for higher speed operation + RESET_L : in std_logic; + CLK : in std_logic -- note 6 Mhz + ); +end; + +architecture RTL of YM2149 is + type array_16x8 is array (0 to 15) of std_logic_vector( 7 downto 0); + type array_3x12 is array (1 to 3) of std_logic_vector(11 downto 0); + + signal cnt_div : std_logic_vector(3 downto 0) := (others => '0'); + signal cnt_div_t1 : std_logic_vector(3 downto 0); + signal noise_div : std_logic := '0'; + signal ena_div : std_logic; + signal ena_div_noise : std_logic; + signal poly17 : std_logic_vector(16 downto 0) := (others => '0'); + + -- registers + signal addr : std_logic_vector(7 downto 0); + signal busctrl_addr : std_logic; + signal busctrl_we : std_logic; + signal busctrl_re : std_logic; + + signal reg : array_16x8; + signal env_reset : std_logic; + signal ioa_inreg : std_logic_vector(7 downto 0); + signal iob_inreg : std_logic_vector(7 downto 0); + + signal noise_gen_cnt : std_logic_vector(4 downto 0); + signal noise_gen_op : std_logic; + signal tone_gen_cnt : array_3x12 := (others => (others => '0')); + signal tone_gen_op : std_logic_vector(3 downto 1) := "000"; + + signal env_gen_cnt : std_logic_vector(15 downto 0); + signal env_ena : std_logic; + signal env_hold : std_logic; + signal env_inc : std_logic; + signal env_vol : std_logic_vector(4 downto 0); + + signal tone_ena_l : std_logic; + signal tone_src : std_logic; + signal noise_ena_l : std_logic; + signal chan_vol : std_logic_vector(4 downto 0); + + signal dac_amp : std_logic_vector(7 downto 0); +begin + -- cpu i/f + p_busdecode : process(I_BDIR, I_BC2, I_BC1, addr, I_A9_L, I_A8) + variable cs : std_logic; + variable sel : std_logic_vector(2 downto 0); + begin + -- BDIR BC2 BC1 MODE + -- 0 0 0 inactive + -- 0 0 1 address + -- 0 1 0 inactive + -- 0 1 1 read + -- 1 0 0 address + -- 1 0 1 inactive + -- 1 1 0 write + -- 1 1 1 read + busctrl_addr <= '0'; + busctrl_we <= '0'; + busctrl_re <= '0'; + + cs := '0'; + if (I_A9_L = '0') and (I_A8 = '1') and (addr(7 downto 4) = "0000") then + cs := '1'; + end if; + + sel := (I_BDIR & I_BC2 & I_BC1); + case sel is + when "000" => null; + when "001" => busctrl_addr <= '1'; + when "010" => null; + when "011" => busctrl_re <= cs; + when "100" => busctrl_addr <= '1'; + when "101" => null; + when "110" => busctrl_we <= cs; + when "111" => busctrl_addr <= '1'; + when others => null; + end case; + end process; + + p_oe : process(busctrl_re) + begin + -- if we are emulating a real chip, maybe clock this to fake up the tristate typ delay of 100ns + O_DA_OE_L <= not (busctrl_re); + end process; + + -- + -- CLOCKED + -- + p_waddr : process(RESET_L, CLK) + begin + -- looks like registers are latches in real chip, but the address is caught at the end of the address state. + if (RESET_L = '0') then + addr <= (others => '0'); + elsif rising_edge(CLK) then + if (ENA = '1') then + if (busctrl_addr = '1') then + addr <= I_DA; + end if; + end if; + end if; + end process; + + p_wdata : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + reg <= (others => (others => '0')); + env_reset <= '1'; + elsif rising_edge(CLK) then + if (ENA = '1') then + env_reset <= '0'; + if (busctrl_we = '1') then + case addr(3 downto 0) is + when x"0" => reg(0) <= I_DA; + when x"1" => reg(1) <= I_DA; + when x"2" => reg(2) <= I_DA; + when x"3" => reg(3) <= I_DA; + when x"4" => reg(4) <= I_DA; + when x"5" => reg(5) <= I_DA; + when x"6" => reg(6) <= I_DA; + when x"7" => reg(7) <= I_DA; + when x"8" => reg(8) <= I_DA; + when x"9" => reg(9) <= I_DA; + when x"A" => reg(10) <= I_DA; + when x"B" => reg(11) <= I_DA; + when x"C" => reg(12) <= I_DA; + when x"D" => reg(13) <= I_DA; env_reset <= '1'; + when x"E" => reg(14) <= I_DA; + when x"F" => reg(15) <= I_DA; + when others => null; + end case; + end if; + end if; + end if; + end process; + + p_rdata : process(busctrl_re, addr, reg, ioa_inreg, iob_inreg) + begin + O_DA <= (others => '0'); -- 'X' + if (busctrl_re = '1') then -- not necessary, but useful for putting 'X's in the simulator + case addr(3 downto 0) is + when x"0" => O_DA <= reg(0) ; + when x"1" => O_DA <= "0000" & reg(1)(3 downto 0) ; + when x"2" => O_DA <= reg(2) ; + when x"3" => O_DA <= "0000" & reg(3)(3 downto 0) ; + when x"4" => O_DA <= reg(4) ; + when x"5" => O_DA <= "0000" & reg(5)(3 downto 0) ; + when x"6" => O_DA <= "000" & reg(6)(4 downto 0) ; + when x"7" => O_DA <= reg(7) ; + when x"8" => O_DA <= "000" & reg(8)(4 downto 0) ; + when x"9" => O_DA <= "000" & reg(9)(4 downto 0) ; + when x"A" => O_DA <= "000" & reg(10)(4 downto 0) ; + when x"B" => O_DA <= reg(11); + when x"C" => O_DA <= reg(12); + when x"D" => O_DA <= "0000" & reg(13)(3 downto 0); + when x"E" => if (reg(7)(6) = '0') then -- input + O_DA <= ioa_inreg; + else + O_DA <= reg(14); -- read output reg + end if; + when x"F" => if (Reg(7)(7) = '0') then + O_DA <= iob_inreg; + else + O_DA <= reg(15); + end if; + when others => null; + end case; + end if; + end process; + -- + p_divider : process + begin + wait until rising_edge(CLK); + -- / 8 when SEL is high and /16 when SEL is low + if (ENA = '1') then + ena_div <= '0'; + ena_div_noise <= '0'; + if (cnt_div = "0000") then + cnt_div <= (not I_SEL_L) & "111"; + ena_div <= '1'; + + noise_div <= not noise_div; + if (noise_div = '1') then + ena_div_noise <= '1'; + end if; + else + cnt_div <= cnt_div - "1"; + end if; + end if; + end process; + + p_noise_gen : process + variable noise_gen_comp : std_logic_vector(4 downto 0); + variable poly17_zero : std_logic; + begin + wait until rising_edge(CLK); + if (reg(6)(4 downto 0) = "00000") then + noise_gen_comp := "00000"; + else + noise_gen_comp := (reg(6)(4 downto 0) - "1"); + end if; + + poly17_zero := '0'; + if (poly17 = "00000000000000000") then poly17_zero := '1'; end if; + + if (ENA = '1') then + if (ena_div_noise = '1') then -- divider ena + + if (noise_gen_cnt >= noise_gen_comp) then + noise_gen_cnt <= "00000"; + poly17 <= (poly17(0) xor poly17(2) xor poly17_zero) & poly17(16 downto 1); + else + noise_gen_cnt <= (noise_gen_cnt + "1"); + end if; + end if; + end if; + end process; + noise_gen_op <= poly17(0); + + p_tone_gens : process + variable tone_gen_freq : array_3x12; + variable tone_gen_comp : array_3x12; + begin + wait until rising_edge(CLK); + -- looks like real chips count up - we need to get the Exact behaviour .. + tone_gen_freq(1) := reg(1)(3 downto 0) & reg(0); + tone_gen_freq(2) := reg(3)(3 downto 0) & reg(2); + tone_gen_freq(3) := reg(5)(3 downto 0) & reg(4); + -- period 0 = period 1 + for i in 1 to 3 loop + if (tone_gen_freq(i) = x"000") then + tone_gen_comp(i) := x"000"; + else + tone_gen_comp(i) := (tone_gen_freq(i) - "1"); + end if; + end loop; + + if (ENA = '1') then + for i in 1 to 3 loop + if (ena_div = '1') then -- divider ena + + if (tone_gen_cnt(i) >= tone_gen_comp(i)) then + tone_gen_cnt(i) <= x"000"; + tone_gen_op(i) <= not tone_gen_op(i); + else + tone_gen_cnt(i) <= (tone_gen_cnt(i) + "1"); + end if; + end if; + end loop; + end if; + end process; + + p_envelope_freq : process + variable env_gen_freq : std_logic_vector(15 downto 0); + variable env_gen_comp : std_logic_vector(15 downto 0); + begin + wait until rising_edge(CLK); + env_gen_freq := reg(12) & reg(11); + -- envelope freqs 1 and 0 are the same. + if (env_gen_freq = x"0000") then + env_gen_comp := x"0000"; + else + env_gen_comp := (env_gen_freq - "1"); + end if; + + if (ENA = '1') then + env_ena <= '0'; + if (ena_div = '1') then -- divider ena + if (env_gen_cnt >= env_gen_comp) then + env_gen_cnt <= x"0000"; + env_ena <= '1'; + else + env_gen_cnt <= (env_gen_cnt + "1"); + end if; + end if; + end if; + end process; + + p_envelope_shape : process(env_reset, reg, CLK) + variable is_bot : boolean; + variable is_bot_p1 : boolean; + variable is_top_m1 : boolean; + variable is_top : boolean; + begin + -- envelope shapes + -- C AtAlH + -- 0 0 x x \___ + -- + -- 0 1 x x /___ + -- + -- 1 0 0 0 \\\\ + -- + -- 1 0 0 1 \___ + -- + -- 1 0 1 0 \/\/ + -- ___ + -- 1 0 1 1 \ + -- + -- 1 1 0 0 //// + -- ___ + -- 1 1 0 1 / + -- + -- 1 1 1 0 /\/\ + -- + -- 1 1 1 1 /___ + if (env_reset = '1') then + -- load initial state + if (reg(13)(2) = '0') then -- attack + env_vol <= "11111"; + env_inc <= '0'; -- -1 + else + env_vol <= "00000"; + env_inc <= '1'; -- +1 + end if; + env_hold <= '0'; + + elsif rising_edge(CLK) then + is_bot := (env_vol = "00000"); + is_bot_p1 := (env_vol = "00001"); + is_top_m1 := (env_vol = "11110"); + is_top := (env_vol = "11111"); + + if (ENA = '1') then + if (env_ena = '1') then + if (env_hold = '0') then + if (env_inc = '1') then + env_vol <= (env_vol + "00001"); + else + env_vol <= (env_vol + "11111"); + end if; + end if; + + -- envelope shape control. + if (reg(13)(3) = '0') then + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + else + if is_top then env_hold <= '1'; end if; + end if; + else + if (reg(13)(0) = '1') then -- hold = 1 + if (env_inc = '0') then -- down + if (reg(13)(1) = '1') then -- alt + if is_bot then env_hold <= '1'; end if; + else + if is_bot_p1 then env_hold <= '1'; end if; + end if; + else + if (reg(13)(1) = '1') then -- alt + if is_top then env_hold <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + end if; + end if; + + elsif (reg(13)(1) = '1') then -- alternate + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + if is_bot then env_hold <= '0'; env_inc <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + if is_top then env_hold <= '0'; env_inc <= '0'; end if; + end if; + end if; + + end if; + end if; + end if; + end if; + end process; + + p_chan_mixer : process(cnt_div, reg, tone_gen_op) + begin + tone_ena_l <= '1'; tone_src <= '1'; + noise_ena_l <= '1'; chan_vol <= "00000"; + case cnt_div(1 downto 0) is + when "00" => + tone_ena_l <= reg(7)(0); tone_src <= tone_gen_op(1); chan_vol <= reg(8)(4 downto 0); + noise_ena_l <= reg(7)(3); + when "01" => + tone_ena_l <= reg(7)(1); tone_src <= tone_gen_op(2); chan_vol <= reg(9)(4 downto 0); + noise_ena_l <= reg(7)(4); + when "10" => + tone_ena_l <= reg(7)(2); tone_src <= tone_gen_op(3); chan_vol <= reg(10)(4 downto 0); + noise_ena_l <= reg(7)(5); + when "11" => null; -- tone gen outputs become valid on this clock + when others => null; + end case; + end process; + + p_op_mixer : process + variable chan_mixed : std_logic; + variable chan_amp : std_logic_vector(4 downto 0); + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + chan_mixed := (tone_ena_l or tone_src) and (noise_ena_l or noise_gen_op); + + chan_amp := (others => '0'); + if (chan_mixed = '1') then + if (chan_vol(4) = '0') then + if (chan_vol(3 downto 0) = "0000") then -- nothing is easy ! make sure quiet is quiet + chan_amp := "00000"; + else + chan_amp := chan_vol(3 downto 0) & '1'; -- make sure level 31 (env) = level 15 (tone) + end if; + else + chan_amp := env_vol(4 downto 0); + end if; + end if; + + dac_amp <= x"00"; + case chan_amp is + when "11111" => dac_amp <= x"FF"; + when "11110" => dac_amp <= x"D9"; + when "11101" => dac_amp <= x"BA"; + when "11100" => dac_amp <= x"9F"; + when "11011" => dac_amp <= x"88"; + when "11010" => dac_amp <= x"74"; + when "11001" => dac_amp <= x"63"; + when "11000" => dac_amp <= x"54"; + when "10111" => dac_amp <= x"48"; + when "10110" => dac_amp <= x"3D"; + when "10101" => dac_amp <= x"34"; + when "10100" => dac_amp <= x"2C"; + when "10011" => dac_amp <= x"25"; + when "10010" => dac_amp <= x"1F"; + when "10001" => dac_amp <= x"1A"; + when "10000" => dac_amp <= x"16"; + when "01111" => dac_amp <= x"13"; + when "01110" => dac_amp <= x"10"; + when "01101" => dac_amp <= x"0D"; + when "01100" => dac_amp <= x"0B"; + when "01011" => dac_amp <= x"09"; + when "01010" => dac_amp <= x"08"; + when "01001" => dac_amp <= x"07"; + when "01000" => dac_amp <= x"06"; + when "00111" => dac_amp <= x"05"; + when "00110" => dac_amp <= x"04"; + when "00101" => dac_amp <= x"03"; + when "00100" => dac_amp <= x"03"; + when "00011" => dac_amp <= x"02"; + when "00010" => dac_amp <= x"02"; + when "00001" => dac_amp <= x"01"; + when "00000" => dac_amp <= x"00"; + when others => null; + end case; + + cnt_div_t1 <= cnt_div; + end if; + end process; + + p_audio_output : process(RESET_L, CLK) + begin + if (RESET_L = '0') then + O_AUDIO <= (others => '0'); + O_CHAN <= (others => '0'); + elsif rising_edge(CLK) then + + if (ENA = '1') then + O_AUDIO <= dac_amp(7 downto 0); + O_CHAN <= cnt_div_t1(1 downto 0); + end if; + end if; + end process; + + p_io_ports : process(reg) + begin + O_IOA <= reg(14); + O_IOA_OE_L <= not reg(7)(6); + O_IOB <= reg(15); + O_IOB_OE_L <= not reg(7)(7); + end process; + + p_io_ports_inreg : process + begin + wait until rising_edge(CLK); + if (ENA = '1') then -- resync + ioa_inreg <= I_IOA; + iob_inreg <= I_IOB; + end if; + end process; +end architecture RTL; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/build_id.tcl b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/build_id.tcl new file mode 100644 index 00000000..938515d8 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/build_id.tcl @@ -0,0 +1,35 @@ +# ================================================================================ +# +# Build ID Verilog Module Script +# Jeff Wiencrot - 8/1/2011 +# +# Generates a Verilog module that contains a timestamp, +# from the current build. These values are available from the build_date, build_time, +# physical_address, and host_name output ports of the build_id module in the build_id.v +# Verilog source file. +# +# ================================================================================ + +proc generateBuildID_Verilog {} { + + # Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html) + set buildDate [ clock format [ clock seconds ] -format %y%m%d ] + set buildTime [ clock format [ clock seconds ] -format %H%M%S ] + + # Create a Verilog file for output + set outputFileName "rtl/build_id.v" + set outputFile [open $outputFileName "w"] + + # Output the Verilog source + puts $outputFile "`define BUILD_DATE \"$buildDate\"" + puts $outputFile "`define BUILD_TIME \"$buildTime\"" + close $outputFile + + # Send confirmation message to the Messages window + post_message "Generated build identification Verilog module: [pwd]/$outputFileName" + post_message "Date: $buildDate" + post_message "Time: $buildTime" +} + +# Comment out this line to prevent the process from automatically executing when the file is sourced: +generateBuildID_Verilog \ No newline at end of file diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/cpu09l_128.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/cpu09l_128.vhd new file mode 100644 index 00000000..12039bde --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/cpu09l_128.vhd @@ -0,0 +1,5906 @@ +--===========================================================================-- +-- -- +-- Synthesizable 6809 instruction compatible VHDL CPU core -- +-- -- +--===========================================================================-- +-- +-- File name : cpu09l.vhd +-- +-- Entity name : cpu09 +-- +-- Purpose : 6809 instruction compatible CPU core written in VHDL +-- with Last Instruction Cycle, bus available, bus status, +-- and instruction fetch signals. +-- Not cycle compatible with the original 6809 CPU +-- +-- Dependencies : ieee.std_logic_1164 +-- ieee.std_logic_unsigned +-- +-- Author : John E. Kent +-- +-- Email : dilbert57@opencores.org +-- +-- Web : http://opencores.org/project,system09 +-- +-- Description : VMA (valid memory address) is hight whenever a valid memory +-- access is made by an instruction fetch, interrupt vector fetch +-- or a data read or write otherwise it is low indicating an idle +-- bus cycle. +-- IFETCH (instruction fetch output) is high whenever an +-- instruction byte is read i.e. the program counter is applied +-- to the address bus. +-- LIC (last instruction cycle output) is normally low +-- but goes high on the last cycle of an instruction. +-- BA (bus available output) is normally low but goes high while +-- waiting in a Sync instruction state or the CPU is halted +-- i.e. a DMA grant. +-- BS (bus status output) is normally low but goes high during an +-- interrupt or reset vector fetch or the processor is halted +-- i.e. a DMA grant. +-- +-- Copyright (C) 2003 - 2010 John Kent +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +--===========================================================================-- +-- -- +-- Revision History -- +-- -- +--===========================================================================-- +-- +-- Version 0.1 - 26 June 2003 - John Kent +-- Added extra level in state stack +-- fixed some calls to the extended addressing state +-- +-- Version 0.2 - 5 Sept 2003 - John Kent +-- Fixed 16 bit indexed offset (was doing read rather than fetch) +-- Added/Fixed STY and STS instructions. +-- ORCC_STATE ANDed CC state rather than ORed it - Now fixed +-- CMPX Loaded ACCA and ACCB - Now fixed +-- +-- Version 1.0 - 6 Sep 2003 - John Kent +-- Initial release to Open Cores +-- reversed clock edge +-- +-- Version 1.1 - 29 November 2003 John kent +-- ACCA and ACCB indexed offsets are 2's complement. +-- ALU Right Mux now sign extends ACCA & ACCB offsets +-- Absolute Indirect addressing performed a read on the +-- second byte of the address rather than a fetch +-- so it formed an incorrect address. Now fixed. +-- +-- Version 1.2 - 29 November 2003 John Kent +-- LEAX and LEAY affect the Z bit only +-- LEAS and LEAU do not affect any condition codes +-- added an extra ALU control for LEA. +-- +-- Version 1.3 - 12 December 2003 John Kent +-- CWAI did not work, was missed a PUSH_ST on calling +-- the ANDCC_STATE. Thanks go to Ghassan Kraidy for +-- finding this fault. +-- +-- Version 1.4 - 12 December 2003 John Kent +-- Missing cc_ctrl assignment in otherwise case of +-- lea_state resulted in cc_ctrl being latched in +-- that state. +-- The otherwise statement should never be reached, +-- and has been fixed simply to resolve synthesis warnings. +-- +-- Version 1.5 - 17 january 2004 John kent +-- The clear instruction used "alu_ld8" to control the ALU +-- rather than "alu_clr". This mean the Carry was not being +-- cleared correctly. +-- +-- Version 1.6 - 24 January 2004 John Kent +-- Fixed problems in PSHU instruction +-- +-- Version 1.7 - 25 January 2004 John Kent +-- removed redundant "alu_inx" and "alu_dex' +-- Removed "test_alu" and "test_cc" +-- STD instruction did not set condition codes +-- JMP direct was not decoded properly +-- CLR direct performed an unwanted read cycle +-- Bogus "latch_md" in Page2 indexed addressing +-- +-- Version 1.8 - 27 January 2004 John Kent +-- CWAI in decode1_state should increment the PC. +-- ABX is supposed to be an unsigned addition. +-- Added extra ALU function +-- ASR8 slightly changed in the ALU. +-- +-- Version 1.9 - 20 August 2005 +-- LSR8 is now handled in ASR8 and ROR8 case in the ALU, +-- rather than LSR16. There was a problem with single +-- operand instructions using the MD register which is +-- sign extended on the first 8 bit fetch. +-- +-- Version 1.10 - 13 September 2005 +-- TFR & EXG instructions did not work for the Condition Code Register +-- An extra case has been added to the ALU for the alu_tfr control +-- to assign the left ALU input (alu_left) to the condition code +-- outputs (cc_out). +-- +-- Version 1.11 - 16 September 2005 +-- JSR ,X should not predecrement S before calculating the jump address. +-- The reason is that JSR [0,S] needs S to point to the top of the stack +-- to fetch a valid vector address. The solution is to have the addressing +-- mode microcode called before decrementing S and then decrementing S in +-- JSR_STATE. JSR_STATE in turn calls PUSH_RETURN_LO_STATE rather than +-- PUSH_RETURN_HI_STATE so that both the High & Low halves of the PC are +-- pushed on the stack. This adds one extra bus cycle, but resolves the +-- addressing conflict. I've also removed the pre-decement S in +-- JSR EXTENDED as it also calls JSR_STATE. +-- +-- Version 1.12 - 6th June 2006 +-- 6809 Programming reference manual says V is not affected by ASR, LSR and ROR +-- This is different to the 6800. CLR should reset the V bit. +-- +-- Version 1.13 - 7th July 2006 +-- Disable NMI on reset until S Stack pointer has been loaded. +-- Added nmi_enable signal in sp_reg process and nmi_handler process. +-- +-- Version 1.14 - 11th July 2006 +-- 1. Added new state to RTI called rti_entire_state. +-- This state tests the CC register after it has been loaded +-- from the stack. Previously the current CC was tested which +-- was incorrect. The Entire Flag should be set before the +-- interrupt stacks the CC. +-- 2. On bogus Interrupts, int_cc_state went to rti_state, +-- which was an enumerated state, but not defined anywhere. +-- rti_state has been changed to rti_cc_state so that bogus interrupt +-- will perform an RTI after entering that state. +-- 3. Sync should generate an interrupt if the interrupt masks +-- are cleared. If the interrupt masks are set, then an interrupt +-- will cause the the PC to advance to the next instruction. +-- Note that I don't wait for an interrupt to be asserted for +-- three clock cycles. +-- 4. Added new ALU control state "alu_mul". "alu_mul" is used in +-- the Multiply instruction replacing "alu_add16". This is similar +-- to "alu_add16" except it sets the Carry bit to B7 of the result +-- in ACCB, sets the Zero bit if the 16 bit result is zero, but +-- does not affect The Half carry (H), Negative (N) or Overflow (V) +-- flags. The logic was re-arranged so that it adds md or zero so +-- that the Carry condition code is set on zero multiplicands. +-- 5. DAA (Decimal Adjust Accumulator) should set the Negative (N) +-- and Zero Flags. It will also affect the Overflow (V) flag although +-- the operation is undefined. It's anyones guess what DAA does to V. +-- +-- Version 1.15 - 25th Feb 2007 - John Kent +-- line 9672 changed "if Halt <= '1' then" to "if Halt = '1' then" +-- Changed sensitivity lists. +-- +-- Version 1.16 - 5th February 2008 - John Kent +-- FIRQ interrupts should take priority over IRQ Interrupts. +-- This presumably means they should be tested for before IRQ +-- when they happen concurrently. +-- +-- Version 1.17 - 18th February 2008 - John Kent +-- NMI in CWAI should mask IRQ and FIRQ interrupts +-- +-- Version 1.18 - 21st February 2008 - John Kent +-- Removed default register settings in each case statement +-- and placed them at the beginning of the state sequencer. +-- Modified the SYNC instruction so that the interrupt vector(iv) +-- is not set unless an unmasked FIRQ or IRQ is received. +-- +-- Version 1.19 - 25th February 2008 - John Kent +-- Enumerated separate states for FIRQ/FAST and NMIIRQ/ENTIRE +-- Enumerated separate states for MASKI and MASKIF states +-- Removed code on BSR/JSR in fetch cycle +-- +-- Version 1.20 - 8th October 2011 - John Kent +-- added fetch output which should go high during the fetch cycle +-- +-- Version 1.21 - 8th October 2011 - John Kent +-- added Last Instruction Cycle signal +-- replaced fetch with ifetch (instruction fetch) signal +-- added ba & bs (bus available & bus status) signals +-- +-- Version 1.22 - 2011-10-29 John Kent +-- The halt state isn't correct. +-- The halt state is entered into from the fetch_state +-- It returned to the fetch state which may re-run an execute cycle +-- on the accumulator and it won't necessarily be the last instruction cycle +-- I've changed the halt state to return to the decode1_state +-- +-- Version 1.23 - 2011-10-30 John Kent +-- sample halt in the change_state process if lic is high (last instruction cycle) +-- +-- Version 1.24 - 2011-11-01 John Kent +-- Handle interrupts in change_state process +-- Sample interrupt inputs on last instruction cycle +-- Remove iv_ctrl and implement iv (interrupt vector) in change_state process. +-- Generate fic (first instruction cycle) from lic (last instruction cycle) +-- and use it to complete the dual operand execute cycle before servicing +-- halt or interrupts requests. +-- rename lic to lic_out on the entity declaration so that lic can be tested internally. +-- add int_firq1_state and int_nmirq1_state to allow for the dual operand execute cycle +-- integrated nmi_ctrl into change_state process +-- Reduces the microcode state stack to one entry (saved_state) +-- imm16_state jumps directly to the fetch_state +-- pull_return_lo states jumps directly to the fetch_state +-- duplicate andcc_state as cwai_state +-- rename exg1_state as exg2 state and duplicate tfr_state as exg1_state +-- +-- Version 1.25 - 2011-11-27 John Kent +-- Changed the microcode for saving registers on an interrupt into a microcode subroutine. +-- Removed SWI servicing from the change state process and made SWI, SWI2 & SWI3 +-- call the interrupt microcode subroutine. +-- Added additional states for nmi, and irq for interrupt servicing. +-- Added additional states for nmi/irq, firq, and swi interrupts to mask I & F flags. +-- +-- Version 1.26 - 2013-03-18 John Kent +-- pre-initialized cond_true variable to true in state sequencer +-- re-arranged change_state process slightly +-- +-- Version 1.27 - 2015-05-30 John Kent +-- Added test in state machine for masked IRQ and FIRQ in Sync_state. +-- +-- Version 1.28 - 2015-05-30 John Kent. +-- Moved IRQ and FIRQ test from state machine to the state sequencer Sync_state. +-- +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; + +entity cpu09 is + port ( + clk : in std_logic; -- E clock input (falling edge) + rst : in std_logic; -- reset input (active high) + vma : out std_logic; -- valid memory address (active high) + lic_out : out std_logic; -- last instruction cycle (active high) + ifetch : out std_logic; -- instruction fetch cycle (active high) + opfetch : out std_logic; -- opcode fetch (active high) + ba : out std_logic; -- bus available (high on sync wait or DMA grant) + bs : out std_logic; -- bus status (high on interrupt or reset vector fetch or DMA grant) + addr : out std_logic_vector(15 downto 0); -- address bus output + rw : out std_logic; -- read not write output + data_out : out std_logic_vector(7 downto 0); -- data bus output + data_in : in std_logic_vector(7 downto 0); -- data bus input + irq : in std_logic; -- interrupt request input (active high) + firq : in std_logic; -- fast interrupt request input (active high) + nmi : in std_logic; -- non maskable interrupt request input (active high) + halt : in std_logic; -- halt input (active high) grants DMA + hold : in std_logic -- hold input (active high) extend bus cycle + ); +end cpu09; + +architecture rtl of cpu09 is + + constant EBIT : integer := 7; + constant FBIT : integer := 6; + constant HBIT : integer := 5; + constant IBIT : integer := 4; + constant NBIT : integer := 3; + constant ZBIT : integer := 2; + constant VBIT : integer := 1; + constant CBIT : integer := 0; + + -- + -- Interrupt vector modifiers + -- + constant RST_VEC : std_logic_vector(2 downto 0) := "111"; + constant NMI_VEC : std_logic_vector(2 downto 0) := "110"; + constant SWI_VEC : std_logic_vector(2 downto 0) := "101"; + constant IRQ_VEC : std_logic_vector(2 downto 0) := "100"; + constant FIRQ_VEC : std_logic_vector(2 downto 0) := "011"; + constant SWI2_VEC : std_logic_vector(2 downto 0) := "010"; + constant SWI3_VEC : std_logic_vector(2 downto 0) := "001"; + constant RESV_VEC : std_logic_vector(2 downto 0) := "000"; + + type state_type is (-- Start off in Reset + reset_state, + -- Fetch Interrupt Vectors (including reset) + vect_lo_state, vect_hi_state, vect_idle_state, + -- Fetch Instruction Cycle + fetch_state, + -- Decode Instruction Cycles + decode1_state, decode2_state, decode3_state, + -- Calculate Effective Address + imm16_state, + indexed_state, index8_state, index16_state, index16_2_state, + pcrel8_state, pcrel16_state, pcrel16_2_state, + indexaddr_state, indexaddr2_state, + postincr1_state, postincr2_state, + indirect_state, indirect2_state, indirect3_state, + extended_state, + -- single ops + single_op_read_state, + single_op_exec_state, + single_op_write_state, + -- Dual op states + dual_op_read8_state, dual_op_read16_state, dual_op_read16_2_state, + dual_op_write8_state, dual_op_write16_state, + -- + sync_state, halt_state, cwai_state, + -- + andcc_state, orcc_state, + tfr_state, + exg_state, exg1_state, exg2_state, + lea_state, + -- Multiplication + mul_state, mulea_state, muld_state, + mul0_state, mul1_state, mul2_state, mul3_state, + mul4_state, mul5_state, mul6_state, mul7_state, + -- Branches + lbranch_state, sbranch_state, + -- Jumps, Subroutine Calls and Returns + jsr_state, jmp_state, + push_return_hi_state, push_return_lo_state, + pull_return_hi_state, pull_return_lo_state, + -- Interrupt cycles + int_nmi_state, int_nmi1_state, + int_irq_state, int_irq1_state, + int_firq_state, int_firq1_state, + int_entire_state, int_fast_state, + int_pcl_state, int_pch_state, + int_upl_state, int_uph_state, + int_iyl_state, int_iyh_state, + int_ixl_state, int_ixh_state, + int_dp_state, + int_accb_state, int_acca_state, + int_cc_state, + int_cwai_state, + int_nmimask_state, int_firqmask_state, int_swimask_state, int_irqmask_state, + -- Return From Interrupt + rti_cc_state, rti_entire_state, + rti_acca_state, rti_accb_state, + rti_dp_state, + rti_ixl_state, rti_ixh_state, + rti_iyl_state, rti_iyh_state, + rti_upl_state, rti_uph_state, + rti_pcl_state, rti_pch_state, + -- Push Registers using SP + pshs_state, + pshs_pcl_state, pshs_pch_state, + pshs_upl_state, pshs_uph_state, + pshs_iyl_state, pshs_iyh_state, + pshs_ixl_state, pshs_ixh_state, + pshs_dp_state, + pshs_acca_state, pshs_accb_state, + pshs_cc_state, + -- Pull Registers using SP + puls_state, + puls_cc_state, + puls_acca_state, puls_accb_state, + puls_dp_state, + puls_ixl_state, puls_ixh_state, + puls_iyl_state, puls_iyh_state, + puls_upl_state, puls_uph_state, + puls_pcl_state, puls_pch_state, + -- Push Registers using UP + pshu_state, + pshu_pcl_state, pshu_pch_state, + pshu_spl_state, pshu_sph_state, + pshu_iyl_state, pshu_iyh_state, + pshu_ixl_state, pshu_ixh_state, + pshu_dp_state, + pshu_acca_state, pshu_accb_state, + pshu_cc_state, + -- Pull Registers using UP + pulu_state, + pulu_cc_state, + pulu_acca_state, pulu_accb_state, + pulu_dp_state, + pulu_ixl_state, pulu_ixh_state, + pulu_iyl_state, pulu_iyh_state, + pulu_spl_state, pulu_sph_state, + pulu_pcl_state, pulu_pch_state ); + + type st_type is (reset_st, push_st, idle_st ); + type iv_type is (latch_iv, swi3_iv, swi2_iv, firq_iv, irq_iv, swi_iv, nmi_iv, reset_iv); + type addr_type is (idle_ad, fetch_ad, read_ad, write_ad, pushu_ad, pullu_ad, pushs_ad, pulls_ad, int_hi_ad, int_lo_ad ); + type dout_type is (cc_dout, acca_dout, accb_dout, dp_dout, + ix_lo_dout, ix_hi_dout, iy_lo_dout, iy_hi_dout, + up_lo_dout, up_hi_dout, sp_lo_dout, sp_hi_dout, + pc_lo_dout, pc_hi_dout, md_lo_dout, md_hi_dout ); + type op_type is (reset_op, fetch_op, latch_op ); + type pre_type is (reset_pre, fetch_pre, latch_pre ); + type cc_type is (reset_cc, load_cc, pull_cc, latch_cc ); + type acca_type is (reset_acca, load_acca, load_hi_acca, pull_acca, latch_acca ); + type accb_type is (reset_accb, load_accb, pull_accb, latch_accb ); + type dp_type is (reset_dp, load_dp, pull_dp, latch_dp ); + type ix_type is (reset_ix, load_ix, pull_lo_ix, pull_hi_ix, latch_ix ); + type iy_type is (reset_iy, load_iy, pull_lo_iy, pull_hi_iy, latch_iy ); + type sp_type is (reset_sp, latch_sp, load_sp, pull_hi_sp, pull_lo_sp ); + type up_type is (reset_up, latch_up, load_up, pull_hi_up, pull_lo_up ); + type pc_type is (reset_pc, latch_pc, load_pc, pull_lo_pc, pull_hi_pc, incr_pc ); + type md_type is (reset_md, latch_md, load_md, fetch_first_md, fetch_next_md, shiftl_md ); + type ea_type is (reset_ea, latch_ea, load_ea, fetch_first_ea, fetch_next_ea ); + type left_type is (cc_left, acca_left, accb_left, dp_left, + ix_left, iy_left, up_left, sp_left, + accd_left, md_left, pc_left, ea_left ); + type right_type is (ea_right, zero_right, one_right, two_right, + acca_right, accb_right, accd_right, + md_right, md_sign5_right, md_sign8_right ); + type alu_type is (alu_add8, alu_sub8, alu_add16, alu_sub16, alu_adc, alu_sbc, + alu_and, alu_ora, alu_eor, + alu_tst, alu_inc, alu_dec, alu_clr, alu_neg, alu_com, + alu_lsr16, alu_lsl16, + alu_ror8, alu_rol8, alu_mul, + alu_asr8, alu_asl8, alu_lsr8, + alu_andcc, alu_orcc, alu_sex, alu_tfr, alu_abx, + alu_seif, alu_sei, alu_see, alu_cle, + alu_ld8, alu_st8, alu_ld16, alu_st16, alu_lea, alu_nop, alu_daa ); + + signal op_code: std_logic_vector(7 downto 0); + signal pre_code: std_logic_vector(7 downto 0); + signal acca: std_logic_vector(7 downto 0); + signal accb: std_logic_vector(7 downto 0); + signal cc: std_logic_vector(7 downto 0); + signal cc_out: std_logic_vector(7 downto 0); + signal dp: std_logic_vector(7 downto 0); + signal xreg: std_logic_vector(15 downto 0); + signal yreg: std_logic_vector(15 downto 0); + signal sp: std_logic_vector(15 downto 0); + signal up: std_logic_vector(15 downto 0); + signal ea: std_logic_vector(15 downto 0); + signal pc: std_logic_vector(15 downto 0); + signal md: std_logic_vector(15 downto 0); + signal left: std_logic_vector(15 downto 0); + signal right: std_logic_vector(15 downto 0); + signal out_alu: std_logic_vector(15 downto 0); + signal iv: std_logic_vector(2 downto 0); + signal nmi_req: std_logic; + signal nmi_ack: std_logic; + signal nmi_enable: std_logic; + signal fic: std_logic; -- first instruction cycle + signal lic: std_logic; -- last instruction cycle + + signal state: state_type; + signal next_state: state_type; + signal return_state: state_type; + signal saved_state: state_type; + signal st_ctrl: st_type; + signal iv_ctrl: iv_type; + signal pc_ctrl: pc_type; + signal ea_ctrl: ea_type; + signal op_ctrl: op_type; + signal pre_ctrl: pre_type; + signal md_ctrl: md_type; + signal acca_ctrl: acca_type; + signal accb_ctrl: accb_type; + signal ix_ctrl: ix_type; + signal iy_ctrl: iy_type; + signal cc_ctrl: cc_type; + signal dp_ctrl: dp_type; + signal sp_ctrl: sp_type; + signal up_ctrl: up_type; + signal left_ctrl: left_type; + signal right_ctrl: right_type; + signal alu_ctrl: alu_type; + signal addr_ctrl: addr_type; + signal dout_ctrl: dout_type; + + +begin + +---------------------------------- +-- +-- State machine stack +-- +---------------------------------- +--state_stack_proc: process( clk, hold, state_stack, st_ctrl, +-- return_state, fetch_state ) +state_stack_proc: process( clk, st_ctrl, return_state ) +begin + if clk'event and clk = '0' then + if hold = '0' then + case st_ctrl is + when reset_st => + saved_state <= fetch_state; + when push_st => + saved_state <= return_state; + when others => + null; + end case; + end if; + end if; +end process; + +---------------------------------- +-- +-- Interrupt Vector control +-- +---------------------------------- +-- +int_vec_proc: process( clk, iv_ctrl ) +begin + if clk'event and clk = '0' then + if hold = '0' then + case iv_ctrl is + when reset_iv => + iv <= RST_VEC; + when nmi_iv => + iv <= NMI_VEC; + when swi_iv => + iv <= SWI_VEC; + when irq_iv => + iv <= IRQ_VEC; + when firq_iv => + iv <= FIRQ_VEC; + when swi2_iv => + iv <= SWI2_VEC; + when swi3_iv => + iv <= SWI3_VEC; + when others => + null; + end case; + end if; -- hold + end if; -- clk +end process; + +---------------------------------- +-- +-- Program Counter Control +-- +---------------------------------- + +--pc_reg: process( clk, pc_ctrl, hold, pc, out_alu, data_in ) +pc_reg: process( clk ) +begin + if clk'event and clk = '0' then + if hold = '0' then + case pc_ctrl is + when reset_pc => + pc <= (others=>'0'); + when load_pc => + pc <= out_alu(15 downto 0); + when pull_lo_pc => + pc(7 downto 0) <= data_in; + when pull_hi_pc => + pc(15 downto 8) <= data_in; + when incr_pc => + pc <= pc + 1; + when others => + null; + end case; + end if; + end if; +end process; + +---------------------------------- +-- +-- Effective Address Control +-- +---------------------------------- + +--ea_reg: process( clk, ea_ctrl, hold, ea, out_alu, data_in, dp ) +ea_reg: process( clk ) +begin + + if clk'event and clk = '0' then + if hold= '0' then + case ea_ctrl is + when reset_ea => + ea <= (others=>'0'); + when fetch_first_ea => + ea(7 downto 0) <= data_in; + ea(15 downto 8) <= dp; + when fetch_next_ea => + ea(15 downto 8) <= ea(7 downto 0); + ea(7 downto 0) <= data_in; + when load_ea => + ea <= out_alu(15 downto 0); + when others => + null; + end case; + end if; + end if; +end process; + +-------------------------------- +-- +-- Accumulator A +-- +-------------------------------- +--acca_reg : process( clk, acca_ctrl, hold, out_alu, acca, data_in ) +acca_reg : process( clk ) +begin + if clk'event and clk = '0' then + if hold = '0' then + case acca_ctrl is + when reset_acca => + acca <= (others=>'0'); + when load_acca => + acca <= out_alu(7 downto 0); + when load_hi_acca => + acca <= out_alu(15 downto 8); + when pull_acca => + acca <= data_in; + when others => + null; + end case; + end if; + end if; +end process; + +-------------------------------- +-- +-- Accumulator B +-- +-------------------------------- +--accb_reg : process( clk, accb_ctrl, hold, out_alu, accb, data_in ) +accb_reg : process( clk ) +begin + if clk'event and clk = '0' then + if hold = '0' then + case accb_ctrl is + when reset_accb => + accb <= (others=>'0'); + when load_accb => + accb <= out_alu(7 downto 0); + when pull_accb => + accb <= data_in; + when others => + null; + end case; + end if; + end if; +end process; + +-------------------------------- +-- +-- X Index register +-- +-------------------------------- +--ix_reg : process( clk, ix_ctrl, hold, out_alu, xreg, data_in ) +ix_reg : process( clk ) +begin + if clk'event and clk = '0' then + if hold = '0' then + case ix_ctrl is + when reset_ix => + xreg <= (others=>'0'); + when load_ix => + xreg <= out_alu(15 downto 0); + when pull_hi_ix => + xreg(15 downto 8) <= data_in; + when pull_lo_ix => + xreg(7 downto 0) <= data_in; + when others => + null; + end case; + end if; + end if; +end process; + +-------------------------------- +-- +-- Y Index register +-- +-------------------------------- +--iy_reg : process( clk, iy_ctrl, hold, out_alu, yreg, data_in ) +iy_reg : process( clk ) +begin + if clk'event and clk = '0' then + if hold = '0' then + case iy_ctrl is + when reset_iy => + yreg <= (others=>'0'); + when load_iy => + yreg <= out_alu(15 downto 0); + when pull_hi_iy => + yreg(15 downto 8) <= data_in; + when pull_lo_iy => + yreg(7 downto 0) <= data_in; + when others => + null; + end case; + end if; + end if; +end process; + +-------------------------------- +-- +-- S stack pointer +-- +-------------------------------- +--sp_reg : process( clk, sp_ctrl, hold, sp, out_alu, data_in, nmi_enable ) +sp_reg : process( clk ) +begin + if clk'event and clk = '0' then + if hold = '0' then + case sp_ctrl is + when reset_sp => + sp <= (others=>'0'); + nmi_enable <= '0'; + when load_sp => + sp <= out_alu(15 downto 0); + nmi_enable <= '1'; + when pull_hi_sp => + sp(15 downto 8) <= data_in; + when pull_lo_sp => + sp(7 downto 0) <= data_in; + nmi_enable <= '1'; + when others => + null; + end case; + end if; + end if; +end process; + +-------------------------------- +-- +-- U stack pointer +-- +-------------------------------- +--up_reg : process( clk, up_ctrl, hold, up, out_alu, data_in ) +up_reg : process( clk ) +begin + if clk'event and clk = '0' then + if hold = '0' then + case up_ctrl is + when reset_up => + up <= (others=>'0'); + when load_up => + up <= out_alu(15 downto 0); + when pull_hi_up => + up(15 downto 8) <= data_in; + when pull_lo_up => + up(7 downto 0) <= data_in; + when others => + null; + end case; + end if; + end if; +end process; + +-------------------------------- +-- +-- Memory Data +-- +-------------------------------- +--md_reg : process( clk, md_ctrl, hold, out_alu, data_in, md ) +md_reg : process( clk ) +begin + if clk'event and clk = '0' then + if hold = '0' then + case md_ctrl is + when reset_md => + md <= (others=>'0'); + when load_md => + md <= out_alu(15 downto 0); + when fetch_first_md => -- sign extend md for branches + md(15 downto 8) <= data_in(7) & data_in(7) & data_in(7) & data_in(7) & + data_in(7) & data_in(7) & data_in(7) & data_in(7) ; + md(7 downto 0) <= data_in; + when fetch_next_md => + md(15 downto 8) <= md(7 downto 0); + md(7 downto 0) <= data_in; + when shiftl_md => + md(15 downto 1) <= md(14 downto 0); + md(0) <= '0'; + when others => + null; + end case; + end if; + end if; +end process; + + +---------------------------------- +-- +-- Condition Codes +-- +---------------------------------- + +--cc_reg: process( clk, cc_ctrl, hold, cc_out, cc, data_in ) +cc_reg: process( clk ) +begin + if clk'event and clk = '0' then + if hold = '0' then + case cc_ctrl is + when reset_cc => + cc <= "11010000"; -- set EBIT, FBIT & IBIT + when load_cc => + cc <= cc_out; + when pull_cc => + cc <= data_in; + when others => + null; + end case; + end if; + end if; +end process; + +---------------------------------- +-- +-- Direct Page register +-- +---------------------------------- + +--dp_reg: process( clk, dp_ctrl, hold, out_alu, dp, data_in ) +dp_reg: process( clk ) +begin + if clk'event and clk = '0' then + if hold = '0' then + case dp_ctrl is + when reset_dp => + dp <= (others=>'0'); + when load_dp => + dp <= out_alu(7 downto 0); + when pull_dp => + dp <= data_in; + when others => + null; + end case; + end if; + end if; +end process; + + +---------------------------------- +-- +-- op code register +-- +---------------------------------- + +--op_reg: process( clk, op_ctrl, hold, op_code, data_in ) +op_reg: process( clk ) +begin + if clk'event and clk = '0' then + if hold = '0' then + case op_ctrl is + when reset_op => + op_code <= "00010010"; + when fetch_op => + op_code <= data_in; + when others => + null; + end case; + end if; + end if; +end process; + + +---------------------------------- +-- +-- pre byte op code register +-- +---------------------------------- + +--pre_reg: process( clk, pre_ctrl, hold, pre_code, data_in ) +pre_reg: process( clk ) +begin + if clk'event and clk = '0' then + if hold = '0' then + case pre_ctrl is + when reset_pre => + pre_code <= (others=>'0'); + when fetch_pre => + pre_code <= data_in; + when others => + null; + end case; + end if; + end if; +end process; + +-------------------------------- +-- +-- state machine +-- +-------------------------------- + +--change_state: process( clk, rst, state, hold, next_state ) +change_state: process( clk ) +begin + if clk'event and clk = '0' then + if rst = '1' then + fic <= '0'; + nmi_ack <= '0'; + state <= reset_state; + elsif hold = '0' then + fic <= lic; + -- + -- nmi request is not cleared until nmi input goes low + -- + if (nmi_req = '0') and (nmi_ack='1') then + nmi_ack <= '0'; + end if; + + if (nmi_req = '1') and (nmi_ack = '0') and (state = int_nmimask_state) then + nmi_ack <= '1'; + end if; + + if lic = '1' then + if halt = '1' then + state <= halt_state; + + -- service non maskable interrupts + elsif (nmi_req = '1') and (nmi_ack = '0') then + state <= int_nmi_state; + -- + -- FIRQ & IRQ are level sensitive + -- + elsif (firq = '1') and (cc(FBIT) = '0') then + state <= int_firq_state; + + elsif (irq = '1') and (cc(IBIT) = '0') then + state <= int_irq_state; + -- + -- Version 1.27 2015-05-30 + -- Exit sync_state on masked interrupt. + -- + -- Version 1.28 2015-05-30 + -- Move this code to the state sequencer + -- near line 5566. + -- + -- elsif (state = sync_state) and ((firq = '1') or (irq = '1'))then + -- state <= fetch_state; + -- + else + state <= next_state; + end if; -- halt, nmi, firq, irq + else + state <= next_state; + end if; -- lic + end if; -- reset/hold + end if; -- clk +end process; + +------------------------------------ +-- +-- Detect Edge of NMI interrupt +-- +------------------------------------ + +--nmi_handler : process( clk, rst, nmi, nmi_ack, nmi_req, nmi_enable ) +nmi_handler : process( rst, clk ) +begin + if rst='1' then + nmi_req <= '0'; + elsif clk'event and clk='0' then + if (nmi='1') and (nmi_ack='0') and (nmi_enable='1') then + nmi_req <= '1'; + else + if (nmi='0') and (nmi_ack='1') then + nmi_req <= '0'; + end if; + end if; + end if; +end process; + + +---------------------------------- +-- +-- Address output multiplexer +-- +---------------------------------- + +addr_mux: process( addr_ctrl, pc, ea, up, sp, iv ) +begin + ifetch <= '0'; + vma <= '1'; + case addr_ctrl is + when fetch_ad => + addr <= pc; + rw <= '1'; + ifetch <= '1'; + when read_ad => + addr <= ea; + rw <= '1'; + when write_ad => + addr <= ea; + rw <= '0'; + when pushs_ad => + addr <= sp; + rw <= '0'; + when pulls_ad => + addr <= sp; + rw <= '1'; + when pushu_ad => + addr <= up; + rw <= '0'; + when pullu_ad => + addr <= up; + rw <= '1'; + when int_hi_ad => + addr <= "111111111111" & iv & "0"; + rw <= '1'; + when int_lo_ad => + addr <= "111111111111" & iv & "1"; + rw <= '1'; + when others => + addr <= "1111111111111111"; + rw <= '1'; + vma <= '0'; + end case; +end process; + +-------------------------------- +-- +-- Data Bus output +-- +-------------------------------- +dout_mux : process( dout_ctrl, md, acca, accb, dp, xreg, yreg, sp, up, pc, cc ) +begin + case dout_ctrl is + when cc_dout => -- condition code register + data_out <= cc; + when acca_dout => -- accumulator a + data_out <= acca; + when accb_dout => -- accumulator b + data_out <= accb; + when dp_dout => -- direct page register + data_out <= dp; + when ix_lo_dout => -- X index reg + data_out <= xreg(7 downto 0); + when ix_hi_dout => -- X index reg + data_out <= xreg(15 downto 8); + when iy_lo_dout => -- Y index reg + data_out <= yreg(7 downto 0); + when iy_hi_dout => -- Y index reg + data_out <= yreg(15 downto 8); + when up_lo_dout => -- U stack pointer + data_out <= up(7 downto 0); + when up_hi_dout => -- U stack pointer + data_out <= up(15 downto 8); + when sp_lo_dout => -- S stack pointer + data_out <= sp(7 downto 0); + when sp_hi_dout => -- S stack pointer + data_out <= sp(15 downto 8); + when md_lo_dout => -- alu output + data_out <= md(7 downto 0); + when md_hi_dout => -- alu output + data_out <= md(15 downto 8); + when pc_lo_dout => -- low order pc + data_out <= pc(7 downto 0); + when pc_hi_dout => -- high order pc + data_out <= pc(15 downto 8); + end case; +end process; + +---------------------------------- +-- +-- Left Mux +-- +---------------------------------- + +left_mux: process( left_ctrl, acca, accb, cc, dp, xreg, yreg, up, sp, pc, ea, md ) +begin + case left_ctrl is + when cc_left => + left(15 downto 8) <= "00000000"; + left(7 downto 0) <= cc; + when acca_left => + left(15 downto 8) <= "00000000"; + left(7 downto 0) <= acca; + when accb_left => + left(15 downto 8) <= "00000000"; + left(7 downto 0) <= accb; + when dp_left => + left(15 downto 8) <= "00000000"; + left(7 downto 0) <= dp; + when accd_left => + left(15 downto 8) <= acca; + left(7 downto 0) <= accb; + when md_left => + left <= md; + when ix_left => + left <= xreg; + when iy_left => + left <= yreg; + when sp_left => + left <= sp; + when up_left => + left <= up; + when pc_left => + left <= pc; + when others => +-- when ea_left => + left <= ea; + end case; +end process; + +---------------------------------- +-- +-- Right Mux +-- +---------------------------------- + +right_mux: process( right_ctrl, md, acca, accb, ea ) +begin + case right_ctrl is + when ea_right => + right <= ea; + when zero_right => + right <= "0000000000000000"; + when one_right => + right <= "0000000000000001"; + when two_right => + right <= "0000000000000010"; + when acca_right => + if acca(7) = '0' then + right <= "00000000" & acca(7 downto 0); + else + right <= "11111111" & acca(7 downto 0); + end if; + when accb_right => + if accb(7) = '0' then + right <= "00000000" & accb(7 downto 0); + else + right <= "11111111" & accb(7 downto 0); + end if; + when accd_right => + right <= acca & accb; + when md_sign5_right => + if md(4) = '0' then + right <= "00000000000" & md(4 downto 0); + else + right <= "11111111111" & md(4 downto 0); + end if; + when md_sign8_right => + if md(7) = '0' then + right <= "00000000" & md(7 downto 0); + else + right <= "11111111" & md(7 downto 0); + end if; + when others => +-- when md_right => + right <= md; + end case; +end process; + +---------------------------------- +-- +-- Arithmetic Logic Unit +-- +---------------------------------- + +alu: process( alu_ctrl, cc, left, right, out_alu, cc_out ) +variable valid_lo, valid_hi : boolean; +variable carry_in : std_logic; +variable daa_reg : std_logic_vector(7 downto 0); +begin + + case alu_ctrl is + when alu_adc | alu_sbc | + alu_rol8 | alu_ror8 => + carry_in := cc(CBIT); + when alu_asr8 => + carry_in := left(7); + when others => + carry_in := '0'; + end case; + + valid_lo := left(3 downto 0) <= 9; + valid_hi := left(7 downto 4) <= 9; + + -- + -- CBIT HBIT VHI VLO DAA + -- 0 0 0 0 66 (!VHI : hi_nybble>8) + -- 0 0 0 1 60 + -- 0 0 1 1 00 + -- 0 0 1 0 06 ( VHI : hi_nybble<=8) + -- + -- 0 1 1 0 06 + -- 0 1 1 1 06 + -- 0 1 0 1 66 + -- 0 1 0 0 66 + -- + -- 1 1 0 0 66 + -- 1 1 0 1 66 + -- 1 1 1 1 66 + -- 1 1 1 0 66 + -- + -- 1 0 1 0 66 + -- 1 0 1 1 60 + -- 1 0 0 1 60 + -- 1 0 0 0 66 + -- + -- 66 = (!VHI & !VLO) + (CBIT & HBIT) + (HBIT & !VHI) + (CBIT & !VLO) + -- = (CBIT & (HBIT + !VLO)) + (!VHI & (HBIT + !VLO)) + -- = (!VLO & (CBIT + !VHI)) + (HBIT & (CBIT + !VHI)) + -- 60 = (CBIT & !HBIT & VLO) + (!HBIT & !VHI & VLO) + -- = (!HBIT & VLO & (CBIT + !VHI)) + -- 06 = (!CBIT & VHI & (!VLO + VHI) + -- 00 = (!CBIT & !HBIT & VHI & VLO) + -- + if (cc(CBIT) = '0') then + -- CBIT=0 + if( cc(HBIT) = '0' ) then + -- HBIT=0 + if valid_lo then + -- lo <= 9 (no overflow in low nybble) + if valid_hi then + -- hi <= 9 (no overflow in either low or high nybble) + daa_reg := "00000000"; + else + -- hi > 9 (overflow in high nybble only) + daa_reg := "01100000"; + end if; + else + -- lo > 9 (overflow in low nybble) + -- + -- since there is already an overflow in the low nybble + -- you need to make room in the high nybble for the low nybble carry + -- so compare the high nybble with 8 rather than 9 + -- if the high nybble is 9 there will be an overflow on the high nybble + -- after the decimal adjust which means it will roll over to an invalid BCD digit + -- + if( left(7 downto 4) <= 8 ) then + -- hi <= 8 (overflow in low nybble only) + daa_reg := "00000110"; + else + -- hi > 8 (overflow in low and high nybble) + daa_reg := "01100110"; + end if; + end if; + else + -- HBIT=1 (overflow in low nybble) + if valid_hi then + -- hi <= 9 (overflow in low nybble only) + daa_reg := "00000110"; + else + -- hi > 9 (overflow in low and high nybble) + daa_reg := "01100110"; + end if; + end if; + else + -- CBIT=1 (carry => overflow in high nybble) + if ( cc(HBIT) = '0' )then + -- HBIT=0 (half carry clear => may or may not be an overflow in the low nybble) + if valid_lo then + -- lo <=9 (overflow in high nybble only) + daa_reg := "01100000"; + else + -- lo >9 (overflow in low and high nybble) + daa_reg := "01100110"; + end if; + else + -- HBIT=1 (overflow in low and high nybble) + daa_reg := "01100110"; + end if; + end if; + + case alu_ctrl is + when alu_add8 | alu_inc | + alu_add16 | alu_adc | alu_mul => + out_alu <= left + right + ("000000000000000" & carry_in); + when alu_sub8 | alu_dec | + alu_sub16 | alu_sbc => + out_alu <= left - right - ("000000000000000" & carry_in); + when alu_abx => + out_alu <= left + ("00000000" & right(7 downto 0)) ; + when alu_and => + out_alu <= left and right; -- and/bit + when alu_ora => + out_alu <= left or right; -- or + when alu_eor => + out_alu <= left xor right; -- eor/xor + when alu_lsl16 | alu_asl8 | alu_rol8 => + out_alu <= left(14 downto 0) & carry_in; -- rol8/asl8/lsl16 + when alu_lsr16 => + out_alu <= carry_in & left(15 downto 1); -- lsr16 + when alu_lsr8 | alu_asr8 | alu_ror8 => + out_alu <= "00000000" & carry_in & left(7 downto 1); -- ror8/asr8/lsr8 + when alu_neg => + out_alu <= right - left; -- neg (right=0) + when alu_com => + out_alu <= not left; + when alu_clr | alu_ld8 | alu_ld16 | alu_lea => + out_alu <= right; -- clr, ld + when alu_st8 | alu_st16 | alu_andcc | alu_orcc | alu_tfr => + out_alu <= left; + when alu_daa => + out_alu <= left + ("00000000" & daa_reg); + when alu_sex => + if left(7) = '0' then + out_alu <= "00000000" & left(7 downto 0); + else + out_alu <= "11111111" & left(7 downto 0); + end if; + when others => + out_alu <= left; -- nop + end case; + + -- + -- carry bit + -- + case alu_ctrl is + when alu_add8 | alu_adc => + cc_out(CBIT) <= (left(7) and right(7)) or + (left(7) and not out_alu(7)) or + (right(7) and not out_alu(7)); + when alu_sub8 | alu_sbc => + cc_out(CBIT) <= ((not left(7)) and right(7)) or + ((not left(7)) and out_alu(7)) or + (right(7) and out_alu(7)); + when alu_add16 => + cc_out(CBIT) <= (left(15) and right(15)) or + (left(15) and not out_alu(15)) or + (right(15) and not out_alu(15)); + when alu_sub16 => + cc_out(CBIT) <= ((not left(15)) and right(15)) or + ((not left(15)) and out_alu(15)) or + (right(15) and out_alu(15)); + when alu_ror8 | alu_lsr16 | alu_lsr8 | alu_asr8 => + cc_out(CBIT) <= left(0); + when alu_rol8 | alu_asl8 => + cc_out(CBIT) <= left(7); + when alu_lsl16 => + cc_out(CBIT) <= left(15); + when alu_com => + cc_out(CBIT) <= '1'; + when alu_neg | alu_clr => + cc_out(CBIT) <= out_alu(7) or out_alu(6) or out_alu(5) or out_alu(4) or + out_alu(3) or out_alu(2) or out_alu(1) or out_alu(0); + when alu_mul => + cc_out(CBIT) <= out_alu(7); + when alu_daa => + if ( daa_reg(7 downto 4) = "0110" ) then + cc_out(CBIT) <= '1'; + else + cc_out(CBIT) <= '0'; + end if; + when alu_andcc => + cc_out(CBIT) <= left(CBIT) and cc(CBIT); + when alu_orcc => + cc_out(CBIT) <= left(CBIT) or cc(CBIT); + when alu_tfr => + cc_out(CBIT) <= left(CBIT); + when others => + cc_out(CBIT) <= cc(CBIT); + end case; + -- + -- Zero flag + -- + case alu_ctrl is + when alu_add8 | alu_sub8 | + alu_adc | alu_sbc | + alu_and | alu_ora | alu_eor | + alu_inc | alu_dec | + alu_neg | alu_com | alu_clr | + alu_rol8 | alu_ror8 | alu_asr8 | alu_asl8 | alu_lsr8 | + alu_ld8 | alu_st8 | alu_sex | alu_daa => + cc_out(ZBIT) <= not( out_alu(7) or out_alu(6) or out_alu(5) or out_alu(4) or + out_alu(3) or out_alu(2) or out_alu(1) or out_alu(0) ); + when alu_add16 | alu_sub16 | alu_mul | + alu_lsl16 | alu_lsr16 | + alu_ld16 | alu_st16 | alu_lea => + cc_out(ZBIT) <= not( out_alu(15) or out_alu(14) or out_alu(13) or out_alu(12) or + out_alu(11) or out_alu(10) or out_alu(9) or out_alu(8) or + out_alu(7) or out_alu(6) or out_alu(5) or out_alu(4) or + out_alu(3) or out_alu(2) or out_alu(1) or out_alu(0) ); + when alu_andcc => + cc_out(ZBIT) <= left(ZBIT) and cc(ZBIT); + when alu_orcc => + cc_out(ZBIT) <= left(ZBIT) or cc(ZBIT); + when alu_tfr => + cc_out(ZBIT) <= left(ZBIT); + when others => + cc_out(ZBIT) <= cc(ZBIT); + end case; + + -- + -- negative flag + -- + case alu_ctrl is + when alu_add8 | alu_sub8 | + alu_adc | alu_sbc | + alu_and | alu_ora | alu_eor | + alu_rol8 | alu_ror8 | alu_asr8 | alu_asl8 | alu_lsr8 | + alu_inc | alu_dec | alu_neg | alu_com | alu_clr | + alu_ld8 | alu_st8 | alu_sex | alu_daa => + cc_out(NBIT) <= out_alu(7); + when alu_add16 | alu_sub16 | + alu_lsl16 | alu_lsr16 | + alu_ld16 | alu_st16 => + cc_out(NBIT) <= out_alu(15); + when alu_andcc => + cc_out(NBIT) <= left(NBIT) and cc(NBIT); + when alu_orcc => + cc_out(NBIT) <= left(NBIT) or cc(NBIT); + when alu_tfr => + cc_out(NBIT) <= left(NBIT); + when others => + cc_out(NBIT) <= cc(NBIT); + end case; + + -- + -- Interrupt mask flag + -- + case alu_ctrl is + when alu_andcc => + cc_out(IBIT) <= left(IBIT) and cc(IBIT); + when alu_orcc => + cc_out(IBIT) <= left(IBIT) or cc(IBIT); + when alu_tfr => + cc_out(IBIT) <= left(IBIT); + when alu_seif | alu_sei => + cc_out(IBIT) <= '1'; + when others => + cc_out(IBIT) <= cc(IBIT); -- interrupt mask + end case; + + -- + -- Half Carry flag + -- + case alu_ctrl is + when alu_add8 | alu_adc => + cc_out(HBIT) <= (left(3) and right(3)) or + (right(3) and not out_alu(3)) or + (left(3) and not out_alu(3)); + when alu_andcc => + cc_out(HBIT) <= left(HBIT) and cc(HBIT); + when alu_orcc => + cc_out(HBIT) <= left(HBIT) or cc(HBIT); + when alu_tfr => + cc_out(HBIT) <= left(HBIT); + when others => + cc_out(HBIT) <= cc(HBIT); + end case; + + -- + -- Overflow flag + -- + case alu_ctrl is + when alu_add8 | alu_adc => + cc_out(VBIT) <= (left(7) and right(7) and (not out_alu(7))) or + ((not left(7)) and (not right(7)) and out_alu(7)); + when alu_sub8 | alu_sbc => + cc_out(VBIT) <= (left(7) and (not right(7)) and (not out_alu(7))) or + ((not left(7)) and right(7) and out_alu(7)); + when alu_add16 => + cc_out(VBIT) <= (left(15) and right(15) and (not out_alu(15))) or + ((not left(15)) and (not right(15)) and out_alu(15)); + when alu_sub16 => + cc_out(VBIT) <= (left(15) and (not right(15)) and (not out_alu(15))) or + ((not left(15)) and right(15) and out_alu(15)); + when alu_inc => + cc_out(VBIT) <= ((not left(7)) and left(6) and left(5) and left(4) and + left(3) and left(2) and left(1) and left(0)); + when alu_dec | alu_neg => + cc_out(VBIT) <= (left(7) and (not left(6)) and (not left(5)) and (not left(4)) and + (not left(3)) and (not left(2)) and (not left(1)) and (not left(0))); +-- 6809 Programming reference manual says +-- V not affected by ASR, LSR and ROR +-- This is different to the 6800 +-- John Kent 6th June 2006 +-- when alu_asr8 => +-- cc_out(VBIT) <= left(0) xor left(7); +-- when alu_lsr8 | alu_lsr16 => +-- cc_out(VBIT) <= left(0); +-- when alu_ror8 => +-- cc_out(VBIT) <= left(0) xor cc(CBIT); + when alu_lsl16 => + cc_out(VBIT) <= left(15) xor left(14); + when alu_rol8 | alu_asl8 => + cc_out(VBIT) <= left(7) xor left(6); +-- +-- 11th July 2006 - John Kent +-- What DAA does with V is anyones guess +-- It is undefined in the 6809 programming manual +-- + when alu_daa => + cc_out(VBIT) <= left(7) xor out_alu(7) xor cc(CBIT); +-- CLR resets V Bit +-- John Kent 6th June 2006 + when alu_and | alu_ora | alu_eor | alu_com | alu_clr | + alu_st8 | alu_st16 | alu_ld8 | alu_ld16 | alu_sex => + cc_out(VBIT) <= '0'; + when alu_andcc => + cc_out(VBIT) <= left(VBIT) and cc(VBIT); + when alu_orcc => + cc_out(VBIT) <= left(VBIT) or cc(VBIT); + when alu_tfr => + cc_out(VBIT) <= left(VBIT); + when others => + cc_out(VBIT) <= cc(VBIT); + end case; + + case alu_ctrl is + when alu_andcc => + cc_out(FBIT) <= left(FBIT) and cc(FBIT); + when alu_orcc => + cc_out(FBIT) <= left(FBIT) or cc(FBIT); + when alu_tfr => + cc_out(FBIT) <= left(FBIT); + when alu_seif => + cc_out(FBIT) <= '1'; + when others => + cc_out(FBIT) <= cc(FBIT); + end case; + + case alu_ctrl is + when alu_andcc => + cc_out(EBIT) <= left(EBIT) and cc(EBIT); + when alu_orcc => + cc_out(EBIT) <= left(EBIT) or cc(EBIT); + when alu_tfr => + cc_out(EBIT) <= left(EBIT); + when alu_see => + cc_out(EBIT) <= '1'; + when alu_cle => + cc_out(EBIT) <= '0'; + when others => + cc_out(EBIT) <= cc(EBIT); + end case; +end process; + +------------------------------------ +-- +-- state sequencer +-- +------------------------------------ +process( state, saved_state, + op_code, pre_code, + cc, ea, md, iv, fic, halt, + nmi_req, firq, irq, lic ) +variable cond_true : boolean; -- variable used to evaluate coditional branches +begin + cond_true := (1=1); + ba <= '0'; + bs <= '0'; + lic <= '0'; + opfetch <= '0'; + iv_ctrl <= latch_iv; + -- Registers preserved + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + dp_ctrl <= latch_dp; + ix_ctrl <= latch_ix; + iy_ctrl <= latch_iy; + up_ctrl <= latch_up; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + ea_ctrl <= latch_ea; + op_ctrl <= latch_op; + pre_ctrl <= latch_pre; + -- ALU Idle + left_ctrl <= pc_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + -- Bus idle + addr_ctrl <= idle_ad; + dout_ctrl <= cc_dout; + -- Next State Fetch + st_ctrl <= idle_st; + return_state <= fetch_state; + next_state <= fetch_state; + + case state is + when reset_state => -- released from reset + -- reset the registers + iv_ctrl <= reset_iv; + op_ctrl <= reset_op; + pre_ctrl <= reset_pre; + cc_ctrl <= reset_cc; + acca_ctrl <= reset_acca; + accb_ctrl <= reset_accb; + dp_ctrl <= reset_dp; + ix_ctrl <= reset_ix; + iy_ctrl <= reset_iy; + up_ctrl <= reset_up; + sp_ctrl <= reset_sp; + pc_ctrl <= reset_pc; + ea_ctrl <= reset_ea; + md_ctrl <= reset_md; + st_ctrl <= reset_st; + next_state <= vect_hi_state; + + -- + -- Jump via interrupt vector + -- iv holds interrupt type + -- fetch PC hi from vector location + -- + when vect_hi_state => + -- fetch pc low interrupt vector + pc_ctrl <= pull_hi_pc; + addr_ctrl <= int_hi_ad; + bs <= '1'; + next_state <= vect_lo_state; + + -- + -- jump via interrupt vector + -- iv holds vector type + -- fetch PC lo from vector location + -- + when vect_lo_state => + -- fetch the vector low byte + pc_ctrl <= pull_lo_pc; + addr_ctrl <= int_lo_ad; + bs <= '1'; + next_state <= fetch_state; + + when vect_idle_state => + -- + -- Last Instruction Cycle for SWI, SWI2 & SWI3 + -- + if op_code = "00111111" then + lic <= '1'; + end if; + next_state <= fetch_state; + + -- + -- Here to fetch an instruction + -- PC points to opcode + -- + when fetch_state => + -- fetch the op code + opfetch <= '1'; + op_ctrl <= fetch_op; + pre_ctrl <= fetch_pre; + ea_ctrl <= reset_ea; + -- Fetch op code + addr_ctrl <= fetch_ad; + -- Advance the PC to fetch next instruction byte + pc_ctrl <= incr_pc; + next_state <= decode1_state; + + -- + -- Here to decode instruction + -- and fetch next byte of intruction + -- whether it be necessary or not + -- + when decode1_state => + -- fetch first byte of address or immediate data + ea_ctrl <= fetch_first_ea; + md_ctrl <= fetch_first_md; + addr_ctrl <= fetch_ad; + case op_code(7 downto 4) is + -- + -- direct single op (2 bytes) + -- 6809 => 6 cycles + -- cpu09 => 5 cycles + -- 1 op=(pc) / pc=pc+1 + -- 2 ea_hi=dp / ea_lo=(pc) / pc=pc+1 + -- 3 md_lo=(ea) / pc=pc + -- 4 alu_left=md / md=alu_out / pc=pc + -- 5 (ea)=md_lo / pc=pc + -- + -- Exception is JMP + -- 6809 => 3 cycles + -- cpu09 => 3 cycles + -- 1 op=(pc) / pc=pc+1 + -- 2 ea_hi=dp / ea_lo=(pc) / pc=pc+1 + -- 3 pc=ea + -- + when "0000" => + -- advance the PC + pc_ctrl <= incr_pc; + + case op_code(3 downto 0) is + when "1110" => -- jmp + next_state <= jmp_state; + + when "1111" => -- clr + next_state <= single_op_exec_state; + + when others => + next_state <= single_op_read_state; + + end case; + + -- acca / accb inherent instructions + when "0001" => + case op_code(3 downto 0) is + -- + -- Page2 pre byte + -- pre=(pc) / pc=pc+1 + -- op=(pc) / pc=pc+1 + -- + when "0000" => -- page2 + opfetch <= '1'; + op_ctrl <= fetch_op; + -- advance pc + pc_ctrl <= incr_pc; + next_state <= decode2_state; + + -- + -- Page3 pre byte + -- pre=(pc) / pc=pc+1 + -- op=(pc) / pc=pc+1 + -- + when "0001" => -- page3 + opfetch <= '1'; + op_ctrl <= fetch_op; + -- advance pc + pc_ctrl <= incr_pc; + next_state <= decode3_state; + + -- + -- nop - No operation ( 1 byte ) + -- 6809 => 2 cycles + -- cpu09 => 2 cycles + -- 1 op=(pc) / pc=pc+1 + -- 2 decode + -- + when "0010" => -- nop + lic <= '1'; + next_state <= fetch_state; + + -- + -- sync - halt execution until an interrupt is received + -- interrupt may be NMI, IRQ or FIRQ + -- program execution continues if the + -- interrupt is asserted for 3 clock cycles + -- note that registers are not pushed onto the stack + -- CPU09 => Interrupts need only be asserted for one clock cycle + -- + when "0011" => -- sync + next_state <= sync_state; + + -- + -- lbra -- long branch (3 bytes) + -- 6809 => 5 cycles + -- cpu09 => 4 cycles + -- 1 op=(pc) / pc=pc+1 + -- 2 md_hi=sign(pc) / md_lo=(pc) / pc=pc+1 + -- 3 md_hi=md_lo / md_lo=(pc) / pc=pc+1 + -- 4 pc=pc+md + -- + when "0110" => + -- increment the pc + pc_ctrl <= incr_pc; + next_state <= lbranch_state; + + -- + -- lbsr - long branch to subroutine (3 bytes) + -- 6809 => 9 cycles + -- cpu09 => 6 cycles + -- 1 op=(pc) /pc=pc+1 + -- 2 md_hi=sign(pc) / md_lo=(pc) / pc=pc+1 / sp=sp-1 + -- 3 md_hi=md_lo / md_lo=(pc) / pc=pc+1 + -- 4 (sp)= pc_lo / sp=sp-1 / pc=pc + -- 5 (sp)=pc_hi / pc=pc + -- 6 pc=pc+md + -- + when "0111" => + -- pre decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- increment the pc + pc_ctrl <= incr_pc; + next_state <= lbranch_state; + + -- + -- Decimal Adjust Accumulator + -- + when "1001" => -- daa + left_ctrl <= acca_left; + right_ctrl <= accb_right; + alu_ctrl <= alu_daa; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + lic <= '1'; + next_state <= fetch_state; + + -- + -- OR Condition Codes + -- + when "1010" => -- orcc + -- increment the pc + pc_ctrl <= incr_pc; + next_state <= orcc_state; + + -- + -- AND Condition Codes + -- + when "1100" => -- andcc + -- increment the pc + pc_ctrl <= incr_pc; + next_state <= andcc_state; + + -- + -- Sign Extend + -- + when "1101" => -- sex + left_ctrl <= accb_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_sex; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + lic <= '1'; + next_state <= fetch_state; + + -- + -- Exchange Registers + -- + when "1110" => -- exg + -- increment the pc + pc_ctrl <= incr_pc; + next_state <= exg_state; + + -- + -- Transfer Registers + -- + when "1111" => -- tfr + -- increment the pc + pc_ctrl <= incr_pc; + next_state <= tfr_state; + + when others => + -- increment the pc + pc_ctrl <= incr_pc; + lic <= '1'; + next_state <= fetch_state; + end case; + + -- + -- Short branch conditional + -- 6809 => always 3 cycles + -- cpu09 => always = 3 cycles + -- 1 op=(pc) / pc=pc+1 + -- 2 md_hi=sign(pc) / md_lo=(pc) / pc=pc+1 / test cc + -- 3 if cc tru pc=pc+md else pc=pc + -- + when "0010" => -- branch conditional + -- increment the pc + pc_ctrl <= incr_pc; + next_state <= sbranch_state; + + -- + -- Single byte stack operators + -- Do not advance PC + -- + when "0011" => + -- + -- lea - load effective address (2+ bytes) + -- 6809 => 4 cycles + addressing mode + -- cpu09 => 4 cycles + addressing mode + -- 1 op=(pc) / pc=pc+1 + -- 2 md_lo=(pc) / pc=pc+1 + -- 3 calculate ea + -- 4 ix/iy/sp/up = ea + -- + case op_code(3 downto 0) is + when "0000" | -- leax + "0001" | -- leay + "0010" | -- leas + "0011" => -- leau + -- advance PC + pc_ctrl <= incr_pc; + st_ctrl <= push_st; + return_state <= lea_state; + next_state <= indexed_state; + + -- + -- pshs - push registers onto sp stack + -- 6809 => 5 cycles + registers + -- cpu09 => 3 cycles + registers + -- 1 op=(pc) / pc=pc+1 + -- 2 ea_lo=(pc) / pc=pc+1 + -- 3 if ea(7 downto 0) != "00000000" then sp=sp-1 + -- 4 if ea(7) = 1 (sp)=pcl, sp=sp-1 + -- 5 if ea(7) = 1 (sp)=pch + -- if ea(6 downto 0) != "0000000" then sp=sp-1 + -- 6 if ea(6) = 1 (sp)=upl, sp=sp-1 + -- 7 if ea(6) = 1 (sp)=uph + -- if ea(5 downto 0) != "000000" then sp=sp-1 + -- 8 if ea(5) = 1 (sp)=iyl, sp=sp-1 + -- 9 if ea(5) = 1 (sp)=iyh + -- if ea(4 downto 0) != "00000" then sp=sp-1 + -- 10 if ea(4) = 1 (sp)=ixl, sp=sp-1 + -- 11 if ea(4) = 1 (sp)=ixh + -- if ea(3 downto 0) != "0000" then sp=sp-1 + -- 12 if ea(3) = 1 (sp)=dp + -- if ea(2 downto 0) != "000" then sp=sp-1 + -- 13 if ea(2) = 1 (sp)=accb + -- if ea(1 downto 0) != "00" then sp=sp-1 + -- 14 if ea(1) = 1 (sp)=acca + -- if ea(0 downto 0) != "0" then sp=sp-1 + -- 15 if ea(0) = 1 (sp)=cc + -- + when "0100" => -- pshs + -- advance PC + pc_ctrl <= incr_pc; + next_state <= pshs_state; + + -- + -- puls - pull registers of sp stack + -- 6809 => 5 cycles + registers + -- cpu09 => 3 cycles + registers + -- + when "0101" => -- puls + -- advance PC + pc_ctrl <= incr_pc; + next_state <= puls_state; + + -- + -- pshu - push registers onto up stack + -- 6809 => 5 cycles + registers + -- cpu09 => 3 cycles + registers + -- + when "0110" => -- pshu + -- advance PC + pc_ctrl <= incr_pc; + next_state <= pshu_state; + + -- + -- pulu - pull registers of up stack + -- 6809 => 5 cycles + registers + -- cpu09 => 3 cycles + registers + -- + when "0111" => -- pulu + -- advance PC + pc_ctrl <= incr_pc; + next_state <= pulu_state; + + -- + -- rts - return from subroutine + -- 6809 => 5 cycles + -- cpu09 => 4 cycles + -- 1 op=(pc) / pc=pc+1 + -- 2 decode op + -- 3 pc_hi = (sp) / sp=sp+1 + -- 4 pc_lo = (sp) / sp=sp+1 + -- + when "1001" => + next_state <= pull_return_hi_state; + + -- + -- ADD accb to index register + -- *** Note: this is an unsigned addition. + -- does not affect any condition codes + -- 6809 => 3 cycles + -- cpu09 => 2 cycles + -- 1 op=(pc) / pc=pc+1 + -- 2 alu_left=ix / alu_right=accb / ix=alu_out / pc=pc + -- + when "1010" => -- abx + lic <= '1'; + left_ctrl <= ix_left; + right_ctrl <= accb_right; + alu_ctrl <= alu_abx; + ix_ctrl <= load_ix; + next_state <= fetch_state; + + -- + -- Return From Interrupt + -- + when "1011" => -- rti + next_state <= rti_cc_state; + + -- + -- CWAI + -- + when "1100" => -- cwai #$ + -- pre decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- increment pc + pc_ctrl <= incr_pc; + next_state <= cwai_state; + + -- + -- MUL Multiply + -- + when "1101" => -- mul + next_state <= mul_state; + + -- + -- SWI Software Interrupt + -- + when "1111" => -- swi + -- predecrement SP + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + iv_ctrl <= swi_iv; + st_ctrl <= push_st; + return_state <= int_swimask_state; + next_state <= int_entire_state; + + when others => + lic <= '1'; + next_state <= fetch_state; + + end case; + -- + -- Accumulator A Single operand + -- source = acca, dest = acca + -- Do not advance PC + -- Typically 2 cycles 1 bytes + -- 1 opcode fetch + -- 2 post byte fetch / instruction decode + -- Note that there is no post byte + -- so do not advance PC in decode cycle + -- Re-run opcode fetch cycle after decode + -- + when "0100" => -- acca single op + left_ctrl <= acca_left; + case op_code(3 downto 0) is + + when "0000" => -- neg + right_ctrl <= zero_right; + alu_ctrl <= alu_neg; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + + when "0011" => -- com + right_ctrl <= zero_right; + alu_ctrl <= alu_com; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + + when "0100" => -- lsr + right_ctrl <= zero_right; + alu_ctrl <= alu_lsr8; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + + when "0110" => -- ror + right_ctrl <= zero_right; + alu_ctrl <= alu_ror8; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + + when "0111" => -- asr + right_ctrl <= zero_right; + alu_ctrl <= alu_asr8; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + + when "1000" => -- asl + right_ctrl <= zero_right; + alu_ctrl <= alu_asl8; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + + when "1001" => -- rol + right_ctrl <= zero_right; + alu_ctrl <= alu_rol8; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + + when "1010" => -- dec + right_ctrl <= one_right; + alu_ctrl <= alu_dec; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + + when "1011" => -- undefined + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + acca_ctrl <= latch_acca; + cc_ctrl <= latch_cc; + + when "1100" => -- inc + right_ctrl <= one_right; + alu_ctrl <= alu_inc; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + + when "1101" => -- tst + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + acca_ctrl <= latch_acca; + cc_ctrl <= load_cc; + + when "1110" => -- jmp (not defined) + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + acca_ctrl <= latch_acca; + cc_ctrl <= latch_cc; + + when "1111" => -- clr + right_ctrl <= zero_right; + alu_ctrl <= alu_clr; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + + when others => + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + acca_ctrl <= latch_acca; + cc_ctrl <= latch_cc; + + end case; + lic <= '1'; + next_state <= fetch_state; + + -- + -- Single Operand accb + -- source = accb, dest = accb + -- Typically 2 cycles 1 bytes + -- 1 opcode fetch + -- 2 post byte fetch / instruction decode + -- Note that there is no post byte + -- so do not advance PC in decode cycle + -- Re-run opcode fetch cycle after decode + -- + when "0101" => + left_ctrl <= accb_left; + case op_code(3 downto 0) is + when "0000" => -- neg + right_ctrl <= zero_right; + alu_ctrl <= alu_neg; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + + when "0011" => -- com + right_ctrl <= zero_right; + alu_ctrl <= alu_com; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + + when "0100" => -- lsr + right_ctrl <= zero_right; + alu_ctrl <= alu_lsr8; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + + when "0110" => -- ror + right_ctrl <= zero_right; + alu_ctrl <= alu_ror8; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + + when "0111" => -- asr + right_ctrl <= zero_right; + alu_ctrl <= alu_asr8; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + + when "1000" => -- asl + right_ctrl <= zero_right; + alu_ctrl <= alu_asl8; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + + when "1001" => -- rol + right_ctrl <= zero_right; + alu_ctrl <= alu_rol8; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + + when "1010" => -- dec + right_ctrl <= one_right; + alu_ctrl <= alu_dec; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + + when "1011" => -- undefined + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + accb_ctrl <= latch_accb; + cc_ctrl <= latch_cc; + + when "1100" => -- inc + right_ctrl <= one_right; + alu_ctrl <= alu_inc; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + + when "1101" => -- tst + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + accb_ctrl <= latch_accb; + cc_ctrl <= load_cc; + + when "1110" => -- jmp (undefined) + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + accb_ctrl <= latch_accb; + cc_ctrl <= latch_cc; + + when "1111" => -- clr + right_ctrl <= zero_right; + alu_ctrl <= alu_clr; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + + when others => + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + accb_ctrl <= latch_accb; + cc_ctrl <= latch_cc; + end case; + lic <= '1'; + next_state <= fetch_state; + + -- + -- Single operand indexed + -- Two byte instruction so advance PC + -- EA should hold index offset + -- + when "0110" => -- indexed single op + -- increment the pc + pc_ctrl <= incr_pc; + st_ctrl <= push_st; + + case op_code(3 downto 0) is + when "1110" => -- jmp + return_state <= jmp_state; + + when "1111" => -- clr + return_state <= single_op_exec_state; + + when others => + return_state <= single_op_read_state; + + end case; + next_state <= indexed_state; + + -- + -- Single operand extended addressing + -- three byte instruction so advance the PC + -- Low order EA holds high order address + -- + when "0111" => -- extended single op + -- increment PC + pc_ctrl <= incr_pc; + st_ctrl <= push_st; + + case op_code(3 downto 0) is + when "1110" => -- jmp + return_state <= jmp_state; + + when "1111" => -- clr + return_state <= single_op_exec_state; + + when others => + return_state <= single_op_read_state; + + end case; + next_state <= extended_state; + + when "1000" => -- acca immediate + -- increment the pc + pc_ctrl <= incr_pc; + + case op_code(3 downto 0) is + when "0011" | -- subd # + "1100" | -- cmpx # + "1110" => -- ldx # + next_state <= imm16_state; + + -- + -- bsr offset - Branch to subroutine (2 bytes) + -- 6809 => 7 cycles + -- cpu09 => 5 cycles + -- 1 op=(pc) / pc=pc+1 + -- 2 md_hi=sign(pc) / md_lo=(pc) / sp=sp-1 / pc=pc+1 + -- 3 (sp)=pc_lo / sp=sp-1 + -- 4 (sp)=pc_hi + -- 5 pc=pc+md + -- + when "1101" => -- bsr + -- pre decrement SP + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- + st_ctrl <= push_st; + return_state <= sbranch_state; + next_state <= push_return_lo_state; + + when others => + lic <= '1'; + next_state <= fetch_state; + + end case; + + when "1001" => -- acca direct + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- subd + "1100" | -- cmpx + "1110" => -- ldx + next_state <= dual_op_read16_state; + + when "0111" => -- sta direct + next_state <= dual_op_write8_state; + + -- + -- jsr direct - Jump to subroutine in direct page (2 bytes) + -- 6809 => 7 cycles + -- cpu09 => 5 cycles + -- 1 op=(pc) / pc=pc+1 + -- 2 ea_hi=0 / ea_lo=(pc) / sp=sp-1 / pc=pc+1 + -- 3 (sp)=pc_lo / sp=sp-1 + -- 4 (sp)=pc_hi + -- 5 pc=ea + -- + when "1101" => -- jsr direct + -- pre decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- + st_ctrl <= push_st; + return_state <= jmp_state; + next_state <= push_return_lo_state; + + + when "1111" => -- stx direct + -- idle ALU + left_ctrl <= ix_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + sp_ctrl <= latch_sp; + next_state <= dual_op_write16_state; + + when others => + next_state <= dual_op_read8_state; + + end case; + + when "1010" => -- acca indexed + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- subd + "1100" | -- cmpx + "1110" => -- ldx + st_ctrl <= push_st; + return_state <= dual_op_read16_state; + next_state <= indexed_state; + + when "0111" => -- staa ,x + st_ctrl <= push_st; + return_state <= dual_op_write8_state; + next_state <= indexed_state; + + when "1101" => -- jsr ,x + -- DO NOT pre decrement SP + st_ctrl <= push_st; + return_state <= jsr_state; + next_state <= indexed_state; + + when "1111" => -- stx ,x + st_ctrl <= push_st; + return_state <= dual_op_write16_state; + next_state <= indexed_state; + + when others => + st_ctrl <= push_st; + return_state <= dual_op_read8_state; + next_state <= indexed_state; + + end case; + + when "1011" => -- acca extended + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- subd + "1100" | -- cmpx + "1110" => -- ldx + st_ctrl <= push_st; + return_state <= dual_op_read16_state; + next_state <= extended_state; + + when "0111" => -- staa > + st_ctrl <= push_st; + return_state <= dual_op_write8_state; + next_state <= extended_state; + + when "1101" => -- jsr >extended + -- DO NOT pre decrement sp + st_ctrl <= push_st; + return_state <= jsr_state; + next_state <= extended_state; + + when "1111" => -- stx > + st_ctrl <= push_st; + return_state <= dual_op_write16_state; + next_state <= extended_state; + + when others => + st_ctrl <= push_st; + return_state <= dual_op_read8_state; + next_state <= extended_state; + + end case; + + when "1100" => -- accb immediate + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- addd # + "1100" | -- ldd # + "1110" => -- ldu # + next_state <= imm16_state; + + when others => + lic <= '1'; + next_state <= fetch_state; + + end case; + + when "1101" => -- accb direct + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- addd + "1100" | -- ldd + "1110" => -- ldu + next_state <= dual_op_read16_state; + + when "0111" => -- stab direct + next_state <= dual_op_write8_state; + + when "1101" => -- std direct + next_state <= dual_op_write16_state; + + when "1111" => -- stu direct + next_state <= dual_op_write16_state; + + when others => + next_state <= dual_op_read8_state; + + end case; + + when "1110" => -- accb indexed + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- addd + "1100" | -- ldd + "1110" => -- ldu + st_ctrl <= push_st; + return_state <= dual_op_read16_state; + next_state <= indexed_state; + + when "0111" => -- stab indexed + st_ctrl <= push_st; + return_state <= dual_op_write8_state; + next_state <= indexed_state; + + when "1101" => -- std indexed + st_ctrl <= push_st; + return_state <= dual_op_write16_state; + next_state <= indexed_state; + + when "1111" => -- stu indexed + st_ctrl <= push_st; + return_state <= dual_op_write16_state; + next_state <= indexed_state; + + when others => + st_ctrl <= push_st; + return_state <= dual_op_read8_state; + next_state <= indexed_state; + + end case; + + when "1111" => -- accb extended + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- addd + "1100" | -- ldd + "1110" => -- ldu + st_ctrl <= push_st; + return_state <= dual_op_read16_state; + next_state <= extended_state; + + when "0111" => -- stab extended + st_ctrl <= push_st; + return_state <= dual_op_write8_state; + next_state <= extended_state; + + when "1101" => -- std extended + st_ctrl <= push_st; + return_state <= dual_op_write16_state; + next_state <= extended_state; + + when "1111" => -- stu extended + st_ctrl <= push_st; + return_state <= dual_op_write16_state; + next_state <= extended_state; + + when others => + st_ctrl <= push_st; + return_state <= dual_op_read8_state; + next_state <= extended_state; + end case; + -- + -- not sure why I need this + -- + when others => + lic <= '1'; + next_state <= fetch_state; + end case; + + -- + -- Here to decode prefix 2 instruction + -- and fetch next byte of intruction + -- whether it be necessary or not + -- + when decode2_state => + -- fetch first byte of address or immediate data + ea_ctrl <= fetch_first_ea; + md_ctrl <= fetch_first_md; + addr_ctrl <= fetch_ad; + case op_code(7 downto 4) is + -- + -- lbcc -- long branch conditional + -- 6809 => branch 6 cycles, no branch 5 cycles + -- cpu09 => always 5 cycles + -- 1 pre=(pc) / pc=pc+1 + -- 2 op=(pc) / pc=pc+1 + -- 3 md_hi=sign(pc) / md_lo=(pc) / pc=pc+1 + -- 4 md_hi=md_lo / md_lo=(pc) / pc=pc+1 + -- 5 if cond pc=pc+md else pc=pc + -- + when "0010" => + -- increment the pc + pc_ctrl <= incr_pc; + next_state <= lbranch_state; + + -- + -- Single byte stack operators + -- Do not advance PC + -- + when "0011" => + case op_code(3 downto 0) is + when "1111" => -- swi 2 + -- predecrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + iv_ctrl <= swi2_iv; + st_ctrl <= push_st; + return_state <= vect_hi_state; + next_state <= int_entire_state; + + when others => + lic <= '1'; + next_state <= fetch_state; + end case; + + when "1000" => -- acca immediate + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- cmpd # + "1100" | -- cmpy # + "1110" => -- ldy # + next_state <= imm16_state; + + when others => + lic <= '1'; + next_state <= fetch_state; + + end case; + + when "1001" => -- acca direct + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- cmpd < + "1100" | -- cmpy < + "1110" => -- ldy < + next_state <= dual_op_read16_state; + + when "1111" => -- sty < + next_state <= dual_op_write16_state; + + when others => + lic <= '1'; + next_state <= fetch_state; + + end case; + + when "1010" => -- acca indexed + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- cmpd ,ind + "1100" | -- cmpy ,ind + "1110" => -- ldy ,ind + st_ctrl <= push_st; + return_state <= dual_op_read16_state; + next_state <= indexed_state; + + when "1111" => -- sty ,ind + st_ctrl <= push_st; + return_state <= dual_op_write16_state; + next_state <= indexed_state; + + when others => + lic <= '1'; + next_state <= fetch_state; + end case; + + when "1011" => -- acca extended + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- cmpd < + "1100" | -- cmpy < + "1110" => -- ldy < + st_ctrl <= push_st; + return_state <= dual_op_read16_state; + next_state <= extended_state; + + when "1111" => -- sty > + st_ctrl <= push_st; + return_state <= dual_op_write16_state; + next_state <= extended_state; + + when others => + lic <= '1'; + next_state <= fetch_state; + + end case; + + when "1100" => -- accb immediate + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- undef # + "1100" | -- undef # + "1110" => -- lds # + next_state <= imm16_state; + + when others => + next_state <= fetch_state; + + end case; + + when "1101" => -- accb direct + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- undef < + "1100" | -- undef < + "1110" => -- lds < + next_state <= dual_op_read16_state; + + when "1111" => -- sts < + next_state <= dual_op_write16_state; + + when others => + lic <= '1'; + next_state <= fetch_state; + + end case; + + when "1110" => -- accb indexed + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- undef ,ind + "1100" | -- undef ,ind + "1110" => -- lds ,ind + st_ctrl <= push_st; + return_state <= dual_op_read16_state; + next_state <= indexed_state; + + when "1111" => -- sts ,ind + st_ctrl <= push_st; + return_state <= dual_op_write16_state; + next_state <= indexed_state; + + when others => + lic <= '1'; + next_state <= fetch_state; + + end case; + + when "1111" => -- accb extended + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- undef > + "1100" | -- undef > + "1110" => -- lds > + st_ctrl <= push_st; + return_state <= dual_op_read16_state; + next_state <= extended_state; + + when "1111" => -- sts > + st_ctrl <= push_st; + return_state <= dual_op_write16_state; + next_state <= extended_state; + + when others => + lic <= '1'; + next_state <= fetch_state; + end case; + + when others => + lic <= '1'; + next_state <= fetch_state; + end case; + -- + -- Here to decode instruction + -- and fetch next byte of intruction + -- whether it be necessary or not + -- + when decode3_state => + ea_ctrl <= fetch_first_ea; + md_ctrl <= fetch_first_md; + addr_ctrl <= fetch_ad; + dout_ctrl <= md_lo_dout; + case op_code(7 downto 4) is + -- + -- Single byte stack operators + -- Do not advance PC + -- + when "0011" => + case op_code(3 downto 0) is + when "1111" => -- swi3 + -- predecrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + iv_ctrl <= swi3_iv; + st_ctrl <= push_st; + return_state <= vect_hi_state; + next_state <= int_entire_state; + when others => + lic <= '1'; + next_state <= fetch_state; + end case; + + when "1000" => -- acca immediate + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- cmpu # + "1100" | -- cmps # + "1110" => -- undef # + next_state <= imm16_state; + when others => + lic <= '1'; + next_state <= fetch_state; + end case; + + when "1001" => -- acca direct + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- cmpu < + "1100" | -- cmps < + "1110" => -- undef < + next_state <= dual_op_read16_state; + + when others => + lic <= '1'; + next_state <= fetch_state; + + end case; + + when "1010" => -- acca indexed + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- cmpu ,X + "1100" | -- cmps ,X + "1110" => -- undef ,X + st_ctrl <= push_st; + return_state <= dual_op_read16_state; + next_state <= indexed_state; + + when others => + lic <= '1'; + next_state <= fetch_state; + + end case; + + when "1011" => -- acca extended + -- increment the pc + pc_ctrl <= incr_pc; + case op_code(3 downto 0) is + when "0011" | -- cmpu > + "1100" | -- cmps > + "1110" => -- undef > + st_ctrl <= push_st; + return_state <= dual_op_read16_state; + next_state <= extended_state; + when others => + lic <= '1'; + next_state <= fetch_state; + end case; + + when others => + lic <= '1'; + next_state <= fetch_state; + end case; + + -- + -- here if ea holds low byte + -- Direct + -- Extended + -- Indexed + -- read memory location + -- + when single_op_read_state => + -- read memory into md + md_ctrl <= fetch_first_md; + addr_ctrl <= read_ad; + dout_ctrl <= md_lo_dout; + next_state <= single_op_exec_state; + + when single_op_exec_state => + case op_code(3 downto 0) is + when "0000" => -- neg + left_ctrl <= md_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_neg; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= single_op_write_state; + when "0011" => -- com + left_ctrl <= md_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_com; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= single_op_write_state; + when "0100" => -- lsr + left_ctrl <= md_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_lsr8; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= single_op_write_state; + when "0110" => -- ror + left_ctrl <= md_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_ror8; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= single_op_write_state; + when "0111" => -- asr + left_ctrl <= md_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_asr8; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= single_op_write_state; + when "1000" => -- asl + left_ctrl <= md_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_asl8; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= single_op_write_state; + when "1001" => -- rol + left_ctrl <= md_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_rol8; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= single_op_write_state; + when "1010" => -- dec + left_ctrl <= md_left; + right_ctrl <= one_right; + alu_ctrl <= alu_dec; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= single_op_write_state; + when "1011" => -- undefined + lic <= '1'; + next_state <= fetch_state; + when "1100" => -- inc + left_ctrl <= md_left; + right_ctrl <= one_right; + alu_ctrl <= alu_inc; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= single_op_write_state; + when "1101" => -- tst + left_ctrl <= md_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + cc_ctrl <= load_cc; + lic <= '1'; + next_state <= fetch_state; + when "1110" => -- jmp + left_ctrl <= md_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_ld16; + pc_ctrl <= load_pc; + lic <= '1'; + next_state <= fetch_state; + when "1111" => -- clr + left_ctrl <= md_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_clr; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= single_op_write_state; + when others => + lic <= '1'; + next_state <= fetch_state; + end case; + -- + -- single operand 8 bit write + -- Write low 8 bits of ALU output + -- EA holds address + -- MD holds data + -- + when single_op_write_state => + -- write ALU low byte output + addr_ctrl <= write_ad; + dout_ctrl <= md_lo_dout; + lic <= '1'; + next_state <= fetch_state; + + -- + -- here if ea holds address of low byte + -- read memory location + -- + when dual_op_read8_state => + -- read first data byte from ea + md_ctrl <= fetch_first_md; + addr_ctrl <= read_ad; + lic <= '1'; + next_state <= fetch_state; + + -- + -- Here to read a 16 bit value into MD + -- pointed to by the EA register + -- The first byte is read + -- and the EA is incremented + -- + when dual_op_read16_state => + -- increment the effective address + left_ctrl <= ea_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + ea_ctrl <= load_ea; + -- read the high byte of the 16 bit data + md_ctrl <= fetch_first_md; + addr_ctrl <= read_ad; + next_state <= dual_op_read16_2_state; + + -- + -- here to read the second byte + -- pointed to by EA into MD + -- + when dual_op_read16_2_state => + -- read the low byte of the 16 bit data + md_ctrl <= fetch_next_md; + addr_ctrl <= read_ad; + lic <= '1'; + next_state <= fetch_state; + + -- + -- 16 bit Write state + -- EA hold address of memory to write to + -- Advance the effective address in ALU + -- decode op_code to determine which + -- register to write + -- + when dual_op_write16_state => + -- increment the effective address + left_ctrl <= ea_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + ea_ctrl <= load_ea; + -- write the ALU hi byte at ea + addr_ctrl <= write_ad; + if op_code(6) = '0' then + case op_code(3 downto 0) is + when "1111" => -- stx / sty + case pre_code is + when "00010000" => -- page 2 -- sty + dout_ctrl <= iy_hi_dout; + when others => -- page 1 -- stx + dout_ctrl <= ix_hi_dout; + end case; + when others => + dout_ctrl <= md_hi_dout; + end case; + else + case op_code(3 downto 0) is + when "1101" => -- std + dout_ctrl <= acca_dout; -- acca is high byte of ACCD + when "1111" => -- stu / sts + case pre_code is + when "00010000" => -- page 2 -- sts + dout_ctrl <= sp_hi_dout; + when others => -- page 1 -- stu + dout_ctrl <= up_hi_dout; + end case; + when others => + dout_ctrl <= md_hi_dout; + end case; + end if; + next_state <= dual_op_write8_state; + + -- + -- Dual operand 8 bit write + -- Write 8 bit accumulator + -- or low byte of 16 bit register + -- EA holds address + -- decode opcode to determine + -- which register to apply to the bus + -- Also set the condition codes here + -- + when dual_op_write8_state => + if op_code(6) = '0' then + case op_code(3 downto 0) is + when "0111" => -- sta + dout_ctrl <= acca_dout; + when "1111" => -- stx / sty + case pre_code is + when "00010000" => -- page 2 -- sty + dout_ctrl <= iy_lo_dout; + when others => -- page 1 -- stx + dout_ctrl <= ix_lo_dout; + end case; + when others => + dout_ctrl <= md_lo_dout; + end case; + else + case op_code(3 downto 0) is + when "0111" => -- stb + dout_ctrl <= accb_dout; + when "1101" => -- std + dout_ctrl <= accb_dout; -- accb is low byte of accd + when "1111" => -- stu / sts + case pre_code is + when "00010000" => -- page 2 -- sts + dout_ctrl <= sp_lo_dout; + when others => -- page 1 -- stu + dout_ctrl <= up_lo_dout; + end case; + when others => + dout_ctrl <= md_lo_dout; + end case; + end if; + -- write ALU low byte output + addr_ctrl <= write_ad; + lic <= '1'; + next_state <= fetch_state; + + -- + -- 16 bit immediate addressing mode + -- + when imm16_state => + -- increment pc + pc_ctrl <= incr_pc; + -- fetch next immediate byte + md_ctrl <= fetch_next_md; + addr_ctrl <= fetch_ad; + lic <= '1'; + next_state <= fetch_state; + + -- + -- md & ea holds 8 bit index offset + -- calculate the effective memory address + -- using the alu + -- + when indexed_state => + -- + -- decode indexing mode + -- + if md(7) = '0' then + case md(6 downto 5) is + when "00" => + left_ctrl <= ix_left; + when "01" => + left_ctrl <= iy_left; + when "10" => + left_ctrl <= up_left; + when others => + -- when "11" => + left_ctrl <= sp_left; + end case; + right_ctrl <= md_sign5_right; + alu_ctrl <= alu_add16; + ea_ctrl <= load_ea; + next_state <= saved_state; + + else + case md(3 downto 0) is + when "0000" => -- ,R+ + case md(6 downto 5) is + when "00" => + left_ctrl <= ix_left; + when "01" => + left_ctrl <= iy_left; + when "10" => + left_ctrl <= up_left; + when others => + left_ctrl <= sp_left; + end case; + -- + right_ctrl <= zero_right; + alu_ctrl <= alu_add16; + ea_ctrl <= load_ea; + next_state <= postincr1_state; + + when "0001" => -- ,R++ + case md(6 downto 5) is + when "00" => + left_ctrl <= ix_left; + when "01" => + left_ctrl <= iy_left; + when "10" => + left_ctrl <= up_left; + when others => + -- when "11" => + left_ctrl <= sp_left; + end case; + right_ctrl <= zero_right; + alu_ctrl <= alu_add16; + ea_ctrl <= load_ea; + next_state <= postincr2_state; + + when "0010" => -- ,-R + case md(6 downto 5) is + when "00" => + left_ctrl <= ix_left; + ix_ctrl <= load_ix; + when "01" => + left_ctrl <= iy_left; + iy_ctrl <= load_iy; + when "10" => + left_ctrl <= up_left; + up_ctrl <= load_up; + when others => + -- when "11" => + left_ctrl <= sp_left; + sp_ctrl <= load_sp; + end case; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + ea_ctrl <= load_ea; + next_state <= saved_state; + + when "0011" => -- ,--R + case md(6 downto 5) is + when "00" => + left_ctrl <= ix_left; + ix_ctrl <= load_ix; + when "01" => + left_ctrl <= iy_left; + iy_ctrl <= load_iy; + when "10" => + left_ctrl <= up_left; + up_ctrl <= load_up; + when others => + -- when "11" => + left_ctrl <= sp_left; + sp_ctrl <= load_sp; + end case; + right_ctrl <= two_right; + alu_ctrl <= alu_sub16; + ea_ctrl <= load_ea; + if md(4) = '0' then + next_state <= saved_state; + else + next_state <= indirect_state; + end if; + + when "0100" => -- ,R (zero offset) + case md(6 downto 5) is + when "00" => + left_ctrl <= ix_left; + when "01" => + left_ctrl <= iy_left; + when "10" => + left_ctrl <= up_left; + when others => + -- when "11" => + left_ctrl <= sp_left; + end case; + right_ctrl <= zero_right; + alu_ctrl <= alu_add16; + ea_ctrl <= load_ea; + if md(4) = '0' then + next_state <= saved_state; + else + next_state <= indirect_state; + end if; + + when "0101" => -- ACCB,R + case md(6 downto 5) is + when "00" => + left_ctrl <= ix_left; + when "01" => + left_ctrl <= iy_left; + when "10" => + left_ctrl <= up_left; + when others => + -- when "11" => + left_ctrl <= sp_left; + end case; + right_ctrl <= accb_right; + alu_ctrl <= alu_add16; + ea_ctrl <= load_ea; + if md(4) = '0' then + next_state <= saved_state; + else + next_state <= indirect_state; + end if; + + when "0110" => -- ACCA,R + case md(6 downto 5) is + when "00" => + left_ctrl <= ix_left; + when "01" => + left_ctrl <= iy_left; + when "10" => + left_ctrl <= up_left; + when others => + -- when "11" => + left_ctrl <= sp_left; + end case; + right_ctrl <= acca_right; + alu_ctrl <= alu_add16; + ea_ctrl <= load_ea; + if md(4) = '0' then + next_state <= saved_state; + else + next_state <= indirect_state; + end if; + + when "0111" => -- undefined + case md(6 downto 5) is + when "00" => + left_ctrl <= ix_left; + when "01" => + left_ctrl <= iy_left; + when "10" => + left_ctrl <= up_left; + when others => + -- when "11" => + left_ctrl <= sp_left; + end case; + right_ctrl <= zero_right; + alu_ctrl <= alu_add16; + ea_ctrl <= load_ea; + if md(4) = '0' then + next_state <= saved_state; + else + next_state <= indirect_state; + end if; + + when "1000" => -- offset8,R + md_ctrl <= fetch_first_md; -- pick up 8 bit offset + addr_ctrl <= fetch_ad; + pc_ctrl <= incr_pc; + next_state <= index8_state; + + when "1001" => -- offset16,R + md_ctrl <= fetch_first_md; -- pick up first byte of 16 bit offset + addr_ctrl <= fetch_ad; + pc_ctrl <= incr_pc; + next_state <= index16_state; + + when "1010" => -- undefined + case md(6 downto 5) is + when "00" => + left_ctrl <= ix_left; + when "01" => + left_ctrl <= iy_left; + when "10" => + left_ctrl <= up_left; + when others => + -- when "11" => + left_ctrl <= sp_left; + end case; + right_ctrl <= zero_right; + alu_ctrl <= alu_add16; + ea_ctrl <= load_ea; + -- + if md(4) = '0' then + next_state <= saved_state; + else + next_state <= indirect_state; + end if; + + when "1011" => -- ACCD,R + case md(6 downto 5) is + when "00" => + left_ctrl <= ix_left; + when "01" => + left_ctrl <= iy_left; + when "10" => + left_ctrl <= up_left; + when others => + -- when "11" => + left_ctrl <= sp_left; + end case; + right_ctrl <= accd_right; + alu_ctrl <= alu_add16; + ea_ctrl <= load_ea; + if md(4) = '0' then + next_state <= saved_state; + else + next_state <= indirect_state; + end if; + + when "1100" => -- offset8,PC + -- fetch 8 bit offset + md_ctrl <= fetch_first_md; + addr_ctrl <= fetch_ad; + pc_ctrl <= incr_pc; + next_state <= pcrel8_state; + + when "1101" => -- offset16,PC + -- fetch offset + md_ctrl <= fetch_first_md; + addr_ctrl <= fetch_ad; + pc_ctrl <= incr_pc; + next_state <= pcrel16_state; + + when "1110" => -- undefined + case md(6 downto 5) is + when "00" => + left_ctrl <= ix_left; + when "01" => + left_ctrl <= iy_left; + when "10" => + left_ctrl <= up_left; + when others => + -- when "11" => + left_ctrl <= sp_left; + end case; + right_ctrl <= zero_right; + alu_ctrl <= alu_add16; + ea_ctrl <= load_ea; + if md(4) = '0' then + next_state <= saved_state; + else + next_state <= indirect_state; + end if; + + when others => +-- when "1111" => -- [,address] + -- advance PC to pick up address + md_ctrl <= fetch_first_md; + addr_ctrl <= fetch_ad; + pc_ctrl <= incr_pc; + next_state <= indexaddr_state; + end case; + end if; + + -- load index register with ea plus one + when postincr1_state => + left_ctrl <= ea_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + case md(6 downto 5) is + when "00" => + ix_ctrl <= load_ix; + when "01" => + iy_ctrl <= load_iy; + when "10" => + up_ctrl <= load_up; + when others => + -- when "11" => + sp_ctrl <= load_sp; + end case; + -- return to previous state + if md(4) = '0' then + next_state <= saved_state; + else + next_state <= indirect_state; + end if; + + -- load index register with ea plus two + when postincr2_state => + -- increment register by two (address) + left_ctrl <= ea_left; + right_ctrl <= two_right; + alu_ctrl <= alu_add16; + case md(6 downto 5) is + when "00" => + ix_ctrl <= load_ix; + when "01" => + iy_ctrl <= load_iy; + when "10" => + up_ctrl <= load_up; + when others => + -- when "11" => + sp_ctrl <= load_sp; + end case; + -- return to previous state + if md(4) = '0' then + next_state <= saved_state; + else + next_state <= indirect_state; + end if; + -- + -- ea = index register + md (8 bit signed offset) + -- ea holds post byte + -- + when index8_state => + case ea(6 downto 5) is + when "00" => + left_ctrl <= ix_left; + when "01" => + left_ctrl <= iy_left; + when "10" => + left_ctrl <= up_left; + when others => + -- when "11" => + left_ctrl <= sp_left; + end case; + -- ea = index reg + md + right_ctrl <= md_sign8_right; + alu_ctrl <= alu_add16; + ea_ctrl <= load_ea; + -- return to previous state + if ea(4) = '0' then + next_state <= saved_state; + else + next_state <= indirect_state; + end if; + + -- fetch low byte of 16 bit indexed offset + when index16_state => + -- advance pc + pc_ctrl <= incr_pc; + -- fetch low byte + md_ctrl <= fetch_next_md; + addr_ctrl <= fetch_ad; + next_state <= index16_2_state; + + -- ea = index register + md (16 bit offset) + -- ea holds post byte + when index16_2_state => + case ea(6 downto 5) is + when "00" => + left_ctrl <= ix_left; + when "01" => + left_ctrl <= iy_left; + when "10" => + left_ctrl <= up_left; + when others => + -- when "11" => + left_ctrl <= sp_left; + end case; + -- ea = index reg + md + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + ea_ctrl <= load_ea; + -- return to previous state + if ea(4) = '0' then + next_state <= saved_state; + else + next_state <= indirect_state; + end if; + -- + -- pc relative with 8 bit signed offest + -- md holds signed offset + -- + when pcrel8_state => + -- ea = pc + signed md + left_ctrl <= pc_left; + right_ctrl <= md_sign8_right; + alu_ctrl <= alu_add16; + ea_ctrl <= load_ea; + -- return to previous state + if ea(4) = '0' then + next_state <= saved_state; + else + next_state <= indirect_state; + end if; + + -- pc relative addressing with 16 bit offset + -- pick up the low byte of the offset in md + -- advance the pc + when pcrel16_state => + -- advance pc + pc_ctrl <= incr_pc; + -- fetch low byte + md_ctrl <= fetch_next_md; + addr_ctrl <= fetch_ad; + next_state <= pcrel16_2_state; + + -- pc relative with16 bit signed offest + -- md holds signed offset + when pcrel16_2_state => + -- ea = pc + md + left_ctrl <= pc_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + ea_ctrl <= load_ea; + -- return to previous state + if ea(4) = '0' then + next_state <= saved_state; + else + next_state <= indirect_state; + end if; + + -- indexed to address + -- pick up the low byte of the address + -- advance the pc + when indexaddr_state => + -- advance pc + pc_ctrl <= incr_pc; + -- fetch low byte + md_ctrl <= fetch_next_md; + addr_ctrl <= fetch_ad; + next_state <= indexaddr2_state; + + -- indexed to absolute address + -- md holds address + -- ea hold indexing mode byte + when indexaddr2_state => + -- ea = md + left_ctrl <= pc_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld16; + ea_ctrl <= load_ea; + -- return to previous state + if ea(4) = '0' then + next_state <= saved_state; + else + next_state <= indirect_state; + end if; + + -- + -- load md with high byte of indirect address + -- pointed to by ea + -- increment ea + -- + when indirect_state => + -- increment ea + left_ctrl <= ea_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + ea_ctrl <= load_ea; + -- fetch high byte + md_ctrl <= fetch_first_md; + addr_ctrl <= read_ad; + next_state <= indirect2_state; + -- + -- load md with low byte of indirect address + -- pointed to by ea + -- ea has previously been incremented + -- + when indirect2_state => + -- fetch high byte + md_ctrl <= fetch_next_md; + addr_ctrl <= read_ad; + dout_ctrl <= md_lo_dout; + next_state <= indirect3_state; + -- + -- complete idirect addressing + -- by loading ea with md + -- + when indirect3_state => + -- load ea with md + left_ctrl <= ea_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld16; + ea_ctrl <= load_ea; + -- return to previous state + next_state <= saved_state; + + -- + -- ea holds the low byte of the absolute address + -- Move ea low byte into ea high byte + -- load new ea low byte to for absolute 16 bit address + -- advance the program counter + -- + when extended_state => -- fetch ea low byte + -- increment pc + pc_ctrl <= incr_pc; + -- fetch next effective address bytes + ea_ctrl <= fetch_next_ea; + addr_ctrl <= fetch_ad; + -- return to previous state + next_state <= saved_state; + + when lea_state => -- here on load effective address + -- load index register with effective address + left_ctrl <= pc_left; + right_ctrl <= ea_right; + alu_ctrl <= alu_lea; + case op_code(3 downto 0) is + when "0000" => -- leax + cc_ctrl <= load_cc; + ix_ctrl <= load_ix; + when "0001" => -- leay + cc_ctrl <= load_cc; + iy_ctrl <= load_iy; + when "0010" => -- leas + sp_ctrl <= load_sp; + when "0011" => -- leau + up_ctrl <= load_up; + when others => + null; + end case; + lic <= '1'; + next_state <= fetch_state; + + -- + -- jump to subroutine + -- sp=sp-1 + -- call push_return_lo_state to save pc + -- return to jmp_state + -- + when jsr_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- call push_return_state + st_ctrl <= push_st; + return_state <= jmp_state; + next_state <= push_return_lo_state; + + -- + -- Load pc with ea + -- (JMP) + -- + when jmp_state => + -- load PC with effective address + left_ctrl <= pc_left; + right_ctrl <= ea_right; + alu_ctrl <= alu_ld16; + pc_ctrl <= load_pc; + lic <= '1'; + next_state <= fetch_state; + + -- + -- long branch or branch to subroutine + -- pick up next md byte + -- md_hi = md_lo + -- md_lo = (pc) + -- pc=pc+1 + -- if a lbsr push return address + -- continue to sbranch_state + -- to evaluate conditional branches + -- + when lbranch_state => + pc_ctrl <= incr_pc; + -- fetch the next byte into md_lo + md_ctrl <= fetch_next_md; + addr_ctrl <= fetch_ad; + -- if lbsr - push return address + -- then continue on to short branch + if op_code = "00010111" then + st_ctrl <= push_st; + return_state <= sbranch_state; + next_state <= push_return_lo_state; + else + next_state <= sbranch_state; + end if; + + -- + -- here to execute conditional branch + -- short conditional branch md = signed 8 bit offset + -- long branch md = 16 bit offset + -- + when sbranch_state => + left_ctrl <= pc_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + -- Test condition for branch + if op_code(7 downto 4) = "0010" then -- conditional branch + case op_code(3 downto 0) is + when "0000" => -- bra + cond_true := (1 = 1); + when "0001" => -- brn + cond_true := (1 = 0); + when "0010" => -- bhi + cond_true := ((cc(CBIT) or cc(ZBIT)) = '0'); + when "0011" => -- bls + cond_true := ((cc(CBIT) or cc(ZBIT)) = '1'); + when "0100" => -- bcc/bhs + cond_true := (cc(CBIT) = '0'); + when "0101" => -- bcs/blo + cond_true := (cc(CBIT) = '1'); + when "0110" => -- bne + cond_true := (cc(ZBIT) = '0'); + when "0111" => -- beq + cond_true := (cc(ZBIT) = '1'); + when "1000" => -- bvc + cond_true := (cc(VBIT) = '0'); + when "1001" => -- bvs + cond_true := (cc(VBIT) = '1'); + when "1010" => -- bpl + cond_true := (cc(NBIT) = '0'); + when "1011" => -- bmi + cond_true := (cc(NBIT) = '1'); + when "1100" => -- bge + cond_true := ((cc(NBIT) xor cc(VBIT)) = '0'); + when "1101" => -- blt + cond_true := ((cc(NBIT) xor cc(VBIT)) = '1'); + when "1110" => -- bgt + cond_true := ((cc(ZBIT) or (cc(NBIT) xor cc(VBIT))) = '0'); + when "1111" => -- ble + cond_true := ((cc(ZBIT) or (cc(NBIT) xor cc(VBIT))) = '1'); + when others => + null; + end case; + end if; + if cond_true then + pc_ctrl <= load_pc; + end if; + lic <= '1'; + next_state <= fetch_state; + + -- + -- push return address onto the S stack + -- + -- (sp) = pc_lo + -- sp = sp - 1 + -- + when push_return_lo_state => + -- decrement the sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- write PC low + addr_ctrl <= pushs_ad; + dout_ctrl <= pc_lo_dout; + next_state <= push_return_hi_state; + + -- + -- push program counter hi byte onto the stack + -- (sp) = pc_hi + -- sp = sp + -- return to originating state + -- + when push_return_hi_state => + -- write pc hi bytes + addr_ctrl <= pushs_ad; + dout_ctrl <= pc_hi_dout; + next_state <= saved_state; + + -- + -- RTS pull return address from stack + -- + when pull_return_hi_state => + -- increment the sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read pc hi + pc_ctrl <= pull_hi_pc; + addr_ctrl <= pulls_ad; + next_state <= pull_return_lo_state; + + when pull_return_lo_state => + -- increment the SP + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read pc low + pc_ctrl <= pull_lo_pc; + addr_ctrl <= pulls_ad; + dout_ctrl <= pc_lo_dout; + -- + lic <= '1'; + next_state <= fetch_state; + + when andcc_state => + -- AND CC with md + left_ctrl <= md_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_andcc; + cc_ctrl <= load_cc; + -- + lic <= '1'; + next_state <= fetch_state; + + when orcc_state => + -- OR CC with md + left_ctrl <= md_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_orcc; + cc_ctrl <= load_cc; + -- + lic <= '1'; + next_state <= fetch_state; + + when tfr_state => + -- select source register + case md(7 downto 4) is + when "0000" => + left_ctrl <= accd_left; + when "0001" => + left_ctrl <= ix_left; + when "0010" => + left_ctrl <= iy_left; + when "0011" => + left_ctrl <= up_left; + when "0100" => + left_ctrl <= sp_left; + when "0101" => + left_ctrl <= pc_left; + when "1000" => + left_ctrl <= acca_left; + when "1001" => + left_ctrl <= accb_left; + when "1010" => + left_ctrl <= cc_left; + when "1011" => + left_ctrl <= dp_left; + when others => + left_ctrl <= md_left; + end case; + right_ctrl <= zero_right; + alu_ctrl <= alu_tfr; + -- select destination register + case md(3 downto 0) is + when "0000" => -- accd + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + when "0001" => -- ix + ix_ctrl <= load_ix; + when "0010" => -- iy + iy_ctrl <= load_iy; + when "0011" => -- up + up_ctrl <= load_up; + when "0100" => -- sp + sp_ctrl <= load_sp; + when "0101" => -- pc + pc_ctrl <= load_pc; + when "1000" => -- acca + acca_ctrl <= load_acca; + when "1001" => -- accb + accb_ctrl <= load_accb; + when "1010" => -- cc + cc_ctrl <= load_cc; + when "1011" => --dp + dp_ctrl <= load_dp; + when others => + null; + end case; + -- + lic <= '1'; + next_state <= fetch_state; + + when exg_state => + -- save destination register + case md(3 downto 0) is + when "0000" => + left_ctrl <= accd_left; + when "0001" => + left_ctrl <= ix_left; + when "0010" => + left_ctrl <= iy_left; + when "0011" => + left_ctrl <= up_left; + when "0100" => + left_ctrl <= sp_left; + when "0101" => + left_ctrl <= pc_left; + when "1000" => + left_ctrl <= acca_left; + when "1001" => + left_ctrl <= accb_left; + when "1010" => + left_ctrl <= cc_left; + when "1011" => + left_ctrl <= dp_left; + when others => + left_ctrl <= md_left; + end case; + right_ctrl <= zero_right; + alu_ctrl <= alu_tfr; + ea_ctrl <= load_ea; + -- call tranfer microcode + next_state <= exg1_state; + + when exg1_state => + -- select source register + case md(7 downto 4) is + when "0000" => + left_ctrl <= accd_left; + when "0001" => + left_ctrl <= ix_left; + when "0010" => + left_ctrl <= iy_left; + when "0011" => + left_ctrl <= up_left; + when "0100" => + left_ctrl <= sp_left; + when "0101" => + left_ctrl <= pc_left; + when "1000" => + left_ctrl <= acca_left; + when "1001" => + left_ctrl <= accb_left; + when "1010" => + left_ctrl <= cc_left; + when "1011" => + left_ctrl <= dp_left; + when others => + left_ctrl <= md_left; + end case; + right_ctrl <= zero_right; + alu_ctrl <= alu_tfr; + -- select destination register + case md(3 downto 0) is + when "0000" => -- accd + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + when "0001" => -- ix + ix_ctrl <= load_ix; + when "0010" => -- iy + iy_ctrl <= load_iy; + when "0011" => -- up + up_ctrl <= load_up; + when "0100" => -- sp + sp_ctrl <= load_sp; + when "0101" => -- pc + pc_ctrl <= load_pc; + when "1000" => -- acca + acca_ctrl <= load_acca; + when "1001" => -- accb + accb_ctrl <= load_accb; + when "1010" => -- cc + cc_ctrl <= load_cc; + when "1011" => --dp + dp_ctrl <= load_dp; + when others => + null; + end case; + next_state <= exg2_state; + + when exg2_state => + -- restore destination + left_ctrl <= ea_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_tfr; + -- save as source register + case md(7 downto 4) is + when "0000" => -- accd + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + when "0001" => -- ix + ix_ctrl <= load_ix; + when "0010" => -- iy + iy_ctrl <= load_iy; + when "0011" => -- up + up_ctrl <= load_up; + when "0100" => -- sp + sp_ctrl <= load_sp; + when "0101" => -- pc + pc_ctrl <= load_pc; + when "1000" => -- acca + acca_ctrl <= load_acca; + when "1001" => -- accb + accb_ctrl <= load_accb; + when "1010" => -- cc + cc_ctrl <= load_cc; + when "1011" => --dp + dp_ctrl <= load_dp; + when others => + null; + end case; + lic <= '1'; + next_state <= fetch_state; + + when mul_state => + -- move acca to md + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + md_ctrl <= load_md; + next_state <= mulea_state; + + when mulea_state => + -- move accb to ea + left_ctrl <= accb_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + ea_ctrl <= load_ea; + next_state <= muld_state; + + when muld_state => + -- clear accd + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_ld8; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + next_state <= mul0_state; + + when mul0_state => + -- if bit 0 of ea set, add accd to md + left_ctrl <= accd_left; + if ea(0) = '1' then + right_ctrl <= md_right; + else + right_ctrl <= zero_right; + end if; + alu_ctrl <= alu_mul; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + md_ctrl <= shiftl_md; + next_state <= mul1_state; + + when mul1_state => + -- if bit 1 of ea set, add accd to md + left_ctrl <= accd_left; + if ea(1) = '1' then + right_ctrl <= md_right; + else + right_ctrl <= zero_right; + end if; + alu_ctrl <= alu_mul; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + md_ctrl <= shiftl_md; + next_state <= mul2_state; + + when mul2_state => + -- if bit 2 of ea set, add accd to md + left_ctrl <= accd_left; + if ea(2) = '1' then + right_ctrl <= md_right; + else + right_ctrl <= zero_right; + end if; + alu_ctrl <= alu_mul; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + md_ctrl <= shiftl_md; + next_state <= mul3_state; + + when mul3_state => + -- if bit 3 of ea set, add accd to md + left_ctrl <= accd_left; + if ea(3) = '1' then + right_ctrl <= md_right; + else + right_ctrl <= zero_right; + end if; + alu_ctrl <= alu_mul; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + md_ctrl <= shiftl_md; + next_state <= mul4_state; + + when mul4_state => + -- if bit 4 of ea set, add accd to md + left_ctrl <= accd_left; + if ea(4) = '1' then + right_ctrl <= md_right; + else + right_ctrl <= zero_right; + end if; + alu_ctrl <= alu_mul; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + md_ctrl <= shiftl_md; + next_state <= mul5_state; + + when mul5_state => + -- if bit 5 of ea set, add accd to md + left_ctrl <= accd_left; + if ea(5) = '1' then + right_ctrl <= md_right; + else + right_ctrl <= zero_right; + end if; + alu_ctrl <= alu_mul; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + md_ctrl <= shiftl_md; + next_state <= mul6_state; + + when mul6_state => + -- if bit 6 of ea set, add accd to md + left_ctrl <= accd_left; + if ea(6) = '1' then + right_ctrl <= md_right; + else + right_ctrl <= zero_right; + end if; + alu_ctrl <= alu_mul; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + md_ctrl <= shiftl_md; + next_state <= mul7_state; + + when mul7_state => + -- if bit 7 of ea set, add accd to md + left_ctrl <= accd_left; + if ea(7) = '1' then + right_ctrl <= md_right; + else + right_ctrl <= zero_right; + end if; + alu_ctrl <= alu_mul; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + md_ctrl <= shiftl_md; + lic <= '1'; + next_state <= fetch_state; + + -- + -- Enter here on pushs + -- ea holds post byte + -- + when pshs_state => + -- decrement sp if any registers to be pushed + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + -- idle address + addr_ctrl <= idle_ad; + dout_ctrl <= cc_dout; + if ea(7 downto 0) = "00000000" then + sp_ctrl <= latch_sp; + else + sp_ctrl <= load_sp; + end if; + if ea(7) = '1' then + next_state <= pshs_pcl_state; + elsif ea(6) = '1' then + next_state <= pshs_upl_state; + elsif ea(5) = '1' then + next_state <= pshs_iyl_state; + elsif ea(4) = '1' then + next_state <= pshs_ixl_state; + elsif ea(3) = '1' then + next_state <= pshs_dp_state; + elsif ea(2) = '1' then + next_state <= pshs_accb_state; + elsif ea(1) = '1' then + next_state <= pshs_acca_state; + elsif ea(0) = '1' then + next_state <= pshs_cc_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pshs_pcl_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- write pc low + addr_ctrl <= pushs_ad; + dout_ctrl <= pc_lo_dout; + next_state <= pshs_pch_state; + + when pshs_pch_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + if ea(6 downto 0) = "0000000" then + sp_ctrl <= latch_sp; + else + sp_ctrl <= load_sp; + end if; + -- write pc hi + addr_ctrl <= pushs_ad; + dout_ctrl <= pc_hi_dout; + if ea(6) = '1' then + next_state <= pshs_upl_state; + elsif ea(5) = '1' then + next_state <= pshs_iyl_state; + elsif ea(4) = '1' then + next_state <= pshs_ixl_state; + elsif ea(3) = '1' then + next_state <= pshs_dp_state; + elsif ea(2) = '1' then + next_state <= pshs_accb_state; + elsif ea(1) = '1' then + next_state <= pshs_acca_state; + elsif ea(0) = '1' then + next_state <= pshs_cc_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + + when pshs_upl_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- write pc low + addr_ctrl <= pushs_ad; + dout_ctrl <= up_lo_dout; + next_state <= pshs_uph_state; + + when pshs_uph_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + if ea(5 downto 0) = "000000" then + sp_ctrl <= latch_sp; + else + sp_ctrl <= load_sp; + end if; + -- write pc hi + addr_ctrl <= pushs_ad; + dout_ctrl <= up_hi_dout; + if ea(5) = '1' then + next_state <= pshs_iyl_state; + elsif ea(4) = '1' then + next_state <= pshs_ixl_state; + elsif ea(3) = '1' then + next_state <= pshs_dp_state; + elsif ea(2) = '1' then + next_state <= pshs_accb_state; + elsif ea(1) = '1' then + next_state <= pshs_acca_state; + elsif ea(0) = '1' then + next_state <= pshs_cc_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pshs_iyl_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- write iy low + addr_ctrl <= pushs_ad; + dout_ctrl <= iy_lo_dout; + next_state <= pshs_iyh_state; + + when pshs_iyh_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + if ea(4 downto 0) = "00000" then + sp_ctrl <= latch_sp; + else + sp_ctrl <= load_sp; + end if; + -- write iy hi + addr_ctrl <= pushs_ad; + dout_ctrl <= iy_hi_dout; + if ea(4) = '1' then + next_state <= pshs_ixl_state; + elsif ea(3) = '1' then + next_state <= pshs_dp_state; + elsif ea(2) = '1' then + next_state <= pshs_accb_state; + elsif ea(1) = '1' then + next_state <= pshs_acca_state; + elsif ea(0) = '1' then + next_state <= pshs_cc_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pshs_ixl_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- write ix low + addr_ctrl <= pushs_ad; + dout_ctrl <= ix_lo_dout; + next_state <= pshs_ixh_state; + + when pshs_ixh_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + if ea(3 downto 0) = "0000" then + sp_ctrl <= latch_sp; + else + sp_ctrl <= load_sp; + end if; + -- write ix hi + addr_ctrl <= pushs_ad; + dout_ctrl <= ix_hi_dout; + if ea(3) = '1' then + next_state <= pshs_dp_state; + elsif ea(2) = '1' then + next_state <= pshs_accb_state; + elsif ea(1) = '1' then + next_state <= pshs_acca_state; + elsif ea(0) = '1' then + next_state <= pshs_cc_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pshs_dp_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + if ea(2 downto 0) = "000" then + sp_ctrl <= latch_sp; + else + sp_ctrl <= load_sp; + end if; + -- write dp + addr_ctrl <= pushs_ad; + dout_ctrl <= dp_dout; + if ea(2) = '1' then + next_state <= pshs_accb_state; + elsif ea(1) = '1' then + next_state <= pshs_acca_state; + elsif ea(0) = '1' then + next_state <= pshs_cc_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pshs_accb_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + if ea(1 downto 0) = "00" then + sp_ctrl <= latch_sp; + else + sp_ctrl <= load_sp; + end if; + -- write accb + addr_ctrl <= pushs_ad; + dout_ctrl <= accb_dout; + if ea(1) = '1' then + next_state <= pshs_acca_state; + elsif ea(0) = '1' then + next_state <= pshs_cc_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pshs_acca_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + if ea(0) = '1' then + sp_ctrl <= load_sp; + else + sp_ctrl <= latch_sp; + end if; + -- write acca + addr_ctrl <= pushs_ad; + dout_ctrl <= acca_dout; + if ea(0) = '1' then + next_state <= pshs_cc_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pshs_cc_state => + -- idle sp + -- write cc + addr_ctrl <= pushs_ad; + dout_ctrl <= cc_dout; + lic <= '1'; + next_state <= fetch_state; + + -- + -- enter here on PULS + -- ea hold register mask + -- + when puls_state => + if ea(0) = '1' then + next_state <= puls_cc_state; + elsif ea(1) = '1' then + next_state <= puls_acca_state; + elsif ea(2) = '1' then + next_state <= puls_accb_state; + elsif ea(3) = '1' then + next_state <= puls_dp_state; + elsif ea(4) = '1' then + next_state <= puls_ixh_state; + elsif ea(5) = '1' then + next_state <= puls_iyh_state; + elsif ea(6) = '1' then + next_state <= puls_uph_state; + elsif ea(7) = '1' then + next_state <= puls_pch_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when puls_cc_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read cc + cc_ctrl <= pull_cc; + addr_ctrl <= pulls_ad; + if ea(1) = '1' then + next_state <= puls_acca_state; + elsif ea(2) = '1' then + next_state <= puls_accb_state; + elsif ea(3) = '1' then + next_state <= puls_dp_state; + elsif ea(4) = '1' then + next_state <= puls_ixh_state; + elsif ea(5) = '1' then + next_state <= puls_iyh_state; + elsif ea(6) = '1' then + next_state <= puls_uph_state; + elsif ea(7) = '1' then + next_state <= puls_pch_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when puls_acca_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read acca + acca_ctrl <= pull_acca; + addr_ctrl <= pulls_ad; + if ea(2) = '1' then + next_state <= puls_accb_state; + elsif ea(3) = '1' then + next_state <= puls_dp_state; + elsif ea(4) = '1' then + next_state <= puls_ixh_state; + elsif ea(5) = '1' then + next_state <= puls_iyh_state; + elsif ea(6) = '1' then + next_state <= puls_uph_state; + elsif ea(7) = '1' then + next_state <= puls_pch_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when puls_accb_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read accb + accb_ctrl <= pull_accb; + addr_ctrl <= pulls_ad; + if ea(3) = '1' then + next_state <= puls_dp_state; + elsif ea(4) = '1' then + next_state <= puls_ixh_state; + elsif ea(5) = '1' then + next_state <= puls_iyh_state; + elsif ea(6) = '1' then + next_state <= puls_uph_state; + elsif ea(7) = '1' then + next_state <= puls_pch_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when puls_dp_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read dp + dp_ctrl <= pull_dp; + addr_ctrl <= pulls_ad; + if ea(4) = '1' then + next_state <= puls_ixh_state; + elsif ea(5) = '1' then + next_state <= puls_iyh_state; + elsif ea(6) = '1' then + next_state <= puls_uph_state; + elsif ea(7) = '1' then + next_state <= puls_pch_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when puls_ixh_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- pull ix hi + ix_ctrl <= pull_hi_ix; + addr_ctrl <= pulls_ad; + next_state <= puls_ixl_state; + + when puls_ixl_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read ix low + ix_ctrl <= pull_lo_ix; + addr_ctrl <= pulls_ad; + if ea(5) = '1' then + next_state <= puls_iyh_state; + elsif ea(6) = '1' then + next_state <= puls_uph_state; + elsif ea(7) = '1' then + next_state <= puls_pch_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when puls_iyh_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- pull iy hi + iy_ctrl <= pull_hi_iy; + addr_ctrl <= pulls_ad; + next_state <= puls_iyl_state; + + when puls_iyl_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read iy low + iy_ctrl <= pull_lo_iy; + addr_ctrl <= pulls_ad; + if ea(6) = '1' then + next_state <= puls_uph_state; + elsif ea(7) = '1' then + next_state <= puls_pch_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when puls_uph_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- pull up hi + up_ctrl <= pull_hi_up; + addr_ctrl <= pulls_ad; + next_state <= puls_upl_state; + + when puls_upl_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read up low + up_ctrl <= pull_lo_up; + addr_ctrl <= pulls_ad; + if ea(7) = '1' then + next_state <= puls_pch_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when puls_pch_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- pull pc hi + pc_ctrl <= pull_hi_pc; + addr_ctrl <= pulls_ad; + next_state <= puls_pcl_state; + + when puls_pcl_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read pc low + pc_ctrl <= pull_lo_pc; + addr_ctrl <= pulls_ad; + lic <= '1'; + next_state <= fetch_state; + + -- + -- Enter here on pshu + -- ea holds post byte + -- + when pshu_state => + -- decrement up if any registers to be pushed + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + if ea(7 downto 0) = "00000000" then + up_ctrl <= latch_up; + else + up_ctrl <= load_up; + end if; + -- write idle bus + if ea(7) = '1' then + next_state <= pshu_pcl_state; + elsif ea(6) = '1' then + next_state <= pshu_spl_state; + elsif ea(5) = '1' then + next_state <= pshu_iyl_state; + elsif ea(4) = '1' then + next_state <= pshu_ixl_state; + elsif ea(3) = '1' then + next_state <= pshu_dp_state; + elsif ea(2) = '1' then + next_state <= pshu_accb_state; + elsif ea(1) = '1' then + next_state <= pshu_acca_state; + elsif ea(0) = '1' then + next_state <= pshu_cc_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + -- + -- push PC onto U stack + -- + when pshu_pcl_state => + -- decrement up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + up_ctrl <= load_up; + -- write pc low + addr_ctrl <= pushu_ad; + dout_ctrl <= pc_lo_dout; + next_state <= pshu_pch_state; + + when pshu_pch_state => + -- decrement up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + if ea(6 downto 0) = "0000000" then + up_ctrl <= latch_up; + else + up_ctrl <= load_up; + end if; + -- write pc hi + addr_ctrl <= pushu_ad; + dout_ctrl <= pc_hi_dout; + if ea(6) = '1' then + next_state <= pshu_spl_state; + elsif ea(5) = '1' then + next_state <= pshu_iyl_state; + elsif ea(4) = '1' then + next_state <= pshu_ixl_state; + elsif ea(3) = '1' then + next_state <= pshu_dp_state; + elsif ea(2) = '1' then + next_state <= pshu_accb_state; + elsif ea(1) = '1' then + next_state <= pshu_acca_state; + elsif ea(0) = '1' then + next_state <= pshu_cc_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pshu_spl_state => + -- decrement up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + up_ctrl <= load_up; + -- write sp low + addr_ctrl <= pushu_ad; + dout_ctrl <= sp_lo_dout; + next_state <= pshu_sph_state; + + when pshu_sph_state => + -- decrement up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + if ea(5 downto 0) = "000000" then + up_ctrl <= latch_up; + else + up_ctrl <= load_up; + end if; + -- write sp hi + addr_ctrl <= pushu_ad; + dout_ctrl <= sp_hi_dout; + if ea(5) = '1' then + next_state <= pshu_iyl_state; + elsif ea(4) = '1' then + next_state <= pshu_ixl_state; + elsif ea(3) = '1' then + next_state <= pshu_dp_state; + elsif ea(2) = '1' then + next_state <= pshu_accb_state; + elsif ea(1) = '1' then + next_state <= pshu_acca_state; + elsif ea(0) = '1' then + next_state <= pshu_cc_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pshu_iyl_state => + -- decrement up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + up_ctrl <= load_up; + -- write iy low + addr_ctrl <= pushu_ad; + dout_ctrl <= iy_lo_dout; + next_state <= pshu_iyh_state; + + when pshu_iyh_state => + -- decrement up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + if ea(4 downto 0) = "00000" then + up_ctrl <= latch_up; + else + up_ctrl <= load_up; + end if; + -- write iy hi + addr_ctrl <= pushu_ad; + dout_ctrl <= iy_hi_dout; + if ea(4) = '1' then + next_state <= pshu_ixl_state; + elsif ea(3) = '1' then + next_state <= pshu_dp_state; + elsif ea(2) = '1' then + next_state <= pshu_accb_state; + elsif ea(1) = '1' then + next_state <= pshu_acca_state; + elsif ea(0) = '1' then + next_state <= pshu_cc_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pshu_ixl_state => + -- decrement up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + up_ctrl <= load_up; + -- write ix low + addr_ctrl <= pushu_ad; + dout_ctrl <= ix_lo_dout; + next_state <= pshu_ixh_state; + + when pshu_ixh_state => + -- decrement up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + if ea(3 downto 0) = "0000" then + up_ctrl <= latch_up; + else + up_ctrl <= load_up; + end if; + -- write ix hi + addr_ctrl <= pushu_ad; + dout_ctrl <= ix_hi_dout; + if ea(3) = '1' then + next_state <= pshu_dp_state; + elsif ea(2) = '1' then + next_state <= pshu_accb_state; + elsif ea(1) = '1' then + next_state <= pshu_acca_state; + elsif ea(0) = '1' then + next_state <= pshu_cc_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pshu_dp_state => + -- decrement up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + if ea(2 downto 0) = "000" then + up_ctrl <= latch_up; + else + up_ctrl <= load_up; + end if; + -- write dp + addr_ctrl <= pushu_ad; + dout_ctrl <= dp_dout; + if ea(2) = '1' then + next_state <= pshu_accb_state; + elsif ea(1) = '1' then + next_state <= pshu_acca_state; + elsif ea(0) = '1' then + next_state <= pshu_cc_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pshu_accb_state => + -- decrement up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + if ea(1 downto 0) = "00" then + up_ctrl <= latch_up; + else + up_ctrl <= load_up; + end if; + -- write accb + addr_ctrl <= pushu_ad; + dout_ctrl <= accb_dout; + if ea(1) = '1' then + next_state <= pshu_acca_state; + elsif ea(0) = '1' then + next_state <= pshu_cc_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pshu_acca_state => + -- decrement up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + if ea(0) = '0' then + up_ctrl <= latch_up; + else + up_ctrl <= load_up; + end if; + -- write acca + addr_ctrl <= pushu_ad; + dout_ctrl <= acca_dout; + if ea(0) = '1' then + next_state <= pshu_cc_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pshu_cc_state => + -- idle up + -- write cc + addr_ctrl <= pushu_ad; + dout_ctrl <= cc_dout; + lic <= '1'; + next_state <= fetch_state; + + -- + -- enter here on PULU + -- ea hold register mask + -- + when pulu_state => + -- idle UP + -- idle bus + if ea(0) = '1' then + next_state <= pulu_cc_state; + elsif ea(1) = '1' then + next_state <= pulu_acca_state; + elsif ea(2) = '1' then + next_state <= pulu_accb_state; + elsif ea(3) = '1' then + next_state <= pulu_dp_state; + elsif ea(4) = '1' then + next_state <= pulu_ixh_state; + elsif ea(5) = '1' then + next_state <= pulu_iyh_state; + elsif ea(6) = '1' then + next_state <= pulu_sph_state; + elsif ea(7) = '1' then + next_state <= pulu_pch_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pulu_cc_state => + -- increment up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + up_ctrl <= load_up; + -- read cc + cc_ctrl <= pull_cc; + addr_ctrl <= pullu_ad; + if ea(1) = '1' then + next_state <= pulu_acca_state; + elsif ea(2) = '1' then + next_state <= pulu_accb_state; + elsif ea(3) = '1' then + next_state <= pulu_dp_state; + elsif ea(4) = '1' then + next_state <= pulu_ixh_state; + elsif ea(5) = '1' then + next_state <= pulu_iyh_state; + elsif ea(6) = '1' then + next_state <= pulu_sph_state; + elsif ea(7) = '1' then + next_state <= pulu_pch_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pulu_acca_state => + -- increment up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + up_ctrl <= load_up; + -- read acca + acca_ctrl <= pull_acca; + addr_ctrl <= pullu_ad; + if ea(2) = '1' then + next_state <= pulu_accb_state; + elsif ea(3) = '1' then + next_state <= pulu_dp_state; + elsif ea(4) = '1' then + next_state <= pulu_ixh_state; + elsif ea(5) = '1' then + next_state <= pulu_iyh_state; + elsif ea(6) = '1' then + next_state <= pulu_sph_state; + elsif ea(7) = '1' then + next_state <= pulu_pch_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pulu_accb_state => + -- increment up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + up_ctrl <= load_up; + -- read accb + accb_ctrl <= pull_accb; + addr_ctrl <= pullu_ad; + if ea(3) = '1' then + next_state <= pulu_dp_state; + elsif ea(4) = '1' then + next_state <= pulu_ixh_state; + elsif ea(5) = '1' then + next_state <= pulu_iyh_state; + elsif ea(6) = '1' then + next_state <= pulu_sph_state; + elsif ea(7) = '1' then + next_state <= pulu_pch_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pulu_dp_state => + -- increment up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + up_ctrl <= load_up; + -- read dp + dp_ctrl <= pull_dp; + addr_ctrl <= pullu_ad; + if ea(4) = '1' then + next_state <= pulu_ixh_state; + elsif ea(5) = '1' then + next_state <= pulu_iyh_state; + elsif ea(6) = '1' then + next_state <= pulu_sph_state; + elsif ea(7) = '1' then + next_state <= pulu_pch_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pulu_ixh_state => + -- increment up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + up_ctrl <= load_up; + -- read ix hi + ix_ctrl <= pull_hi_ix; + addr_ctrl <= pullu_ad; + next_state <= pulu_ixl_state; + + when pulu_ixl_state => + -- increment up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + up_ctrl <= load_up; + -- read ix low + ix_ctrl <= pull_lo_ix; + addr_ctrl <= pullu_ad; + if ea(5) = '1' then + next_state <= pulu_iyh_state; + elsif ea(6) = '1' then + next_state <= pulu_sph_state; + elsif ea(7) = '1' then + next_state <= pulu_pch_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pulu_iyh_state => + -- increment up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + up_ctrl <= load_up; + -- read iy hi + iy_ctrl <= pull_hi_iy; + addr_ctrl <= pullu_ad; + next_state <= pulu_iyl_state; + + when pulu_iyl_state => + -- increment up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + up_ctrl <= load_up; + -- read iy low + iy_ctrl <= pull_lo_iy; + addr_ctrl <= pullu_ad; + if ea(6) = '1' then + next_state <= pulu_sph_state; + elsif ea(7) = '1' then + next_state <= pulu_pch_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pulu_sph_state => + -- increment up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + up_ctrl <= load_up; + -- read sp hi + sp_ctrl <= pull_hi_sp; + addr_ctrl <= pullu_ad; + next_state <= pulu_spl_state; + + when pulu_spl_state => + -- increment up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + up_ctrl <= load_up; + -- read sp low + sp_ctrl <= pull_lo_sp; + addr_ctrl <= pullu_ad; + if ea(7) = '1' then + next_state <= pulu_pch_state; + else + lic <= '1'; + next_state <= fetch_state; + end if; + + when pulu_pch_state => + -- increment up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + up_ctrl <= load_up; + -- pull pc hi + pc_ctrl <= pull_hi_pc; + addr_ctrl <= pullu_ad; + next_state <= pulu_pcl_state; + + when pulu_pcl_state => + -- increment up + left_ctrl <= up_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + up_ctrl <= load_up; + -- read pc low + pc_ctrl <= pull_lo_pc; + addr_ctrl <= pullu_ad; + lic <= '1'; + next_state <= fetch_state; + + -- + -- pop the Condition codes + -- + when rti_cc_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read cc + cc_ctrl <= pull_cc; + addr_ctrl <= pulls_ad; + next_state <= rti_entire_state; + + -- + -- Added RTI cycle 11th July 2006 John Kent. + -- test the "Entire" Flag + -- that has just been popped off the stack + -- + when rti_entire_state => + -- + -- The Entire flag must be recovered from the stack + -- before testing. + -- + if cc(EBIT) = '1' then + next_state <= rti_acca_state; + else + next_state <= rti_pch_state; + end if; + + when rti_acca_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read acca + acca_ctrl <= pull_acca; + addr_ctrl <= pulls_ad; + next_state <= rti_accb_state; + + when rti_accb_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read accb + accb_ctrl <= pull_accb; + addr_ctrl <= pulls_ad; + next_state <= rti_dp_state; + + when rti_dp_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read dp + dp_ctrl <= pull_dp; + addr_ctrl <= pulls_ad; + next_state <= rti_ixh_state; + + when rti_ixh_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read ix hi + ix_ctrl <= pull_hi_ix; + addr_ctrl <= pulls_ad; + next_state <= rti_ixl_state; + + when rti_ixl_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read ix low + ix_ctrl <= pull_lo_ix; + addr_ctrl <= pulls_ad; + next_state <= rti_iyh_state; + + when rti_iyh_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read iy hi + iy_ctrl <= pull_hi_iy; + addr_ctrl <= pulls_ad; + next_state <= rti_iyl_state; + + when rti_iyl_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read iy low + iy_ctrl <= pull_lo_iy; + addr_ctrl <= pulls_ad; + next_state <= rti_uph_state; + + + when rti_uph_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read up hi + up_ctrl <= pull_hi_up; + addr_ctrl <= pulls_ad; + next_state <= rti_upl_state; + + when rti_upl_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read up low + up_ctrl <= pull_lo_up; + addr_ctrl <= pulls_ad; + next_state <= rti_pch_state; + + when rti_pch_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- pull pc hi + pc_ctrl <= pull_hi_pc; + addr_ctrl <= pulls_ad; + next_state <= rti_pcl_state; + + when rti_pcl_state => + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- pull pc low + pc_ctrl <= pull_lo_pc; + addr_ctrl <= pulls_ad; + lic <= '1'; + next_state <= fetch_state; + + -- + -- here on NMI interrupt + -- Complete execute cycle of the last instruction. + -- If it was a dual operand instruction + -- + when int_nmi_state => + next_state <= int_nmi1_state; + + -- Idle bus cycle + when int_nmi1_state => + -- pre decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + iv_ctrl <= nmi_iv; + st_ctrl <= push_st; + return_state <= int_nmimask_state; + next_state <= int_entire_state; + + -- + -- here on IRQ interrupt + -- Complete execute cycle of the last instruction. + -- If it was a dual operand instruction + -- + when int_irq_state => + next_state <= int_irq1_state; + + -- pre decrement the sp + -- Idle bus cycle + when int_irq1_state => + -- pre decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + iv_ctrl <= irq_iv; + st_ctrl <= push_st; + return_state <= int_irqmask_state; + next_state <= int_entire_state; + + -- + -- here on FIRQ interrupt + -- Complete execution cycle of the last instruction + -- if it was a dual operand instruction + -- + when int_firq_state => + next_state <= int_firq1_state; + + -- Idle bus cycle + when int_firq1_state => + -- pre decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + iv_ctrl <= firq_iv; + st_ctrl <= push_st; + return_state <= int_firqmask_state; + next_state <= int_fast_state; + + -- + -- CWAI entry point + -- stack pointer already pre-decremented + -- mask condition codes + -- + when cwai_state => + -- AND CC with md + left_ctrl <= md_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_andcc; + cc_ctrl <= load_cc; + st_ctrl <= push_st; + return_state <= int_cwai_state; + next_state <= int_entire_state; + + -- + -- wait here for an interrupt + -- + when int_cwai_state => + if (nmi_req = '1') then + iv_ctrl <= nmi_iv; + next_state <= int_nmimask_state; + -- + -- FIRQ & IRQ are level sensitive + -- + elsif (firq = '1') and (cc(FBIT) = '0') then + iv_ctrl <= firq_iv; + next_state <= int_firqmask_state; + + elsif (irq = '1') and (cc(IBIT) = '0') then + iv_ctrl <= irq_iv; + next_state <= int_irqmask_state; + else + next_state <= int_cwai_state; + end if; + + -- + -- State to mask I Flag and F Flag (NMI) + -- + when int_nmimask_state => + alu_ctrl <= alu_seif; + cc_ctrl <= load_cc; + next_state <= vect_hi_state; + + -- + -- State to mask I Flag and F Flag (FIRQ) + -- + when int_firqmask_state => + alu_ctrl <= alu_seif; + cc_ctrl <= load_cc; + next_state <= vect_hi_state; + + + -- + -- State to mask I Flag and F Flag (SWI) + -- + when int_swimask_state => + alu_ctrl <= alu_seif; + cc_ctrl <= load_cc; + next_state <= vect_hi_state; + + -- + -- State to mask I Flag only (IRQ) + -- + when int_irqmask_state => + alu_ctrl <= alu_sei; + cc_ctrl <= load_cc; + next_state <= vect_hi_state; + + -- + -- set Entire Flag on SWI, SWI2, SWI3 and CWAI, IRQ and NMI + -- before stacking all registers + -- + when int_entire_state => + -- set entire flag + alu_ctrl <= alu_see; + cc_ctrl <= load_cc; + next_state <= int_pcl_state; + + -- + -- clear Entire Flag on FIRQ + -- before stacking all registers + -- + when int_fast_state => + -- clear entire flag + alu_ctrl <= alu_cle; + cc_ctrl <= load_cc; + next_state <= int_pcl_state; + + when int_pcl_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- write pc low + addr_ctrl <= pushs_ad; + dout_ctrl <= pc_lo_dout; + next_state <= int_pch_state; + + when int_pch_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- write pc hi + addr_ctrl <= pushs_ad; + dout_ctrl <= pc_hi_dout; + if cc(EBIT) = '1' then + next_state <= int_upl_state; + else + next_state <= int_cc_state; + end if; + + when int_upl_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- write up low + addr_ctrl <= pushs_ad; + dout_ctrl <= up_lo_dout; + next_state <= int_uph_state; + + when int_uph_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- write ix hi + addr_ctrl <= pushs_ad; + dout_ctrl <= up_hi_dout; + next_state <= int_iyl_state; + + when int_iyl_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- write ix low + addr_ctrl <= pushs_ad; + dout_ctrl <= iy_lo_dout; + next_state <= int_iyh_state; + + when int_iyh_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- write ix hi + addr_ctrl <= pushs_ad; + dout_ctrl <= iy_hi_dout; + next_state <= int_ixl_state; + + when int_ixl_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- write ix low + addr_ctrl <= pushs_ad; + dout_ctrl <= ix_lo_dout; + next_state <= int_ixh_state; + + when int_ixh_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- write ix hi + addr_ctrl <= pushs_ad; + dout_ctrl <= ix_hi_dout; + next_state <= int_dp_state; + + when int_dp_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- write accb + addr_ctrl <= pushs_ad; + dout_ctrl <= dp_dout; + next_state <= int_accb_state; + + when int_accb_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- write accb + addr_ctrl <= pushs_ad; + dout_ctrl <= accb_dout; + next_state <= int_acca_state; + + when int_acca_state => + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= one_right; + alu_ctrl <= alu_sub16; + sp_ctrl <= load_sp; + -- write acca + addr_ctrl <= pushs_ad; + dout_ctrl <= acca_dout; + next_state <= int_cc_state; + + when int_cc_state => + -- write cc + addr_ctrl <= pushs_ad; + dout_ctrl <= cc_dout; + next_state <= saved_state; + + -- + -- According to the 6809 programming manual: + -- If an interrupt is received and is masked + -- or lasts for less than three cycles, the PC + -- will advance to the next instruction. + -- If an interrupt is unmasked and lasts + -- for more than three cycles, an interrupt + -- will be generated. + -- Note that I don't wait 3 clock cycles. + -- John Kent 11th July 2006 + -- + when sync_state => + lic <= '1'; + ba <= '1'; + -- + -- Version 1.28 2015-05-30 + -- Exit sync_state on interrupt. + -- If the interrupts are active + -- they will be caught in the state_machine process + -- and the interrupt service routine microcode will be executed. + -- Masked interrupts will exit the sync_state. + -- Moved from the state_machine process to the state_sequencer process + -- + if (firq = '1') or (irq = '1') then + next_state <= fetch_state; + else + next_state <= sync_state; + end if; + + when halt_state => + -- + -- 2011-10-30 John Kent + -- ba & bs should be high + ba <= '1'; + bs <= '1'; + if halt = '1' then + next_state <= halt_state; + else + next_state <= fetch_state; + end if; + + end case; + +-- +-- Ver 1.23 2011-10-30 John Kent +-- First instruction cycle might be +-- fetch_state +-- halt_state +-- int_nmirq_state +-- int_firq_state +-- + if fic = '1' then + -- + case op_code(7 downto 6) is + when "10" => -- acca + case op_code(3 downto 0) is + when "0000" => -- suba + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub8; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + when "0001" => -- cmpa + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub8; + cc_ctrl <= load_cc; + when "0010" => -- sbca + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sbc; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + when "0011" => + case pre_code is + when "00010000" => -- page 2 -- cmpd + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= load_cc; + when "00010001" => -- page 3 -- cmpu + left_ctrl <= up_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= load_cc; + when others => -- page 1 -- subd + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + end case; + when "0100" => -- anda + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_and; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + when "0101" => -- bita + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_and; + cc_ctrl <= load_cc; + when "0110" => -- ldaa + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld8; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + when "0111" => -- staa + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_st8; + cc_ctrl <= load_cc; + when "1000" => -- eora + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_eor; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + when "1001" => -- adca + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_adc; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + when "1010" => -- oraa + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ora; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + when "1011" => -- adda + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add8; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + when "1100" => + case pre_code is + when "00010000" => -- page 2 -- cmpy + left_ctrl <= iy_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= load_cc; + when "00010001" => -- page 3 -- cmps + left_ctrl <= sp_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= load_cc; + when others => -- page 1 -- cmpx + left_ctrl <= ix_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= load_cc; + end case; + when "1101" => -- bsr / jsr + null; + when "1110" => -- ldx + case pre_code is + when "00010000" => -- page 2 -- ldy + left_ctrl <= iy_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld16; + cc_ctrl <= load_cc; + iy_ctrl <= load_iy; + when others => -- page 1 -- ldx + left_ctrl <= ix_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld16; + cc_ctrl <= load_cc; + ix_ctrl <= load_ix; + end case; + when "1111" => -- stx + case pre_code is + when "00010000" => -- page 2 -- sty + left_ctrl <= iy_left; + right_ctrl <= md_right; + alu_ctrl <= alu_st16; + cc_ctrl <= load_cc; + when others => -- page 1 -- stx + left_ctrl <= ix_left; + right_ctrl <= md_right; + alu_ctrl <= alu_st16; + cc_ctrl <= load_cc; + end case; + when others => + null; + end case; + when "11" => -- accb dual op + case op_code(3 downto 0) is + when "0000" => -- subb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub8; + cc_ctrl <= load_cc; + accb_ctrl <= load_accb; + when "0001" => -- cmpb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub8; + cc_ctrl <= load_cc; + when "0010" => -- sbcb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sbc; + cc_ctrl <= load_cc; + accb_ctrl <= load_accb; + when "0011" => -- addd + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + when "0100" => -- andb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_and; + cc_ctrl <= load_cc; + accb_ctrl <= load_accb; + when "0101" => -- bitb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_and; + cc_ctrl <= load_cc; + when "0110" => -- ldab + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld8; + cc_ctrl <= load_cc; + accb_ctrl <= load_accb; + when "0111" => -- stab + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_st8; + cc_ctrl <= load_cc; + when "1000" => -- eorb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_eor; + cc_ctrl <= load_cc; + accb_ctrl <= load_accb; + when "1001" => -- adcb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_adc; + cc_ctrl <= load_cc; + accb_ctrl <= load_accb; + when "1010" => -- orab + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ora; + cc_ctrl <= load_cc; + accb_ctrl <= load_accb; + when "1011" => -- addb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add8; + cc_ctrl <= load_cc; + accb_ctrl <= load_accb; + when "1100" => -- ldd + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld16; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + when "1101" => -- std + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_st16; + cc_ctrl <= load_cc; + when "1110" => -- ldu + case pre_code is + when "00010000" => -- page 2 -- lds + left_ctrl <= sp_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld16; + cc_ctrl <= load_cc; + sp_ctrl <= load_sp; + when others => -- page 1 -- ldu + left_ctrl <= up_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld16; + cc_ctrl <= load_cc; + up_ctrl <= load_up; + end case; + when "1111" => + case pre_code is + when "00010000" => -- page 2 -- sts + left_ctrl <= sp_left; + right_ctrl <= md_right; + alu_ctrl <= alu_st16; + cc_ctrl <= load_cc; + when others => -- page 1 -- stu + left_ctrl <= up_left; + right_ctrl <= md_right; + alu_ctrl <= alu_st16; + cc_ctrl <= load_cc; + end case; + when others => + null; + end case; + when others => + null; + end case; + + end if; -- first instruction cycle (fic) + lic_out <= lic; +end process; + +end rtl; + diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/cpu68.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/cpu68.vhd new file mode 100644 index 00000000..016bd9a9 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/cpu68.vhd @@ -0,0 +1,3963 @@ +--===========================================================================-- +-- +-- S Y N T H E Z I A B L E CPU68 C O R E +-- +-- www.OpenCores.Org - December 2002 +-- This core adheres to the GNU public license +-- +-- File name : cpu68.vhd +-- +-- Purpose : Implements a 6800 compatible CPU core with some +-- additional instructions found in the 6801 +-- +-- Dependencies : ieee.Std_Logic_1164 +-- ieee.std_logic_unsigned +-- +-- Author : John E. Kent +-- +--===========================================================================---- +-- +-- Revision History: +-- +-- Date: Revision Author +-- 22 Sep 2002 0.1 John Kent +-- +-- 30 Oct 2002 0.2 John Kent +-- made NMI edge triggered +-- +-- 30 Oct 2002 0.3 John Kent +-- more corrections to NMI +-- added wai_wait_state to prevent stack overflow on wai. +-- +-- 1 Nov 2002 0.4 John Kent +-- removed WAI states and integrated WAI with the interrupt service routine +-- replace Data out (do) and Data in (di) register with a single Memory Data (md) reg. +-- Added Multiply instruction states. +-- run ALU and CC out of CPU module for timing measurements. +-- +-- 3 Nov 2002 0.5 John Kent +-- Memory Data Register was not loaded on Store instructions +-- SEV and CLV were not defined in the ALU +-- Overflow Flag on NEG was incorrect +-- +-- 16th Feb 2003 0.6 John Kent +-- Rearranged the execution cycle for dual operand instructions +-- so that occurs during the following fetch cycle. +-- This allows the reduction of one clock cycle from dual operand +-- instruction. Note that this also necessitated re-arranging the +-- program counter so that it is no longer incremented in the ALU. +-- The effective address has also been re-arranged to include a +-- separate added. The STD (store accd) now sets the condition codes. +-- +-- 28th Jun 2003 0.7 John Kent +-- Added Hold and Halt signals. Hold is used to steal cycles from the +-- CPU or add wait states. Halt puts the CPU in the inactive state +-- and is only honoured in the fetch cycle. Both signals are active high. +-- +-- 9th Jan 2004 0.8 John Kent +-- Clear instruction did an alu_ld8 rather than an alu_clr, so +-- the carry bit was not cleared correctly. +-- This error was picked up by Michael Hassenfratz. +-- + +library ieee; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.STD_LOGIC_ARITH.ALL; +use IEEE.STD_LOGIC_UNSIGNED.ALL; + +entity cpu68 is + port ( + clk: in std_logic; + rst: in std_logic; + rw: out std_logic; + vma: out std_logic; + address: out std_logic_vector(15 downto 0); + data_in: in std_logic_vector(7 downto 0); + data_out: out std_logic_vector(7 downto 0); + hold: in std_logic; + halt: in std_logic; + irq: in std_logic; + nmi: in std_logic; + test_alu: out std_logic_vector(15 downto 0); + test_cc: out std_logic_vector(7 downto 0) + ); +end; + +architecture CPU_ARCH of cpu68 is + + constant SBIT : integer := 7; + constant XBIT : integer := 6; + constant HBIT : integer := 5; + constant IBIT : integer := 4; + constant NBIT : integer := 3; + constant ZBIT : integer := 2; + constant VBIT : integer := 1; + constant CBIT : integer := 0; + + type state_type is (reset_state, fetch_state, decode_state, + extended_state, indexed_state, read8_state, read16_state, immediate16_state, + write8_state, write16_state, + execute_state, halt_state, error_state, + mul_state, mulea_state, muld_state, + mul0_state, mul1_state, mul2_state, mul3_state, + mul4_state, mul5_state, mul6_state, mul7_state, + jmp_state, jsr_state, jsr1_state, + branch_state, bsr_state, bsr1_state, + rts_hi_state, rts_lo_state, + int_pcl_state, int_pch_state, + int_ixl_state, int_ixh_state, + int_cc_state, int_acca_state, int_accb_state, + int_wai_state, int_mask_state, + rti_state, rti_cc_state, rti_acca_state, rti_accb_state, + rti_ixl_state, rti_ixh_state, + rti_pcl_state, rti_pch_state, + pula_state, psha_state, pulb_state, pshb_state, + pulx_lo_state, pulx_hi_state, pshx_lo_state, pshx_hi_state, + vect_lo_state, vect_hi_state ); + type addr_type is (idle_ad, fetch_ad, read_ad, write_ad, push_ad, pull_ad, int_hi_ad, int_lo_ad ); + type dout_type is (md_lo_dout, md_hi_dout, acca_dout, accb_dout, ix_lo_dout, ix_hi_dout, cc_dout, pc_lo_dout, pc_hi_dout ); + type op_type is (reset_op, fetch_op, latch_op ); + type acca_type is (reset_acca, load_acca, load_hi_acca, pull_acca, latch_acca ); + type accb_type is (reset_accb, load_accb, pull_accb, latch_accb ); + type cc_type is (reset_cc, load_cc, pull_cc, latch_cc ); + type ix_type is (reset_ix, load_ix, pull_lo_ix, pull_hi_ix, latch_ix ); + type sp_type is (reset_sp, latch_sp, load_sp ); + type pc_type is (reset_pc, latch_pc, load_ea_pc, add_ea_pc, pull_lo_pc, pull_hi_pc, inc_pc ); + type md_type is (reset_md, latch_md, load_md, fetch_first_md, fetch_next_md, shiftl_md ); + type ea_type is (reset_ea, latch_ea, add_ix_ea, load_accb_ea, inc_ea, fetch_first_ea, fetch_next_ea ); + type iv_type is (reset_iv, latch_iv, swi_iv, nmi_iv, irq_iv ); + type nmi_type is (reset_nmi, set_nmi, latch_nmi ); + type left_type is (acca_left, accb_left, accd_left, md_left, ix_left, sp_left ); + type right_type is (md_right, zero_right, plus_one_right, accb_right ); + type alu_type is (alu_add8, alu_sub8, alu_add16, alu_sub16, alu_adc, alu_sbc, + alu_and, alu_ora, alu_eor, + alu_tst, alu_inc, alu_dec, alu_clr, alu_neg, alu_com, + alu_inx, alu_dex, alu_cpx, + alu_lsr16, alu_lsl16, + alu_ror8, alu_rol8, + alu_asr8, alu_asl8, alu_lsr8, + alu_sei, alu_cli, alu_sec, alu_clc, alu_sev, alu_clv, alu_tpa, alu_tap, + alu_ld8, alu_st8, alu_ld16, alu_st16, alu_nop, alu_daa ); + + signal op_code: std_logic_vector(7 downto 0); + signal acca: std_logic_vector(7 downto 0); + signal accb: std_logic_vector(7 downto 0); + signal cc: std_logic_vector(7 downto 0); + signal cc_out: std_logic_vector(7 downto 0); + signal xreg: std_logic_vector(15 downto 0); + signal sp: std_logic_vector(15 downto 0); + signal ea: std_logic_vector(15 downto 0); + signal pc: std_logic_vector(15 downto 0); + signal md: std_logic_vector(15 downto 0); + signal left: std_logic_vector(15 downto 0); + signal right: std_logic_vector(15 downto 0); + signal out_alu: std_logic_vector(15 downto 0); + signal iv: std_logic_vector(1 downto 0); + signal nmi_req: std_logic; + signal nmi_ack: std_logic; + + signal state: state_type; + signal next_state: state_type; + signal pc_ctrl: pc_type; + signal ea_ctrl: ea_type; + signal op_ctrl: op_type; + signal md_ctrl: md_type; + signal acca_ctrl: acca_type; + signal accb_ctrl: accb_type; + signal ix_ctrl: ix_type; + signal cc_ctrl: cc_type; + signal sp_ctrl: sp_type; + signal iv_ctrl: iv_type; + signal left_ctrl: left_type; + signal right_ctrl: right_type; + signal alu_ctrl: alu_type; + signal addr_ctrl: addr_type; + signal dout_ctrl: dout_type; + signal nmi_ctrl: nmi_type; + + +begin + +---------------------------------- +-- +-- Address bus multiplexer +-- +---------------------------------- + +addr_mux: process( clk, addr_ctrl, pc, ea, sp, iv ) +begin + case addr_ctrl is + when idle_ad => + address <= "1111111111111111"; + vma <= '0'; + rw <= '1'; + when fetch_ad => + address <= pc; + vma <= '1'; + rw <= '1'; + when read_ad => + address <= ea; + vma <= '1'; + rw <= '1'; + when write_ad => + address <= ea; + vma <= '1'; + rw <= '0'; + when push_ad => + address <= sp; + vma <= '1'; + rw <= '0'; + when pull_ad => + address <= sp; + vma <= '1'; + rw <= '1'; + when int_hi_ad => + address <= "1111111111111" & iv & "0"; + vma <= '1'; + rw <= '1'; + when int_lo_ad => + address <= "1111111111111" & iv & "1"; + vma <= '1'; + rw <= '1'; + when others => + address <= "1111111111111111"; + vma <= '0'; + rw <= '1'; + end case; +end process; + +-------------------------------- +-- +-- Data Bus output +-- +-------------------------------- +dout_mux : process( clk, dout_ctrl, md, acca, accb, xreg, pc, cc ) +begin + case dout_ctrl is + when md_hi_dout => -- alu output + data_out <= md(15 downto 8); + when md_lo_dout => + data_out <= md(7 downto 0); + when acca_dout => -- accumulator a + data_out <= acca; + when accb_dout => -- accumulator b + data_out <= accb; + when ix_lo_dout => -- index reg + data_out <= xreg(7 downto 0); + when ix_hi_dout => -- index reg + data_out <= xreg(15 downto 8); + when cc_dout => -- condition codes + data_out <= cc; + when pc_lo_dout => -- low order pc + data_out <= pc(7 downto 0); + when pc_hi_dout => -- high order pc + data_out <= pc(15 downto 8); + when others => + data_out <= "00000000"; + end case; +end process; + + +---------------------------------- +-- +-- Program Counter Control +-- +---------------------------------- + +pc_mux: process( clk, pc_ctrl, pc, out_alu, data_in, ea, hold ) +variable tempof : std_logic_vector(15 downto 0); +variable temppc : std_logic_vector(15 downto 0); +begin + case pc_ctrl is + when add_ea_pc => + if ea(7) = '0' then + tempof := "00000000" & ea(7 downto 0); + else + tempof := "11111111" & ea(7 downto 0); + end if; + when inc_pc => + tempof := "0000000000000001"; + when others => + tempof := "0000000000000000"; + end case; + + case pc_ctrl is + when reset_pc => + temppc := "1111111111111110"; + when load_ea_pc => + temppc := ea; + when pull_lo_pc => + temppc(7 downto 0) := data_in; + temppc(15 downto 8) := pc(15 downto 8); + when pull_hi_pc => + temppc(7 downto 0) := pc(7 downto 0); + temppc(15 downto 8) := data_in; + when others => + temppc := pc; + end case; + + if clk'event and clk = '0' then + if hold = '1' then + pc <= pc; + else + pc <= temppc + tempof; + end if; + end if; +end process; + +---------------------------------- +-- +-- Effective Address Control +-- +---------------------------------- + +ea_mux: process( clk, ea_ctrl, ea, out_alu, data_in, accb, xreg, hold ) +variable tempind : std_logic_vector(15 downto 0); +variable tempea : std_logic_vector(15 downto 0); +begin + case ea_ctrl is + when add_ix_ea => + tempind := "00000000" & ea(7 downto 0); + when inc_ea => + tempind := "0000000000000001"; + when others => + tempind := "0000000000000000"; + end case; + + case ea_ctrl is + when reset_ea => + tempea := "0000000000000000"; + when load_accb_ea => + tempea := "00000000" & accb(7 downto 0); + when add_ix_ea => + tempea := xreg; + when fetch_first_ea => + tempea(7 downto 0) := data_in; + tempea(15 downto 8) := "00000000"; + when fetch_next_ea => + tempea(7 downto 0) := data_in; + tempea(15 downto 8) := ea(7 downto 0); + when others => + tempea := ea; + end case; + + if clk'event and clk = '0' then + if hold = '1' then + ea <= ea; + else + ea <= tempea + tempind; + end if; + end if; +end process; + +-------------------------------- +-- +-- Accumulator A +-- +-------------------------------- +acca_mux : process( clk, acca_ctrl, out_alu, acca, data_in, hold ) +begin + if clk'event and clk = '0' then + if hold = '1' then + acca <= acca; + else + case acca_ctrl is + when reset_acca => + acca <= "00000000"; + when load_acca => + acca <= out_alu(7 downto 0); + when load_hi_acca => + acca <= out_alu(15 downto 8); + when pull_acca => + acca <= data_in; + when others => +-- when latch_acca => + acca <= acca; + end case; + end if; + end if; +end process; + +-------------------------------- +-- +-- Accumulator B +-- +-------------------------------- +accb_mux : process( clk, accb_ctrl, out_alu, accb, data_in, hold ) +begin + if clk'event and clk = '0' then + if hold = '1' then + accb <= accb; + else + case accb_ctrl is + when reset_accb => + accb <= "00000000"; + when load_accb => + accb <= out_alu(7 downto 0); + when pull_accb => + accb <= data_in; + when others => +-- when latch_accb => + accb <= accb; + end case; + end if; + end if; +end process; + +-------------------------------- +-- +-- X Index register +-- +-------------------------------- +ix_mux : process( clk, ix_ctrl, out_alu, xreg, data_in, hold ) +begin + if clk'event and clk = '0' then + if hold = '1' then + xreg <= xreg; + else + case ix_ctrl is + when reset_ix => + xreg <= "0000000000000000"; + when load_ix => + xreg <= out_alu(15 downto 0); + when pull_hi_ix => + xreg(15 downto 8) <= data_in; + when pull_lo_ix => + xreg(7 downto 0) <= data_in; + when others => +-- when latch_ix => + xreg <= xreg; + end case; + end if; + end if; +end process; + +-------------------------------- +-- +-- stack pointer +-- +-------------------------------- +sp_mux : process( clk, sp_ctrl, out_alu, hold ) +begin + if clk'event and clk = '0' then + if hold = '1' then + sp <= sp; + else + case sp_ctrl is + when reset_sp => + sp <= "0000000000000000"; + when load_sp => + sp <= out_alu(15 downto 0); + when others => +-- when latch_sp => + sp <= sp; + end case; + end if; + end if; +end process; + +-------------------------------- +-- +-- Memory Data +-- +-------------------------------- +md_mux : process( clk, md_ctrl, out_alu, data_in, md, hold ) +begin + if clk'event and clk = '0' then + if hold = '1' then + md <= md; + else + case md_ctrl is + when reset_md => + md <= "0000000000000000"; + when load_md => + md <= out_alu(15 downto 0); + when fetch_first_md => + md(15 downto 8) <= "00000000"; + md(7 downto 0) <= data_in; + when fetch_next_md => + md(15 downto 8) <= md(7 downto 0); + md(7 downto 0) <= data_in; + when shiftl_md => + md(15 downto 1) <= md(14 downto 0); + md(0) <= '0'; + when others => +-- when latch_md => + md <= md; + end case; + end if; + end if; +end process; + + +---------------------------------- +-- +-- Condition Codes +-- +---------------------------------- + +cc_mux: process( clk, cc_ctrl, cc_out, cc, data_in, hold ) +begin + if clk'event and clk = '0' then + if hold = '1' then + cc <= cc; + else + case cc_ctrl is + when reset_cc => + cc <= "11000000"; + when load_cc => + cc <= cc_out; + when pull_cc => + cc <= data_in; + when others => +-- when latch_cc => + cc <= cc; + end case; + end if; + end if; +end process; + +---------------------------------- +-- +-- interrupt vector +-- +---------------------------------- + +iv_mux: process( clk, iv_ctrl, hold ) +begin + if clk'event and clk = '0' then + if hold = '1' then + iv <= iv; + else + case iv_ctrl is + when reset_iv => + iv <= "11"; + when nmi_iv => + iv <= "10"; + when swi_iv => + iv <= "01"; + when irq_iv => + iv <= "00"; + when others => + iv <= iv; + end case; + end if; + end if; +end process; + +---------------------------------- +-- +-- op code fetch +-- +---------------------------------- + +op_fetch: process( clk, data_in, op_ctrl, op_code, hold ) +begin + if clk'event and clk = '0' then + if hold = '1' then + op_code <= op_code; + else + case op_ctrl is + when reset_op => + op_code <= "00000001"; -- nop + when fetch_op => + op_code <= data_in; + when others => +-- when latch_op => + op_code <= op_code; + end case; + end if; + end if; +end process; + +---------------------------------- +-- +-- Left Mux +-- +---------------------------------- + +left_mux: process( left_ctrl, acca, accb, xreg, sp, pc, ea, md ) +begin + case left_ctrl is + when acca_left => + left(15 downto 8) <= "00000000"; + left(7 downto 0) <= acca; + when accb_left => + left(15 downto 8) <= "00000000"; + left(7 downto 0) <= accb; + when accd_left => + left(15 downto 8) <= acca; + left(7 downto 0) <= accb; + when ix_left => + left <= xreg; + when sp_left => + left <= sp; + when others => +-- when md_left => + left <= md; + end case; +end process; +---------------------------------- +-- +-- Right Mux +-- +---------------------------------- + +right_mux: process( right_ctrl, data_in, md, accb, ea ) +begin + case right_ctrl is + when zero_right => + right <= "0000000000000000"; + when plus_one_right => + right <= "0000000000000001"; + when accb_right => + right <= "00000000" & accb; + when others => +-- when md_right => + right <= md; + end case; +end process; + +---------------------------------- +-- +-- Arithmetic Logic Unit +-- +---------------------------------- + +mux_alu: process( alu_ctrl, cc, left, right, out_alu, cc_out ) +variable valid_lo, valid_hi : boolean; +variable carry_in : std_logic; +variable daa_reg : std_logic_vector(7 downto 0); +begin + + case alu_ctrl is + when alu_adc | alu_sbc | + alu_rol8 | alu_ror8 => + carry_in := cc(CBIT); + when others => + carry_in := '0'; + end case; + + valid_lo := left(3 downto 0) <= 9; + valid_hi := left(7 downto 4) <= 9; + + if (cc(CBIT) = '0') then + if( cc(HBIT) = '1' ) then + if valid_hi then + daa_reg := "00000110"; + else + daa_reg := "01100110"; + end if; + else + if valid_lo then + if valid_hi then + daa_reg := "00000000"; + else + daa_reg := "01100000"; + end if; + else + if( left(7 downto 4) <= 8 ) then + daa_reg := "00000110"; + else + daa_reg := "01100110"; + end if; + end if; + end if; + else + if ( cc(HBIT) = '1' )then + daa_reg := "01100110"; + else + if valid_lo then + daa_reg := "01100000"; + else + daa_reg := "01100110"; + end if; + end if; + end if; + + case alu_ctrl is + when alu_add8 | alu_inc | + alu_add16 | alu_inx | + alu_adc => + out_alu <= left + right + ("000000000000000" & carry_in); + when alu_sub8 | alu_dec | + alu_sub16 | alu_dex | + alu_sbc | alu_cpx => + out_alu <= left - right - ("000000000000000" & carry_in); + when alu_and => + out_alu <= left and right; -- and/bit + when alu_ora => + out_alu <= left or right; -- or + when alu_eor => + out_alu <= left xor right; -- eor/xor + when alu_lsl16 | alu_asl8 | alu_rol8 => + out_alu <= left(14 downto 0) & carry_in; -- rol8/asl8/lsl16 + when alu_lsr16 | alu_lsr8 => + out_alu <= carry_in & left(15 downto 1); -- lsr + when alu_ror8 => + out_alu <= "00000000" & carry_in & left(7 downto 1); -- ror + when alu_asr8 => + out_alu <= "00000000" & left(7) & left(7 downto 1); -- asr + when alu_neg => + out_alu <= right - left; -- neg (right=0) + when alu_com => + out_alu <= not left; + when alu_clr | alu_ld8 | alu_ld16 => + out_alu <= right; -- clr, ld + when alu_st8 | alu_st16 => + out_alu <= left; + when alu_daa => + out_alu <= left + ("00000000" & daa_reg); + when alu_tpa => + out_alu <= "00000000" & cc; + when others => + out_alu <= left; -- nop + end case; + + -- + -- carry bit + -- + case alu_ctrl is + when alu_add8 | alu_adc => + cc_out(CBIT) <= (left(7) and right(7)) or + (left(7) and not out_alu(7)) or + (right(7) and not out_alu(7)); + when alu_sub8 | alu_sbc => + cc_out(CBIT) <= ((not left(7)) and right(7)) or + ((not left(7)) and out_alu(7)) or + (right(7) and out_alu(7)); + when alu_add16 => + cc_out(CBIT) <= (left(15) and right(15)) or + (left(15) and not out_alu(15)) or + (right(15) and not out_alu(15)); + when alu_sub16 => + cc_out(CBIT) <= ((not left(15)) and right(15)) or + ((not left(15)) and out_alu(15)) or + (right(15) and out_alu(15)); + when alu_ror8 | alu_lsr16 | alu_lsr8 | alu_asr8 => + cc_out(CBIT) <= left(0); + when alu_rol8 | alu_asl8 => + cc_out(CBIT) <= left(7); + when alu_lsl16 => + cc_out(CBIT) <= left(15); + when alu_com => + cc_out(CBIT) <= '1'; + when alu_neg | alu_clr => + cc_out(CBIT) <= out_alu(7) or out_alu(6) or out_alu(5) or out_alu(4) or + out_alu(3) or out_alu(2) or out_alu(1) or out_alu(0); + when alu_daa => + if ( daa_reg(7 downto 4) = "0110" ) then + cc_out(CBIT) <= '1'; + else + cc_out(CBIT) <= '0'; + end if; + when alu_sec => + cc_out(CBIT) <= '1'; + when alu_clc => + cc_out(CBIT) <= '0'; + when alu_tap => + cc_out(CBIT) <= left(CBIT); + when others => -- carry is not affected by cpx + cc_out(CBIT) <= cc(CBIT); + end case; + -- + -- Zero flag + -- + case alu_ctrl is + when alu_add8 | alu_sub8 | + alu_adc | alu_sbc | + alu_and | alu_ora | alu_eor | + alu_inc | alu_dec | + alu_neg | alu_com | alu_clr | + alu_rol8 | alu_ror8 | alu_asr8 | alu_asl8 | alu_lsr8 | + alu_ld8 | alu_st8 => + cc_out(ZBIT) <= not( out_alu(7) or out_alu(6) or out_alu(5) or out_alu(4) or + out_alu(3) or out_alu(2) or out_alu(1) or out_alu(0) ); + when alu_add16 | alu_sub16 | + alu_lsl16 | alu_lsr16 | + alu_inx | alu_dex | + alu_ld16 | alu_st16 | alu_cpx => + cc_out(ZBIT) <= not( out_alu(15) or out_alu(14) or out_alu(13) or out_alu(12) or + out_alu(11) or out_alu(10) or out_alu(9) or out_alu(8) or + out_alu(7) or out_alu(6) or out_alu(5) or out_alu(4) or + out_alu(3) or out_alu(2) or out_alu(1) or out_alu(0) ); + when alu_tap => + cc_out(ZBIT) <= left(ZBIT); + when others => + cc_out(ZBIT) <= cc(ZBIT); + end case; + + -- + -- negative flag + -- + case alu_ctrl is + when alu_add8 | alu_sub8 | + alu_adc | alu_sbc | + alu_and | alu_ora | alu_eor | + alu_rol8 | alu_ror8 | alu_asr8 | alu_asl8 | alu_lsr8 | + alu_inc | alu_dec | alu_neg | alu_com | alu_clr | + alu_ld8 | alu_st8 => + cc_out(NBIT) <= out_alu(7); + when alu_add16 | alu_sub16 | + alu_lsl16 | alu_lsr16 | + alu_ld16 | alu_st16 | alu_cpx => + cc_out(NBIT) <= out_alu(15); + when alu_tap => + cc_out(NBIT) <= left(NBIT); + when others => + cc_out(NBIT) <= cc(NBIT); + end case; + + -- + -- Interrupt mask flag + -- + case alu_ctrl is + when alu_sei => + cc_out(IBIT) <= '1'; -- set interrupt mask + when alu_cli => + cc_out(IBIT) <= '0'; -- clear interrupt mask + when alu_tap => + cc_out(IBIT) <= left(IBIT); + when others => + cc_out(IBIT) <= cc(IBIT); -- interrupt mask + end case; + + -- + -- Half Carry flag + -- + case alu_ctrl is + when alu_add8 | alu_adc => + cc_out(HBIT) <= (left(3) and right(3)) or + (right(3) and not out_alu(3)) or + (left(3) and not out_alu(3)); + when alu_tap => + cc_out(HBIT) <= left(HBIT); + when others => + cc_out(HBIT) <= cc(HBIT); + end case; + + -- + -- Overflow flag + -- + case alu_ctrl is + when alu_add8 | alu_adc => + cc_out(VBIT) <= (left(7) and right(7) and (not out_alu(7))) or + ((not left(7)) and (not right(7)) and out_alu(7)); + when alu_sub8 | alu_sbc => + cc_out(VBIT) <= (left(7) and (not right(7)) and (not out_alu(7))) or + ((not left(7)) and right(7) and out_alu(7)); + when alu_add16 => + cc_out(VBIT) <= (left(15) and right(15) and (not out_alu(15))) or + ((not left(15)) and (not right(15)) and out_alu(15)); + when alu_sub16 | alu_cpx => + cc_out(VBIT) <= (left(15) and (not right(15)) and (not out_alu(15))) or + ((not left(15)) and right(15) and out_alu(15)); + when alu_inc => + cc_out(VBIT) <= ((not left(7)) and left(6) and left(5) and left(4) and + left(3) and left(2) and left(1) and left(0)); + when alu_dec | alu_neg => + cc_out(VBIT) <= (left(7) and (not left(6)) and (not left(5)) and (not left(4)) and + (not left(3)) and (not left(2)) and (not left(1)) and (not left(0))); + when alu_asr8 => + cc_out(VBIT) <= left(0) xor left(7); + when alu_lsr8 | alu_lsr16 => + cc_out(VBIT) <= left(0); + when alu_ror8 => + cc_out(VBIT) <= left(0) xor cc(CBIT); + when alu_lsl16 => + cc_out(VBIT) <= left(15) xor left(14); + when alu_rol8 | alu_asl8 => + cc_out(VBIT) <= left(7) xor left(6); + when alu_tap => + cc_out(VBIT) <= left(VBIT); + when alu_and | alu_ora | alu_eor | alu_com | + alu_st8 | alu_st16 | alu_ld8 | alu_ld16 | + alu_clv => + cc_out(VBIT) <= '0'; + when alu_sev => + cc_out(VBIT) <= '1'; + when others => + cc_out(VBIT) <= cc(VBIT); + end case; + + case alu_ctrl is + when alu_tap => + cc_out(XBIT) <= cc(XBIT) and left(XBIT); + cc_out(SBIT) <= left(SBIT); + when others => + cc_out(XBIT) <= cc(XBIT) and left(XBIT); + cc_out(SBIT) <= cc(SBIT); + end case; + + test_alu <= out_alu; + test_cc <= cc_out; +end process; + +------------------------------------ +-- +-- Detect Edge of NMI interrupt +-- +------------------------------------ + +nmi_handler : process( clk, rst, nmi, nmi_ack ) +begin + if clk'event and clk='0' then + if hold = '1' then + nmi_req <= nmi_req; + else + if rst='1' then + nmi_req <= '0'; + else + if (nmi='1') and (nmi_ack='0') then + nmi_req <= '1'; + else + if (nmi='0') and (nmi_ack='1') then + nmi_req <= '0'; + else + nmi_req <= nmi_req; + end if; + end if; + end if; + end if; + end if; +end process; + +------------------------------------ +-- +-- Nmi mux +-- +------------------------------------ + +nmi_mux: process( clk, nmi_ctrl, nmi_ack, hold ) +begin + if clk'event and clk='0' then + if hold = '1' then + nmi_ack <= nmi_ack; + else + case nmi_ctrl is + when set_nmi => + nmi_ack <= '1'; + when reset_nmi => + nmi_ack <= '0'; + when others => +-- when latch_nmi => + nmi_ack <= nmi_ack; + end case; + end if; + end if; +end process; + +------------------------------------ +-- +-- state sequencer +-- +------------------------------------ +process( state, op_code, cc, ea, irq, nmi_req, nmi_ack, hold, halt ) + begin + case state is + when reset_state => -- released from reset + -- reset the registers + op_ctrl <= reset_op; + acca_ctrl <= reset_acca; + accb_ctrl <= reset_accb; + ix_ctrl <= reset_ix; + sp_ctrl <= reset_sp; + pc_ctrl <= reset_pc; + ea_ctrl <= reset_ea; + md_ctrl <= reset_md; + iv_ctrl <= reset_iv; + nmi_ctrl <= reset_nmi; + -- idle the ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= reset_cc; + -- idle the bus + dout_ctrl <= md_lo_dout; + addr_ctrl <= idle_ad; + next_state <= vect_hi_state; + + -- + -- Jump via interrupt vector + -- iv holds interrupt type + -- fetch PC hi from vector location + -- + when vect_hi_state => + -- default the registers + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + md_ctrl <= latch_md; + ea_ctrl <= latch_ea; + iv_ctrl <= latch_iv; + -- idle the ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- fetch pc low interrupt vector + pc_ctrl <= pull_hi_pc; + addr_ctrl <= int_hi_ad; + dout_ctrl <= pc_hi_dout; + next_state <= vect_lo_state; + -- + -- jump via interrupt vector + -- iv holds vector type + -- fetch PC lo from vector location + -- + when vect_lo_state => + -- default the registers + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + md_ctrl <= latch_md; + ea_ctrl <= latch_ea; + iv_ctrl <= latch_iv; + -- idle the ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- fetch the vector low byte + pc_ctrl <= pull_lo_pc; + addr_ctrl <= int_lo_ad; + dout_ctrl <= pc_lo_dout; + next_state <= fetch_state; + + -- + -- Here to fetch an instruction + -- PC points to opcode + -- Should service interrupt requests at this point + -- either from the timer + -- or from the external input. + -- + when fetch_state => + case op_code(7 downto 4) is + when "0000" | + "0001" | + "0010" | -- branch conditional + "0011" | + "0100" | -- acca single op + "0101" | -- accb single op + "0110" | -- indexed single op + "0111" => -- extended single op + -- idle ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + + when "1000" | -- acca immediate + "1001" | -- acca direct + "1010" | -- acca indexed + "1011" => -- acca extended + case op_code(3 downto 0) is + when "0000" => -- suba + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub8; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0001" => -- cmpa + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0010" => -- sbca + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sbc; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0011" => -- subd + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0100" => -- anda + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_and; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0101" => -- bita + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_and; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0110" => -- ldaa + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld8; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0111" => -- staa + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_st8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1000" => -- eora + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_eor; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1001" => -- adca + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_adc; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1010" => -- oraa + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ora; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1011" => -- adda + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add8; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1100" => -- cpx + left_ctrl <= ix_left; + right_ctrl <= md_right; + alu_ctrl <= alu_cpx; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1101" => -- bsr / jsr + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1110" => -- lds + left_ctrl <= sp_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld16; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + when "1111" => -- sts + left_ctrl <= sp_left; + right_ctrl <= md_right; + alu_ctrl <= alu_st16; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when others => + left_ctrl <= acca_left; + right_ctrl <= md_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + end case; + when "1100" | -- accb immediate + "1101" | -- accb direct + "1110" | -- accb indexed + "1111" => -- accb extended + case op_code(3 downto 0) is + when "0000" => -- subb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0001" => -- cmpb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sub8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0010" => -- sbcb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_sbc; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0011" => -- addd + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0100" => -- andb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_and; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0101" => -- bitb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_and; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0110" => -- ldab + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "0111" => -- stab + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_st8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1000" => -- eorb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_eor; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1001" => -- adcb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_adc; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1010" => -- orab + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ora; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1011" => -- addb + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1100" => -- ldd + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld16; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1101" => -- std + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_st16; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when "1110" => -- ldx + left_ctrl <= ix_left; + right_ctrl <= md_right; + alu_ctrl <= alu_ld16; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= load_ix; + sp_ctrl <= latch_sp; + when "1111" => -- stx + left_ctrl <= ix_left; + right_ctrl <= md_right; + alu_ctrl <= alu_st16; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + when others => + left_ctrl <= accb_left; + right_ctrl <= md_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + end case; + when others => + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + end case; + md_ctrl <= latch_md; + -- fetch the op code + op_ctrl <= fetch_op; + ea_ctrl <= reset_ea; + addr_ctrl <= fetch_ad; + dout_ctrl <= md_lo_dout; + iv_ctrl <= latch_iv; + if halt = '1' then + pc_ctrl <= latch_pc; + nmi_ctrl <= latch_nmi; + next_state <= halt_state; + -- service non maskable interrupts + elsif (nmi_req = '1') and (nmi_ack = '0') then + pc_ctrl <= latch_pc; + nmi_ctrl <= set_nmi; + next_state <= int_pcl_state; + -- service maskable interrupts + else + -- + -- nmi request is not cleared until nmi input goes low + -- + if(nmi_req = '0') and (nmi_ack='1') then + nmi_ctrl <= reset_nmi; + else + nmi_ctrl <= latch_nmi; + end if; + -- + -- IRQ is level sensitive + -- + if (irq = '1') and (cc(IBIT) = '0') then + pc_ctrl <= latch_pc; + next_state <= int_pcl_state; + else + -- Advance the PC to fetch next instruction byte + pc_ctrl <= inc_pc; + next_state <= decode_state; + end if; + end if; + -- + -- Here to decode instruction + -- and fetch next byte of intruction + -- whether it be necessary or not + -- + when decode_state => + -- fetch first byte of address or immediate data + ea_ctrl <= fetch_first_ea; + addr_ctrl <= fetch_ad; + dout_ctrl <= md_lo_dout; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + iv_ctrl <= latch_iv; + case op_code(7 downto 4) is + when "0000" => + md_ctrl <= fetch_first_md; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + case op_code(3 downto 0) is + when "0001" => -- nop + left_ctrl <= accd_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when "0100" => -- lsrd + left_ctrl <= accd_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_lsr16; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + when "0101" => -- lsld + left_ctrl <= accd_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_lsl16; + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + ix_ctrl <= latch_ix; + when "0110" => -- tap + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_tap; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when "0111" => -- tpa + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_tpa; + cc_ctrl <= latch_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when "1000" => -- inx + left_ctrl <= ix_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_inx; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= load_ix; + when "1001" => -- dex + left_ctrl <= ix_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_dex; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= load_ix; + when "1010" => -- clv + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_clv; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when "1011" => -- sev + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_sev; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when "1100" => -- clc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_clc; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when "1101" => -- sec + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_sec; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when "1110" => -- cli + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_cli; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when "1111" => -- sei + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_sei; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + end case; + next_state <= fetch_state; + -- acca / accb inherent instructions + when "0001" => + md_ctrl <= fetch_first_md; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + left_ctrl <= acca_left; + right_ctrl <= accb_right; + case op_code(3 downto 0) is + when "0000" => -- sba + alu_ctrl <= alu_sub8; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + when "0001" => -- cba + alu_ctrl <= alu_sub8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + when "0110" => -- tab + alu_ctrl <= alu_st8; + cc_ctrl <= load_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= load_accb; + when "0111" => -- tba + alu_ctrl <= alu_ld8; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + when "1001" => -- daa + alu_ctrl <= alu_daa; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + when "1011" => -- aba + alu_ctrl <= alu_add8; + cc_ctrl <= load_cc; + acca_ctrl <= load_acca; + accb_ctrl <= latch_accb; + when others => + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end case; + next_state <= fetch_state; + when "0010" => -- branch conditional + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- increment the pc + pc_ctrl <= inc_pc; + case op_code(3 downto 0) is + when "0000" => -- bra + next_state <= branch_state; + when "0001" => -- brn + next_state <= fetch_state; + when "0010" => -- bhi + if (cc(CBIT) or cc(ZBIT)) = '0' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "0011" => -- bls + if (cc(CBIT) or cc(ZBIT)) = '1' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "0100" => -- bcc/bhs + if cc(CBIT) = '0' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "0101" => -- bcs/blo + if cc(CBIT) = '1' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "0110" => -- bne + if cc(ZBIT) = '0' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "0111" => -- beq + if cc(ZBIT) = '1' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "1000" => -- bvc + if cc(VBIT) = '0' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "1001" => -- bvs + if cc(VBIT) = '1' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "1010" => -- bpl + if cc(NBIT) = '0' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "1011" => -- bmi + if cc(NBIT) = '1' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "1100" => -- bge + if (cc(NBIT) xor cc(VBIT)) = '0' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "1101" => -- blt + if (cc(NBIT) xor cc(VBIT)) = '1' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "1110" => -- bgt + if (cc(ZBIT) or (cc(NBIT) xor cc(VBIT))) = '0' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when "1111" => -- ble + if (cc(ZBIT) or (cc(NBIT) xor cc(VBIT))) = '1' then + next_state <= branch_state; + else + next_state <= fetch_state; + end if; + when others => + next_state <= fetch_state; + end case; + -- + -- Single byte stack operators + -- Do not advance PC + -- + when "0011" => + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + pc_ctrl <= latch_pc; + case op_code(3 downto 0) is + when "0000" => -- tsx + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= load_ix; + sp_ctrl <= latch_sp; + next_state <= fetch_state; + when "0001" => -- ins + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + next_state <= fetch_state; + when "0010" => -- pula + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + next_state <= pula_state; + when "0011" => -- pulb + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + next_state <= pulb_state; + when "0100" => -- des + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + next_state <= fetch_state; + when "0101" => -- txs + left_ctrl <= ix_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + next_state <= fetch_state; + when "0110" => -- psha + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + next_state <= psha_state; + when "0111" => -- pshb + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + next_state <= pshb_state; + when "1000" => -- pulx + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + next_state <= pulx_hi_state; + when "1001" => -- rts + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + next_state <= rts_hi_state; + when "1010" => -- abx + left_ctrl <= ix_left; + right_ctrl <= accb_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= load_ix; + sp_ctrl <= latch_sp; + next_state <= fetch_state; + when "1011" => -- rti + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= load_sp; + next_state <= rti_cc_state; + when "1100" => -- pshx + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + next_state <= pshx_lo_state; + when "1101" => -- mul + left_ctrl <= acca_left; + right_ctrl <= accb_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + next_state <= mul_state; + when "1110" => -- wai + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + next_state <= int_pcl_state; + when "1111" => -- swi + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + next_state <= int_pcl_state; + when others => + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + next_state <= fetch_state; + end case; + -- + -- Accumulator A Single operand + -- source = Acc A dest = Acc A + -- Do not advance PC + -- + when "0100" => -- acca single op + md_ctrl <= fetch_first_md; + accb_ctrl <= latch_accb; + pc_ctrl <= latch_pc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + left_ctrl <= acca_left; + case op_code(3 downto 0) is + when "0000" => -- neg + right_ctrl <= zero_right; + alu_ctrl <= alu_neg; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "0011" => -- com + right_ctrl <= zero_right; + alu_ctrl <= alu_com; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "0100" => -- lsr + right_ctrl <= zero_right; + alu_ctrl <= alu_lsr8; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "0110" => -- ror + right_ctrl <= zero_right; + alu_ctrl <= alu_ror8; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "0111" => -- asr + right_ctrl <= zero_right; + alu_ctrl <= alu_asr8; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "1000" => -- asl + right_ctrl <= zero_right; + alu_ctrl <= alu_asl8; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "1001" => -- rol + right_ctrl <= zero_right; + alu_ctrl <= alu_rol8; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "1010" => -- dec + right_ctrl <= plus_one_right; + alu_ctrl <= alu_dec; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "1011" => -- undefined + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + acca_ctrl <= latch_acca; + cc_ctrl <= latch_cc; + when "1100" => -- inc + right_ctrl <= plus_one_right; + alu_ctrl <= alu_inc; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when "1101" => -- tst + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + acca_ctrl <= latch_acca; + cc_ctrl <= load_cc; + when "1110" => -- jmp + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + acca_ctrl <= latch_acca; + cc_ctrl <= latch_cc; + when "1111" => -- clr + right_ctrl <= zero_right; + alu_ctrl <= alu_clr; + acca_ctrl <= load_acca; + cc_ctrl <= load_cc; + when others => + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + acca_ctrl <= latch_acca; + cc_ctrl <= latch_cc; + end case; + next_state <= fetch_state; + -- + -- single operand acc b + -- Do not advance PC + -- + when "0101" => + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + pc_ctrl <= latch_pc; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + left_ctrl <= accb_left; + case op_code(3 downto 0) is + when "0000" => -- neg + right_ctrl <= zero_right; + alu_ctrl <= alu_neg; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "0011" => -- com + right_ctrl <= zero_right; + alu_ctrl <= alu_com; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "0100" => -- lsr + right_ctrl <= zero_right; + alu_ctrl <= alu_lsr8; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "0110" => -- ror + right_ctrl <= zero_right; + alu_ctrl <= alu_ror8; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "0111" => -- asr + right_ctrl <= zero_right; + alu_ctrl <= alu_asr8; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "1000" => -- asl + right_ctrl <= zero_right; + alu_ctrl <= alu_asl8; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "1001" => -- rol + right_ctrl <= zero_right; + alu_ctrl <= alu_rol8; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "1010" => -- dec + right_ctrl <= plus_one_right; + alu_ctrl <= alu_dec; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "1011" => -- undefined + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + accb_ctrl <= latch_accb; + cc_ctrl <= latch_cc; + when "1100" => -- inc + right_ctrl <= plus_one_right; + alu_ctrl <= alu_inc; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when "1101" => -- tst + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + accb_ctrl <= latch_accb; + cc_ctrl <= load_cc; + when "1110" => -- jmp + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + accb_ctrl <= latch_accb; + cc_ctrl <= latch_cc; + when "1111" => -- clr + right_ctrl <= zero_right; + alu_ctrl <= alu_clr; + accb_ctrl <= load_accb; + cc_ctrl <= load_cc; + when others => + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + accb_ctrl <= latch_accb; + cc_ctrl <= latch_cc; + end case; + next_state <= fetch_state; + -- + -- Single operand indexed + -- Two byte instruction so advance PC + -- EA should hold index offset + -- + when "0110" => -- indexed single op + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + next_state <= indexed_state; + -- + -- Single operand extended addressing + -- three byte instruction so advance the PC + -- Low order EA holds high order address + -- + when "0111" => -- extended single op + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + next_state <= extended_state; + + when "1000" => -- acca immediate + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + case op_code(3 downto 0) is + when "0011" | -- subdd # + "1100" | -- cpx # + "1110" => -- lds # + next_state <= immediate16_state; + when "1101" => -- bsr + next_state <= bsr_state; + when others => + next_state <= fetch_state; + end case; + + when "1001" => -- acca direct + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + pc_ctrl <= inc_pc; + case op_code(3 downto 0) is + when "0111" => -- staa direct + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1111" => -- sts direct + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when "1101" => -- jsr direct + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + next_state <= jsr_state; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + next_state <= read8_state; + end case; + + when "1010" => -- acca indexed + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + next_state <= indexed_state; + + when "1011" => -- acca extended + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + next_state <= extended_state; + + when "1100" => -- accb immediate + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + case op_code(3 downto 0) is + when "0011" | -- addd # + "1100" | -- ldd # + "1110" => -- ldx # + next_state <= immediate16_state; + when others => + next_state <= fetch_state; + end case; + + when "1101" => -- accb direct + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + pc_ctrl <= inc_pc; + case op_code(3 downto 0) is + when "0111" => -- stab direct + left_ctrl <= accb_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1101" => -- std direct + left_ctrl <= accd_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when "1111" => -- stx direct + left_ctrl <= ix_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + next_state <= read8_state; + end case; + + when "1110" => -- accb indexed + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + next_state <= indexed_state; + + when "1111" => -- accb extended + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- increment the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + next_state <= extended_state; + + when others => + md_ctrl <= fetch_first_md; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + -- idle the pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= latch_pc; + next_state <= fetch_state; + end case; + + when immediate16_state => + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + op_ctrl <= latch_op; + iv_ctrl <= latch_iv; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment pc + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= inc_pc; + -- fetch next immediate byte + md_ctrl <= fetch_next_md; + addr_ctrl <= fetch_ad; + dout_ctrl <= md_lo_dout; + next_state <= fetch_state; + -- + -- ea holds 8 bit index offet + -- calculate the effective memory address + -- using the alu + -- + when indexed_state => + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + -- calculate effective address from index reg + -- index offest is not sign extended + ea_ctrl <= add_ix_ea; + -- idle the bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + -- work out next state + case op_code(7 downto 4) is + when "0110" => -- single op indexed + md_ctrl <= latch_md; + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + case op_code(3 downto 0) is + when "1011" => -- undefined + next_state <= fetch_state; + when "1110" => -- jmp + next_state <= jmp_state; + when others => + next_state <= read8_state; + end case; + when "1010" => -- acca indexed + case op_code(3 downto 0) is + when "0111" => -- staa + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1101" => -- jsr + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= jsr_state; + when "1111" => -- sts + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= read8_state; + end case; + when "1110" => -- accb indexed + case op_code(3 downto 0) is + when "0111" => -- stab direct + left_ctrl <= accb_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1101" => -- std direct + left_ctrl <= accd_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when "1111" => -- stx direct + left_ctrl <= ix_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= read8_state; + end case; + when others => + md_ctrl <= latch_md; + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + next_state <= fetch_state; + end case; + -- + -- ea holds the low byte of the absolute address + -- Move ea low byte into ea high byte + -- load new ea low byte to for absolute 16 bit address + -- advance the program counter + -- + when extended_state => -- fetch ea low byte + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + -- increment pc + pc_ctrl <= inc_pc; + -- fetch next effective address bytes + ea_ctrl <= fetch_next_ea; + addr_ctrl <= fetch_ad; + dout_ctrl <= md_lo_dout; + -- work out the next state + case op_code(7 downto 4) is + when "0111" => -- single op extended + md_ctrl <= latch_md; + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + case op_code(3 downto 0) is + when "1011" => -- undefined + next_state <= fetch_state; + when "1110" => -- jmp + next_state <= jmp_state; + when others => + next_state <= read8_state; + end case; + when "1011" => -- acca extended + case op_code(3 downto 0) is + when "0111" => -- staa + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1101" => -- jsr + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= jsr_state; + when "1111" => -- sts + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= read8_state; + end case; + when "1111" => -- accb extended + case op_code(3 downto 0) is + when "0111" => -- stab + left_ctrl <= accb_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1101" => -- std + left_ctrl <= accd_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when "1111" => -- stx + left_ctrl <= ix_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + next_state <= write16_state; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= read8_state; + end case; + when others => + md_ctrl <= latch_md; + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + next_state <= fetch_state; + end case; + -- + -- here if ea holds low byte (direct page) + -- can enter here from extended addressing + -- read memory location + -- note that reads may be 8 or 16 bits + -- + when read8_state => -- read data + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + -- + addr_ctrl <= read_ad; + dout_ctrl <= md_lo_dout; + case op_code(7 downto 4) is + when "0110" | "0111" => -- single operand + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + ea_ctrl <= latch_ea; + next_state <= execute_state; + + when "1001" | "1010" | "1011" => -- acca + case op_code(3 downto 0) is + when "0011" | -- subd + "1110" | -- lds + "1100" => -- cpx + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + -- increment the effective address in case of 16 bit load + ea_ctrl <= inc_ea; + next_state <= read16_state; +-- when "0111" => -- staa +-- left_ctrl <= acca_left; +-- right_ctrl <= zero_right; +-- alu_ctrl <= alu_st8; +-- cc_ctrl <= latch_cc; +-- md_ctrl <= load_md; +-- ea_ctrl <= latch_ea; +-- next_state <= write8_state; +-- when "1101" => -- jsr +-- left_ctrl <= acca_left; +-- right_ctrl <= zero_right; +-- alu_ctrl <= alu_nop; +-- cc_ctrl <= latch_cc; +-- md_ctrl <= latch_md; +-- ea_ctrl <= latch_ea; +-- next_state <= jsr_state; +-- when "1111" => -- sts +-- left_ctrl <= sp_left; +-- right_ctrl <= zero_right; +-- alu_ctrl <= alu_st16; +-- cc_ctrl <= latch_cc; +-- md_ctrl <= load_md; +-- ea_ctrl <= latch_ea; +-- next_state <= write16_state; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + ea_ctrl <= latch_ea; + next_state <= fetch_state; + end case; + + when "1101" | "1110" | "1111" => -- accb + case op_code(3 downto 0) is + when "0011" | -- addd + "1100" | -- ldd + "1110" => -- ldx + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + -- increment the effective address in case of 16 bit load + ea_ctrl <= inc_ea; + next_state <= read16_state; +-- when "0111" => -- stab +-- left_ctrl <= accb_left; +-- right_ctrl <= zero_right; +-- alu_ctrl <= alu_st8; +-- cc_ctrl <= latch_cc; +-- md_ctrl <= load_md; +-- ea_ctrl <= latch_ea; +-- next_state <= write8_state; +-- when "1101" => -- std +-- left_ctrl <= accd_left; +-- right_ctrl <= zero_right; +-- alu_ctrl <= alu_st16; +-- cc_ctrl <= latch_cc; +-- md_ctrl <= load_md; +-- ea_ctrl <= latch_ea; +-- next_state <= write16_state; +-- when "1111" => -- stx +-- left_ctrl <= ix_left; +-- right_ctrl <= zero_right; +-- alu_ctrl <= alu_st16; +-- cc_ctrl <= latch_cc; +-- md_ctrl <= load_md; +-- ea_ctrl <= latch_ea; +-- next_state <= write16_state; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + ea_ctrl <= latch_ea; + next_state <= execute_state; + end case; + when others => + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= fetch_first_md; + ea_ctrl <= latch_ea; + next_state <= fetch_state; + end case; + + when read16_state => -- read second data byte from ea + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- idle the effective address + ea_ctrl <= latch_ea; + -- read the low byte of the 16 bit data + md_ctrl <= fetch_next_md; + addr_ctrl <= read_ad; + dout_ctrl <= md_lo_dout; + next_state <= fetch_state; + -- + -- 16 bit Write state + -- write high byte of ALU output. + -- EA hold address of memory to write to + -- Advance the effective address in ALU + -- + when write16_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + -- increment the effective address + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + ea_ctrl <= inc_ea; + -- write the ALU hi byte to ea + addr_ctrl <= write_ad; + dout_ctrl <= md_hi_dout; + next_state <= write8_state; + -- + -- 8 bit write + -- Write low 8 bits of ALU output + -- + when write8_state => + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- idle the ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- write ALU low byte output + addr_ctrl <= write_ad; + dout_ctrl <= md_lo_dout; + next_state <= fetch_state; + + when jmp_state => + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- load PC with effective address + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= load_ea_pc; + -- idle the bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= fetch_state; + + when jsr_state => -- JSR + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write pc low + addr_ctrl <= push_ad; + dout_ctrl <= pc_lo_dout; + next_state <= jsr1_state; + + when jsr1_state => -- JSR + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write pc hi + addr_ctrl <= push_ad; + dout_ctrl <= pc_hi_dout; + next_state <= jmp_state; + + when branch_state => -- Bcc + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- calculate signed branch + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + pc_ctrl <= add_ea_pc; + -- idle the bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= fetch_state; + + when bsr_state => -- BSR + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write pc low + addr_ctrl <= push_ad; + dout_ctrl <= pc_lo_dout; + next_state <= bsr1_state; + + when bsr1_state => -- BSR + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write pc hi + addr_ctrl <= push_ad; + dout_ctrl <= pc_hi_dout; + next_state <= branch_state; + + when rts_hi_state => -- RTS + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment the sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- read pc hi + pc_ctrl <= pull_hi_pc; + addr_ctrl <= pull_ad; + dout_ctrl <= pc_hi_dout; + next_state <= rts_lo_state; + + when rts_lo_state => -- RTS1 + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- idle the ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- read pc low + pc_ctrl <= pull_lo_pc; + addr_ctrl <= pull_ad; + dout_ctrl <= pc_lo_dout; + next_state <= fetch_state; + + when mul_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- move acca to md + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_st16; + cc_ctrl <= latch_cc; + md_ctrl <= load_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mulea_state; + + when mulea_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + md_ctrl <= latch_md; + -- idle ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- move accb to ea + ea_ctrl <= load_accb_ea; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= muld_state; + + when muld_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + md_ctrl <= latch_md; + -- clear accd + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_ld8; + cc_ctrl <= latch_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mul0_state; + + when mul0_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- if bit 0 of ea set, add accd to md + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + if ea(0) = '1' then + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + else + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end if; + md_ctrl <= shiftl_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mul1_state; + + when mul1_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- if bit 1 of ea set, add accd to md + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + if ea(1) = '1' then + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + else + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end if; + md_ctrl <= shiftl_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mul2_state; + + when mul2_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- if bit 2 of ea set, add accd to md + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + if ea(2) = '1' then + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + else + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end if; + md_ctrl <= shiftl_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mul3_state; + + when mul3_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- if bit 3 of ea set, add accd to md + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + if ea(3) = '1' then + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + else + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end if; + md_ctrl <= shiftl_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mul4_state; + + when mul4_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- if bit 4 of ea set, add accd to md + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + if ea(4) = '1' then + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + else + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end if; + md_ctrl <= shiftl_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mul5_state; + + when mul5_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- if bit 5 of ea set, add accd to md + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + if ea(5) = '1' then + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + else + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end if; + md_ctrl <= shiftl_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mul6_state; + + when mul6_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- if bit 6 of ea set, add accd to md + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + if ea(6) = '1' then + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + else + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end if; + md_ctrl <= shiftl_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= mul7_state; + + when mul7_state => + -- default + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- if bit 7 of ea set, add accd to md + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_add16; + if ea(7) = '1' then + cc_ctrl <= load_cc; + acca_ctrl <= load_hi_acca; + accb_ctrl <= load_accb; + else + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + end if; + md_ctrl <= shiftl_md; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= fetch_state; + + when execute_state => -- execute single operand instruction + -- default + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + case op_code(7 downto 4) is + when "0110" | -- indexed single op + "0111" => -- extended single op + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + iv_ctrl <= latch_iv; + ea_ctrl <= latch_ea; + -- idle the bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + left_ctrl <= md_left; + case op_code(3 downto 0) is + when "0000" => -- neg + right_ctrl <= zero_right; + alu_ctrl <= alu_neg; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "0011" => -- com + right_ctrl <= zero_right; + alu_ctrl <= alu_com; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "0100" => -- lsr + right_ctrl <= zero_right; + alu_ctrl <= alu_lsr8; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "0110" => -- ror + right_ctrl <= zero_right; + alu_ctrl <= alu_ror8; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "0111" => -- asr + right_ctrl <= zero_right; + alu_ctrl <= alu_asr8; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1000" => -- asl + right_ctrl <= zero_right; + alu_ctrl <= alu_asl8; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1001" => -- rol + right_ctrl <= zero_right; + alu_ctrl <= alu_rol8; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1010" => -- dec + right_ctrl <= plus_one_right; + alu_ctrl <= alu_dec; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1011" => -- undefined + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= fetch_state; + when "1100" => -- inc + right_ctrl <= plus_one_right; + alu_ctrl <= alu_inc; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when "1101" => -- tst + right_ctrl <= zero_right; + alu_ctrl <= alu_st8; + cc_ctrl <= load_cc; + md_ctrl <= latch_md; + next_state <= fetch_state; + when "1110" => -- jmp + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= fetch_state; + when "1111" => -- clr + right_ctrl <= zero_right; + alu_ctrl <= alu_clr; + cc_ctrl <= load_cc; + md_ctrl <= load_md; + next_state <= write8_state; + when others => + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + md_ctrl <= latch_md; + next_state <= fetch_state; + end case; + + when others => + left_ctrl <= accd_left; + right_ctrl <= md_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + ea_ctrl <= latch_ea; + -- idle the bus + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= fetch_state; + end case; + + when psha_state => + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write acca + addr_ctrl <= push_ad; + dout_ctrl <= acca_dout; + next_state <= fetch_state; + + when pula_state => + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- idle sp + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + sp_ctrl <= latch_sp; + -- read acca + acca_ctrl <= pull_acca; + addr_ctrl <= pull_ad; + dout_ctrl <= acca_dout; + next_state <= fetch_state; + + when pshb_state => + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write accb + addr_ctrl <= push_ad; + dout_ctrl <= accb_dout; + next_state <= fetch_state; + + when pulb_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- idle sp + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + sp_ctrl <= latch_sp; + -- read accb + accb_ctrl <= pull_accb; + addr_ctrl <= pull_ad; + dout_ctrl <= accb_dout; + next_state <= fetch_state; + + when pshx_lo_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write ix low + addr_ctrl <= push_ad; + dout_ctrl <= ix_lo_dout; + next_state <= pshx_hi_state; + + when pshx_hi_state => + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write ix hi + addr_ctrl <= push_ad; + dout_ctrl <= ix_hi_dout; + next_state <= fetch_state; + + when pulx_hi_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- pull ix hi + ix_ctrl <= pull_hi_ix; + addr_ctrl <= pull_ad; + dout_ctrl <= ix_hi_dout; + next_state <= pulx_lo_state; + + when pulx_lo_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- idle sp + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + sp_ctrl <= latch_sp; + -- read ix low + ix_ctrl <= pull_lo_ix; + addr_ctrl <= pull_ad; + dout_ctrl <= ix_lo_dout; + next_state <= fetch_state; + + -- + -- return from interrupt + -- enter here from bogus interrupts + -- + when rti_state => + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- idle address bus + cc_ctrl <= latch_cc; + addr_ctrl <= idle_ad; + dout_ctrl <= cc_dout; + next_state <= rti_cc_state; + + when rti_cc_state => + -- default registers + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + sp_ctrl <= load_sp; + -- read cc + cc_ctrl <= pull_cc; + addr_ctrl <= pull_ad; + dout_ctrl <= cc_dout; + next_state <= rti_accb_state; + + when rti_accb_state => + -- default registers + acca_ctrl <= latch_acca; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- read accb + accb_ctrl <= pull_accb; + addr_ctrl <= pull_ad; + dout_ctrl <= accb_dout; + next_state <= rti_acca_state; + + when rti_acca_state => + -- default registers + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- read acca + acca_ctrl <= pull_acca; + addr_ctrl <= pull_ad; + dout_ctrl <= acca_dout; + next_state <= rti_ixh_state; + + when rti_ixh_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- read ix hi + ix_ctrl <= pull_hi_ix; + addr_ctrl <= pull_ad; + dout_ctrl <= ix_hi_dout; + next_state <= rti_ixl_state; + + when rti_ixl_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- read ix low + ix_ctrl <= pull_lo_ix; + addr_ctrl <= pull_ad; + dout_ctrl <= ix_lo_dout; + next_state <= rti_pch_state; + + when rti_pch_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- increment sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_add16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- pull pc hi + pc_ctrl <= pull_hi_pc; + addr_ctrl <= pull_ad; + dout_ctrl <= pc_hi_dout; + next_state <= rti_pcl_state; + + when rti_pcl_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- idle sp + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + sp_ctrl <= latch_sp; + -- pull pc low + pc_ctrl <= pull_lo_pc; + addr_ctrl <= pull_ad; + dout_ctrl <= pc_lo_dout; + next_state <= fetch_state; + + -- + -- here on interrupt + -- iv register hold interrupt type + -- + when int_pcl_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write pc low + addr_ctrl <= push_ad; + dout_ctrl <= pc_lo_dout; + next_state <= int_pch_state; + + when int_pch_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write pc hi + addr_ctrl <= push_ad; + dout_ctrl <= pc_hi_dout; + next_state <= int_ixl_state; + + when int_ixl_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write ix low + addr_ctrl <= push_ad; + dout_ctrl <= ix_lo_dout; + next_state <= int_ixh_state; + + when int_ixh_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write ix hi + addr_ctrl <= push_ad; + dout_ctrl <= ix_hi_dout; + next_state <= int_acca_state; + + when int_acca_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write acca + addr_ctrl <= push_ad; + dout_ctrl <= acca_dout; + next_state <= int_accb_state; + + + when int_accb_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write accb + addr_ctrl <= push_ad; + dout_ctrl <= accb_dout; + next_state <= int_cc_state; + + when int_cc_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- decrement sp + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_sub16; + cc_ctrl <= latch_cc; + sp_ctrl <= load_sp; + -- write cc + addr_ctrl <= push_ad; + dout_ctrl <= cc_dout; + nmi_ctrl <= latch_nmi; + -- + -- nmi is edge triggered + -- nmi_req is cleared when nmi goes low. + -- + if nmi_req = '1' then + iv_ctrl <= nmi_iv; + next_state <= vect_hi_state; + else + -- + -- IRQ is level sensitive + -- + if (irq = '1') and (cc(IBIT) = '0') then + iv_ctrl <= irq_iv; + next_state <= int_mask_state; + else + case op_code is + when "00111110" => -- WAI (wait for interrupt) + iv_ctrl <= latch_iv; + next_state <= int_wai_state; + when "00111111" => -- SWI (Software interrupt) + iv_ctrl <= swi_iv; + next_state <= vect_hi_state; + when others => -- bogus interrupt (return) + iv_ctrl <= latch_iv; + next_state <= rti_state; + end case; + end if; + end if; + + when int_wai_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + op_ctrl <= latch_op; + ea_ctrl <= latch_ea; + -- enable interrupts + left_ctrl <= sp_left; + right_ctrl <= plus_one_right; + alu_ctrl <= alu_cli; + cc_ctrl <= load_cc; + sp_ctrl <= latch_sp; + -- idle bus + addr_ctrl <= idle_ad; + dout_ctrl <= cc_dout; + if (nmi_req = '1') and (nmi_ack='0') then + iv_ctrl <= nmi_iv; + nmi_ctrl <= set_nmi; + next_state <= vect_hi_state; + else + -- + -- nmi request is not cleared until nmi input goes low + -- + if (nmi_req = '0') and (nmi_ack='1') then + nmi_ctrl <= reset_nmi; + else + nmi_ctrl <= latch_nmi; + end if; + -- + -- IRQ is level sensitive + -- + if (irq = '1') and (cc(IBIT) = '0') then + iv_ctrl <= irq_iv; + next_state <= int_mask_state; + else + iv_ctrl <= latch_iv; + next_state <= int_wai_state; + end if; + end if; + + when int_mask_state => + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- Mask IRQ + left_ctrl <= sp_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_sei; + cc_ctrl <= load_cc; + sp_ctrl <= latch_sp; + -- idle bus cycle + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= vect_hi_state; + + when halt_state => -- halt CPU. + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- do nothing in ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- idle bus cycle + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + if halt = '1' then + next_state <= halt_state; + else + next_state <= fetch_state; + end if; + + when others => -- error state halt on undefine states + -- default + acca_ctrl <= latch_acca; + accb_ctrl <= latch_accb; + ix_ctrl <= latch_ix; + sp_ctrl <= latch_sp; + pc_ctrl <= latch_pc; + md_ctrl <= latch_md; + iv_ctrl <= latch_iv; + op_ctrl <= latch_op; + nmi_ctrl <= latch_nmi; + ea_ctrl <= latch_ea; + -- do nothing in ALU + left_ctrl <= acca_left; + right_ctrl <= zero_right; + alu_ctrl <= alu_nop; + cc_ctrl <= latch_cc; + -- idle bus cycle + addr_ctrl <= idle_ad; + dout_ctrl <= md_lo_dout; + next_state <= error_state; + end case; +end process; + +-------------------------------- +-- +-- state machine +-- +-------------------------------- + +change_state: process( clk, rst, state, hold ) +begin + if clk'event and clk = '0' then + if rst = '1' then + state <= reset_state; + elsif hold = '1' then + state <= state; + else + state <= next_state; + end if; + end if; +end process; + -- output + +end CPU_ARCH; + diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/dac.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/dac.vhd new file mode 100644 index 00000000..47b2185e --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/dac.vhd @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------- +-- +-- Delta-Sigma DAC +-- +-- Refer to Xilinx Application Note XAPP154. +-- +-- This DAC requires an external RC low-pass filter: +-- +-- dac_o 0---XXXXX---+---0 analog audio +-- 3k3 | +-- === 4n7 +-- | +-- GND +-- +------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +entity dac is + generic ( + C_bits : integer := 10 + ); + port ( + clk_i : in std_logic; + res_n_i : in std_logic; + dac_i : in std_logic_vector(C_bits-1 downto 0); + dac_o : out std_logic + ); +end dac; + +architecture rtl of dac is + signal sig_in: unsigned(C_bits downto 0); +begin + seq: process(clk_i, res_n_i) + begin + if res_n_i = '0' then + sig_in <= to_unsigned(2**C_bits, sig_in'length); + dac_o <= '0'; + elsif rising_edge(clk_i) then + -- not dac_i(C_bits-1) effectively adds 0x8..0 to dac_i + --sig_in <= sig_in + unsigned(sig_in(C_bits) & (not dac_i(C_bits-1)) & dac_i(C_bits-2 downto 0)); + sig_in <= sig_in + unsigned(sig_in(C_bits) & dac_i); + dac_o <= sig_in(C_bits); + end if; + end process seq; +end rtl; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/data_io.v b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/data_io.v new file mode 100644 index 00000000..4ca9518c --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/data_io.v @@ -0,0 +1,115 @@ +// +// data_io.v +// +// data_io for the MiST board +// http://code.google.com/p/mist-board/ +// +// Copyright (c) 2014 Till Harbaum +// +// This source file is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This source file is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +/////////////////////////////////////////////////////////////////////// + +module data_io +( + input clk_sys, + input SPI_SCK, + input SPI_SS2, + input SPI_DI, + + // ARM -> FPGA download + output reg ioctl_download = 0, // signal indicating an active download + output reg [7:0] ioctl_index, // menu index used to upload the file + output ioctl_wr, + output reg [24:0] ioctl_addr, + output reg [7:0] ioctl_dout +); + +/////////////////////////////// DOWNLOADING /////////////////////////////// + +reg [7:0] data_w; +reg [24:0] addr_w; +reg rclk = 0; + +localparam UIO_FILE_TX = 8'h53; +localparam UIO_FILE_TX_DAT = 8'h54; +localparam UIO_FILE_INDEX = 8'h55; + +// data_io has its own SPI interface to the io controller +always@(posedge SPI_SCK, posedge SPI_SS2) begin + reg [6:0] sbuf; + reg [7:0] cmd; + reg [4:0] cnt; + reg [24:0] addr; + + if(SPI_SS2) cnt <= 0; + else begin + rclk <= 0; + + // don't shift in last bit. It is evaluated directly + // when writing to ram + if(cnt != 15) sbuf <= { sbuf[5:0], SPI_DI}; + + // increase target address after write + if(rclk) addr <= addr + 1'd1; + + // count 0-7 8-15 8-15 ... + if(cnt < 15) cnt <= cnt + 1'd1; + else cnt <= 8; + + // finished command byte + if(cnt == 7) cmd <= {sbuf, SPI_DI}; + + // prepare/end transmission + if((cmd == UIO_FILE_TX) && (cnt == 15)) begin + // prepare + if(SPI_DI) begin + addr <= 0; + ioctl_download <= 1; + end else begin + addr_w <= addr; + ioctl_download <= 0; + end + end + + // command 0x54: UIO_FILE_TX + if((cmd == UIO_FILE_TX_DAT) && (cnt == 15)) begin + addr_w <= addr; + data_w <= {sbuf, SPI_DI}; + rclk <= 1; + end + + // expose file (menu) index + if((cmd == UIO_FILE_INDEX) && (cnt == 15)) ioctl_index <= {sbuf, SPI_DI}; + end +end + +assign ioctl_wr = |ioctl_wrd; +reg [1:0] ioctl_wrd; + +always@(negedge clk_sys) begin + reg rclkD, rclkD2; + + rclkD <= rclk; + rclkD2 <= rclkD; + ioctl_wrd<= {ioctl_wrd[0],1'b0}; + + if(rclkD & ~rclkD2) begin + ioctl_dout <= data_w; + ioctl_addr <= addr_w; + ioctl_wrd <= 2'b11; + end +end + +endmodule diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/gen_ram.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/gen_ram.vhd new file mode 100644 index 00000000..f1a95608 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/gen_ram.vhd @@ -0,0 +1,84 @@ +-- ----------------------------------------------------------------------- +-- +-- Syntiac's generic VHDL support files. +-- +-- ----------------------------------------------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +-- +-- Modified April 2016 by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +-- Remove address register when writing +-- +-- ----------------------------------------------------------------------- +-- +-- gen_rwram.vhd +-- +-- ----------------------------------------------------------------------- +-- +-- generic ram. +-- +-- ----------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +-- ----------------------------------------------------------------------- + +entity gen_ram is + generic ( + dWidth : integer := 8; + aWidth : integer := 10 + ); + port ( + clk : in std_logic; + we : in std_logic; + addr : in std_logic_vector((aWidth-1) downto 0); + d : in std_logic_vector((dWidth-1) downto 0); + q : out std_logic_vector((dWidth-1) downto 0) + ); +end entity; + +-- ----------------------------------------------------------------------- + +architecture rtl of gen_ram is + subtype addressRange is integer range 0 to ((2**aWidth)-1); + type ramDef is array(addressRange) of std_logic_vector((dWidth-1) downto 0); + signal ram: ramDef; + + signal rAddrReg : std_logic_vector((aWidth-1) downto 0); + signal qReg : std_logic_vector((dWidth-1) downto 0); +begin +-- ----------------------------------------------------------------------- +-- Signals to entity interface +-- ----------------------------------------------------------------------- +-- q <= qReg; + +-- ----------------------------------------------------------------------- +-- Memory write +-- ----------------------------------------------------------------------- + process(clk) + begin + if rising_edge(clk) then + if we = '1' then + ram(to_integer(unsigned(addr))) <= d; + end if; + end if; + end process; + +-- ----------------------------------------------------------------------- +-- Memory read +-- ----------------------------------------------------------------------- +process(clk) + begin + if rising_edge(clk) then +-- qReg <= ram(to_integer(unsigned(rAddrReg))); +-- rAddrReg <= addr; +---- qReg <= ram(to_integer(unsigned(addr))); + q <= ram(to_integer(unsigned(addr))); + end if; + end process; +--q <= ram(to_integer(unsigned(addr))); +end architecture; + diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/moon_patrol_sound_board.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/moon_patrol_sound_board.vhd new file mode 100644 index 00000000..126fe870 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/moon_patrol_sound_board.vhd @@ -0,0 +1,424 @@ +--------------------------------------------------------------------------------- +-- Moon patrol sound board by Dar (darfpga@aol.fr) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- gen_ram.vhd +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- cpu68 - Version 9th Jan 2004 0.8 +-- 6800/01 compatible CPU core +-- GNU public license - December 2002 : John E. Kent +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- +-- Version 0.0 -- 24/11/2017 -- +-- initial version +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity moon_patrol_sound_board is +port( + clock_E : in std_logic; -- 3.58 Mhz/4 + areset : in std_logic; + + select_sound : in std_logic_vector(7 downto 0); + audio_out : out std_logic_vector(11 downto 0); + + dbg_cpu_addr : out std_logic_vector(15 downto 0) +); +end moon_patrol_sound_board; + +architecture struct of moon_patrol_sound_board is + component YM2149 + port ( + CLK : in std_logic; + CE : in std_logic; + RESET : in std_logic; + A8 : in std_logic := '1'; + A9_L : in std_logic := '0'; + BDIR : in std_logic; -- Bus Direction (0 - read , 1 - write) + BC : in std_logic; -- Bus control + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + CHANNEL_A : out std_logic_vector(7 downto 0); + CHANNEL_B : out std_logic_vector(7 downto 0); + CHANNEL_C : out std_logic_vector(7 downto 0); + + SEL : in std_logic; + MODE : in std_logic; + + ACTIVE : out std_logic_vector(5 downto 0); + + IOA_in : in std_logic_vector(7 downto 0); + IOA_out : out std_logic_vector(7 downto 0); + + IOB_in : in std_logic_vector(7 downto 0); + IOB_out : out std_logic_vector(7 downto 0) + ); + end component; + + signal reset : std_logic := '1'; + signal reset_cnt : integer range 0 to 1000000 := 1000000; + + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_di : std_logic_vector( 7 downto 0); + signal cpu_do : std_logic_vector( 7 downto 0); + signal cpu_rw : std_logic; + signal cpu_irq : std_logic; + signal cpu_nmi : std_logic; + + signal irqraz_cs : std_logic; + signal irqraz_we : std_logic; + + signal wram_cs : std_logic; + signal wram_we : std_logic; + signal wram_do : std_logic_vector( 7 downto 0); + + signal rom_cs : std_logic; + signal rom_do : std_logic_vector( 7 downto 0); + + signal ay1_chan_a : std_logic_vector(7 downto 0); + signal ay1_chan_b : std_logic_vector(7 downto 0); + signal ay1_chan_c : std_logic_vector(7 downto 0); + signal ay1_do : std_logic_vector(7 downto 0); + signal ay1_audio : std_logic_vector(9 downto 0); + signal ay1_port_b_do : std_logic_vector(7 downto 0); + + signal ay2_chan_a : std_logic_vector(7 downto 0); + signal ay2_chan_b : std_logic_vector(7 downto 0); + signal ay2_chan_c : std_logic_vector(7 downto 0); + signal ay2_do : std_logic_vector(7 downto 0); + signal ay2_audio : std_logic_vector(9 downto 0); + + signal ports_cs : std_logic; + signal ports_we : std_logic; + + signal port1_bus : std_logic_vector(7 downto 0); + signal port1_data : std_logic_vector(7 downto 0); + signal port1_ddr : std_logic_vector(7 downto 0); + signal port1_in : std_logic_vector(7 downto 0); + + signal port2_bus : std_logic_vector(7 downto 0); + signal port2_data : std_logic_vector(7 downto 0); + signal port2_ddr : std_logic_vector(7 downto 0); + signal port2_in : std_logic_vector(7 downto 0); + + signal adpcm_cs : std_logic; + signal adpcm_we : std_logic; + signal adpcm_0_di : std_logic_vector(3 downto 0); + + signal select_sound_r : std_logic_vector(7 downto 0); + + signal audio : std_logic_vector(12 downto 0); + + type t_step_size is array(0 to 48) of integer range 0 to 1552; + constant step_size : t_step_size := ( + 16, 17, 19, 21, 23, 25, 28, 31, + 34, 37, 41, 45, 50, 55, 60, 66, + 73, 80, 88, 97, 107, 118, 130, 143, + 157, 173, 190, 209, 230, 253, 279, 307, + 337, 371, 408, 449, 494, 544, 598, 658, + 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552); + + type t_delta_step is array(0 to 7) of integer range -1 to 8; + constant delta_step : t_delta_step := (-1,-1,-1,-1,2,4,6,8); + + signal adpcm_vclk : std_logic := '0'; + signal adpcm_signal : integer range -16384 to 16383 := 0; + +-- adpcm algorithm (4bits) [no pcm here] +-- +-- val : input value 3bits (0 - 7 : b2b1b0) +-- sign : input value sign (4th bit : 0=>sign=1 ,1=>sign=-1) +-- +-- step : internal data, init = 0 +-- signal : output value, init = 0; +-- +-- for each new val (and sign) : +-- | +-- | step_size = 16*1.1^(step) +-- | delta = sign * (step_size/8 + step_size/4*b0 + step_size/2*b1 + step_size*b2) +-- | signal = signal + delta +-- | step = step + delta_step(val) +-- | +-- | signal is then limited between -2048..2047 +-- | step is then limited between 0..48 + +begin + +dbg_cpu_addr <= cpu_addr; + +-- cs +wram_cs <= '1' when cpu_addr(15 downto 7) = X"00"&'1' else '0'; -- 0080-00FF +ports_cs <= '1' when cpu_addr(15 downto 4) = X"000" else '0'; -- 0000-000F +adpcm_cs <= '1' when cpu_addr(14 downto 11) = "0001" else '0'; -- 0800-0FFF / 8800-8FFF +irqraz_cs <= '1' when cpu_addr(14 downto 12) = "001" else '0'; -- 1000-1FFF / 9000-9FFF +rom_cs <= '1' when cpu_addr(14 downto 12) = "111" else '0'; -- 7000-7FFF / F000-FFFF + +-- write enables +wram_we <= '1' when cpu_rw = '0' and wram_cs = '1' else '0'; +ports_we <= '1' when cpu_rw = '0' and ports_cs = '1' else '0'; +adpcm_we <= '1' when cpu_rw = '0' and adpcm_cs = '1' else '0'; +irqraz_we <= '1' when cpu_rw = '0' and irqraz_cs = '1' else '0'; + +-- mux cpu in data between roms/io/wram +cpu_di <= + wram_do when wram_cs = '1' else + port1_ddr when ports_cs = '1' and cpu_addr(3 downto 0) = X"0" else + port2_ddr when ports_cs = '1' and cpu_addr(3 downto 0) = X"1" else + port1_in when ports_cs = '1' and cpu_addr(3 downto 0) = X"2" else + port2_in when ports_cs = '1' and cpu_addr(3 downto 0) = X"3" else + rom_do when rom_cs = '1' else X"55"; + +process (clock_E) +begin + if rising_edge(clock_E) then + reset <= '0'; + if reset_cnt /= 0 then + reset_cnt <= reset_cnt - 1; + reset <= '1'; + end if; + if areset = '1' then + reset_cnt <= 1000000; + end if; + end if; +end process; + +-- irq to cpu +process (reset, clock_E) +begin + if reset='1' then + cpu_irq <= '0'; + select_sound_r(7) <= '1'; + elsif rising_edge(clock_E) then + select_sound_r <= select_sound; + if select_sound_r(7) = '0' then + cpu_irq <= '1'; + end if; + if irqraz_we = '1' then + cpu_irq <= '0'; + end if; + end if; +end process; + +-- cpu nmi +cpu_nmi <= adpcm_vclk; + +-- 6803 ports 1 and 2 (only) +process (reset, clock_E) +begin + if reset='1' then + port1_ddr <= (others=>'0'); -- port1 set as input + port1_data <= (others=>'0'); -- port1 data set to 0 + port2_ddr <= ("11100000"); -- port2 bit 7 to 5 should always remain output to simulate mode data + port2_data <= ("01000000"); -- port2 data bit 7 to 5 set to 2 (for mode 2 at start up) + elsif rising_edge(clock_E) then + if ports_cs = '1' and ports_we = '1' then + if cpu_addr(3 downto 0) = X"0" then port1_ddr <= cpu_do; end if; + if cpu_addr(3 downto 0) = X"1" then port2_ddr <= cpu_do and "11100000"; end if; + if cpu_addr(3 downto 0) = X"2" then port1_data <= cpu_do; end if; + if cpu_addr(3 downto 0) = X"3" then port2_data <= cpu_do; end if; + end if; + end if; +end process; + +port1_in <= (port1_bus and not(port1_ddr)) or (port1_data and port1_ddr); +port2_in <= (port2_bus and not(port2_ddr)) or (port2_data and port2_ddr); + +-- port1 bus mux +port1_bus <= ay1_do when port2_data(4) = '0' else + ay2_do when port2_data(3) = '0' else X"FF"; + +-- port2 bus +port2_bus <= X"FF"; + + +-- latch adpcm (msm5205) data in +process (reset, clock_E) +begin + if reset='1' then + adpcm_0_di <= (others=>'0'); + elsif rising_edge(clock_E) then + if adpcm_cs = '1' and adpcm_we = '1' then + if cpu_addr(1) = '0' then adpcm_0_di <= cpu_do(3 downto 0); end if; + end if; + end if; +end process; + +-- adcpm clocks and computation -- make 24kHz and vclk 8/6/4kHz +adpcm_clocks : process(clock_E, ay1_port_b_do) + variable clock_div_a : integer range 0 to 148 := 0; + variable clock_div_b : integer range 0 to 5 := 0; + variable step : integer range 0 to 48; + variable step_n : integer range -1 to 48+8; + variable sz : integer range 0 to 1552; + variable dn : integer range -32768 to 32767; + variable adpcm_signal_n : integer range -32768 to 32767; +begin + if rising_edge(clock_E) then + if clock_div_a = 37 then -- 24kHz + clock_div_a := 0; + + case ay1_port_b_do(3 downto 2) is + when "00" => if clock_div_b = 5 then clock_div_b := 0; else clock_div_b := clock_div_b +1; end if; -- 4kHz + when "01" => if clock_div_b = 2 then clock_div_b := 0; else clock_div_b := clock_div_b +1; end if; -- 8kHz + when "10" => if clock_div_b = 3 then clock_div_b := 0; else clock_div_b := clock_div_b +1; end if; -- 6kHz + when others => null; + end case; + + if clock_div_b = 0 then adpcm_vclk <= '1'; else adpcm_vclk <= '0'; end if; + else + clock_div_a := clock_div_a + 1; + end if; + + if ay1_port_b_do(0) = '1' then + step := 0; + adpcm_signal <= 0; + else + + if clock_div_b = 0 then + case clock_div_a is + + when 0 => -- it's time to get new nibble (adpcm_0_di) + + sz := step_size(step); + dn := sz/8; + if adpcm_0_di(0) = '1' then dn := dn + sz/4; end if; + if adpcm_0_di(1) = '1' then dn := dn + sz/2; end if; + if adpcm_0_di(2) = '1' then dn := dn + sz ; end if; + + if adpcm_0_di(3) = '1' then + dn := -dn; + end if; + + step_n := step + delta_step(to_integer(unsigned(adpcm_0_di(2 downto 0)))); + + when 4 => + + adpcm_signal_n := adpcm_signal + dn; + + if step_n > 48 then step := 48; else step := step_n; end if; + if step_n < 0 then step := 0; else step := step_n; end if; + + when 8 => + + if adpcm_signal_n > 2040 then adpcm_signal <= 2040; else adpcm_signal <= adpcm_signal_n; end if; + if adpcm_signal_n < -2040 then adpcm_signal <= -2040; else adpcm_signal <= adpcm_signal_n; end if; + + when others => null; + + end case; + end if; + + end if; + end if; +end process; + +-- audio mux +audio <= ("000"&ay1_audio) + ("000"&ay2_audio) + ('0'&std_logic_vector(to_unsigned((adpcm_signal)+2048,12))); +audio_out <= audio(12 downto 1); + +-- microprocessor 6800/01/03 +main_cpu : entity work.cpu68 +port map( + clk => clock_E, -- E clock input (falling edge) + rst => reset, -- reset input (active high) + rw => cpu_rw, -- read not write output + vma => open, -- valid memory address (active high) + address => cpu_addr, -- address bus output + data_in => cpu_di, -- data bus input + data_out => cpu_do, -- data bus output + hold => '0', -- hold input (active high) extend bus cycle + halt => '0', -- halt input (active high) grants DMA + irq => cpu_irq, -- interrupt request input (active high) + nmi => cpu_nmi, -- non maskable interrupt request input (active high) + test_alu => open, + test_cc => open +); + +-- cpu program rom +cpu_prog_rom : entity work.travusa_sound +port map( + clk => clock_E, + addr => cpu_addr(11 downto 0), + data => rom_do +); + +-- cpu wram +cpu_ram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 7) +port map( + clk => clock_E, + we => wram_we, + addr => cpu_addr(6 downto 0), + d => cpu_do, + q => wram_do +); + + ay83910_inst1: YM2149 + port map ( + CLK => clock_E, + CE => '1', + RESET => reset, + A8 => '1', + A9_L => port2_data(4), + BDIR => port2_data(0), + BC => port2_data(2), + DI => port1_data, + DO => ay1_do, + CHANNEL_A => ay1_chan_a, + CHANNEL_B => ay1_chan_b, + CHANNEL_C => ay1_chan_c, + + SEL => '0', + MODE => '1', + + ACTIVE => open, + + IOA_in => select_sound_r, + IOA_out => open, + + IOB_in => (others => '0'), + IOB_out => ay1_port_b_do + ); + + ay1_audio <= "0000000000" + ay1_chan_a + ay1_chan_b + ay1_chan_c; + + ay83910_inst2: YM2149 + port map ( + CLK => clock_E, + CE => '1', + RESET => reset, + A8 => '1', + A9_L => port2_data(3), + BDIR => port2_data(0), + BC => port2_data(2), + DI => port1_data, + DO => ay2_do, + CHANNEL_A => ay2_chan_a, + CHANNEL_B => ay2_chan_b, + CHANNEL_C => ay2_chan_c, + + SEL => '0', + MODE => '1', + + ACTIVE => open, + + IOA_in => (others => '0'), + IOA_out => open, + + IOB_in => (others => '0'), + IOB_out => open + ); + + ay2_audio <= "0000000000" + ay2_chan_a + ay2_chan_b + ay2_chan_c; + +end struct; \ No newline at end of file diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/pll_mist.ppf b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/pll_mist.ppf new file mode 100644 index 00000000..f2b387ff --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/pll_mist.ppf @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/pll_mist.qip b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/pll_mist.qip new file mode 100644 index 00000000..d4720390 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/pll_mist.qip @@ -0,0 +1,4 @@ +set_global_assignment -name IP_TOOL_NAME "ALTPLL" +set_global_assignment -name IP_TOOL_VERSION "13.1" +set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "pll_mist.vhd"] +set_global_assignment -name MISC_FILE [file join $::quartus(qip_path) "pll_mist.ppf"] diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/pll_mist.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/pll_mist.vhd new file mode 100644 index 00000000..d34f8803 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/pll_mist.vhd @@ -0,0 +1,397 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll_mist.vhd +-- Megafunction Name(s): +-- altpll +-- +-- Simulation Library Files(s): +-- altera_mf +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 13.1.4 Build 182 03/12/2014 SJ Web Edition +-- ************************************************************ + + +--Copyright (C) 1991-2014 Altera Corporation +--Your use of Altera 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 Altera Program License +--Subscription Agreement, Altera 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 Altera and sold by +--Altera 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.all; + +ENTITY pll_mist IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + c1 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END pll_mist; + + +ARCHITECTURE SYN OF pll_mist IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (4 DOWNTO 0); + SIGNAL sub_wire1 : STD_LOGIC ; + SIGNAL sub_wire2 : STD_LOGIC ; + SIGNAL sub_wire3 : STD_LOGIC ; + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire6_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (0 DOWNTO 0); + + + + COMPONENT altpll + GENERIC ( + bandwidth_type : STRING; + clk0_divide_by : NATURAL; + clk0_duty_cycle : NATURAL; + clk0_multiply_by : NATURAL; + clk0_phase_shift : STRING; + clk1_divide_by : NATURAL; + clk1_duty_cycle : NATURAL; + clk1_multiply_by : NATURAL; + clk1_phase_shift : STRING; + compensate_clock : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + lpm_hint : STRING; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + port_activeclock : STRING; + port_areset : STRING; + port_clkbad0 : STRING; + port_clkbad1 : STRING; + port_clkloss : STRING; + port_clkswitch : STRING; + port_configupdate : STRING; + port_fbin : STRING; + port_inclk0 : STRING; + port_inclk1 : STRING; + port_locked : STRING; + port_pfdena : STRING; + port_phasecounterselect : STRING; + port_phasedone : STRING; + port_phasestep : STRING; + port_phaseupdown : STRING; + port_pllena : STRING; + port_scanaclr : STRING; + port_scanclk : STRING; + port_scanclkena : STRING; + port_scandata : STRING; + port_scandataout : STRING; + port_scandone : STRING; + port_scanread : STRING; + port_scanwrite : STRING; + port_clk0 : STRING; + port_clk1 : STRING; + port_clk2 : STRING; + port_clk3 : STRING; + port_clk4 : STRING; + port_clk5 : STRING; + port_clkena0 : STRING; + port_clkena1 : STRING; + port_clkena2 : STRING; + port_clkena3 : STRING; + port_clkena4 : STRING; + port_clkena5 : STRING; + port_extclk0 : STRING; + port_extclk1 : STRING; + port_extclk2 : STRING; + port_extclk3 : STRING; + self_reset_on_loss_lock : STRING; + width_clock : NATURAL + ); + PORT ( + areset : IN STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (4 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC + ); + END COMPONENT; + +BEGIN + sub_wire6_bv(0 DOWNTO 0) <= "0"; + sub_wire6 <= To_stdlogicvector(sub_wire6_bv); + sub_wire3 <= sub_wire0(0); + sub_wire1 <= sub_wire0(1); + c1 <= sub_wire1; + locked <= sub_wire2; + c0 <= sub_wire3; + sub_wire4 <= inclk0; + sub_wire5 <= sub_wire6(0 DOWNTO 0) & sub_wire4; + + altpll_component : altpll + GENERIC MAP ( + bandwidth_type => "AUTO", + clk0_divide_by => 30, + clk0_duty_cycle => 50, + clk0_multiply_by => 41, + clk0_phase_shift => "0", + clk1_divide_by => 2475, + clk1_duty_cycle => 50, + clk1_multiply_by => 82, + clk1_phase_shift => "0", + compensate_clock => "CLK0", + inclk0_input_frequency => 37037, + intended_device_family => "Cyclone III", + lpm_hint => "CBX_MODULE_PREFIX=pll_mist", + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + port_activeclock => "PORT_UNUSED", + port_areset => "PORT_USED", + port_clkbad0 => "PORT_UNUSED", + port_clkbad1 => "PORT_UNUSED", + port_clkloss => "PORT_UNUSED", + port_clkswitch => "PORT_UNUSED", + port_configupdate => "PORT_UNUSED", + port_fbin => "PORT_UNUSED", + port_inclk0 => "PORT_USED", + port_inclk1 => "PORT_UNUSED", + port_locked => "PORT_USED", + port_pfdena => "PORT_UNUSED", + port_phasecounterselect => "PORT_UNUSED", + port_phasedone => "PORT_UNUSED", + port_phasestep => "PORT_UNUSED", + port_phaseupdown => "PORT_UNUSED", + port_pllena => "PORT_UNUSED", + port_scanaclr => "PORT_UNUSED", + port_scanclk => "PORT_UNUSED", + port_scanclkena => "PORT_UNUSED", + port_scandata => "PORT_UNUSED", + port_scandataout => "PORT_UNUSED", + port_scandone => "PORT_UNUSED", + port_scanread => "PORT_UNUSED", + port_scanwrite => "PORT_UNUSED", + port_clk0 => "PORT_USED", + port_clk1 => "PORT_USED", + port_clk2 => "PORT_UNUSED", + port_clk3 => "PORT_UNUSED", + port_clk4 => "PORT_UNUSED", + port_clk5 => "PORT_UNUSED", + port_clkena0 => "PORT_UNUSED", + port_clkena1 => "PORT_UNUSED", + port_clkena2 => "PORT_UNUSED", + port_clkena3 => "PORT_UNUSED", + port_clkena4 => "PORT_UNUSED", + port_clkena5 => "PORT_UNUSED", + port_extclk0 => "PORT_UNUSED", + port_extclk1 => "PORT_UNUSED", + port_extclk2 => "PORT_UNUSED", + port_extclk3 => "PORT_UNUSED", + self_reset_on_loss_lock => "OFF", + width_clock => 5 + ) + PORT MAP ( + areset => areset, + inclk => sub_wire5, + clk => sub_wire0, + locked => sub_wire2 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0" +-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000" +-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz" +-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1" +-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0" +-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0" +-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "0" +-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0" +-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0" +-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0" +-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0" +-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "c0" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "8" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "30" +-- Retrieval info: PRIVATE: DIV_FACTOR1 NUMERIC "2475" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE1 STRING "50.00000000" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "36.900002" +-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE1 STRING "0.894545" +-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0" +-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575" +-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1" +-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "27.000" +-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000" +-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "1" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "Not Available" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT1 STRING "deg" +-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK1 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "41" +-- Retrieval info: PRIVATE: MULT_FACTOR1 NUMERIC "82" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "36.86400000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ1 STRING "0.89500000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE1 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT1 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT1 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT1 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1" +-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1" +-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0" +-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0" +-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pll_mist.mif" +-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0" +-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000" +-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz" +-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500" +-- Retrieval info: PRIVATE: SPREAD_USE STRING "0" +-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0" +-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1" +-- Retrieval info: PRIVATE: STICKY_CLK1 STRING "1" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1" +-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLK1 STRING "1" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA1 STRING "0" +-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0" +-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0" +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: CONSTANT: BANDWIDTH_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "30" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "41" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: CLK1_DIVIDE_BY NUMERIC "2475" +-- Retrieval info: CONSTANT: CLK1_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK1_MULTIPLY_BY NUMERIC "82" +-- Retrieval info: CONSTANT: CLK1_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "37037" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone III" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL" +-- Retrieval info: CONSTANT: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_USED" +-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED" +-- Retrieval info: CONSTANT: SELF_RESET_ON_LOSS_LOCK STRING "OFF" +-- Retrieval info: CONSTANT: WIDTH_CLOCK NUMERIC "5" +-- Retrieval info: USED_PORT: @clk 0 0 5 0 OUTPUT_CLK_EXT VCC "@clk[4..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0" +-- Retrieval info: USED_PORT: c1 0 0 0 0 OUTPUT_CLK_EXT VCC "c1" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0" +-- Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked" +-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0 +-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0 +-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0 +-- Retrieval info: CONNECT: c1 0 0 0 0 @clk 0 0 1 1 +-- Retrieval info: CONNECT: locked 0 0 0 0 @locked 0 0 0 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_mist.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_mist.ppf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_mist.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_mist.cmp FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_mist.bsf FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_mist_inst.vhd FALSE +-- Retrieval info: LIB_FILE: altera_mf +-- Retrieval info: CBX_MODULE_PREFIX: ON diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_chr_bit1.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_chr_bit1.vhd new file mode 100644 index 00000000..89678cad --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_chr_bit1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity travusa_chr_bit1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(12 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of travusa_chr_bit1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"40",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"02", + X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"10",X"08",X"08",X"10",X"10",X"20",X"20",X"10",X"10",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"30",X"30",X"30",X"30",X"30", + X"30",X"30",X"30",X"30",X"38",X"30",X"20",X"00",X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"00", + X"00",X"00",X"00",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"48",X"FC",X"48",X"24",X"7E",X"24", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"44",X"82",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"82",X"44",X"38",X"00",X"80",X"40",X"20",X"10",X"08",X"04",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"16",X"0E",X"00",X"00",X"00", + X"00",X"00",X"16",X"0E",X"00",X"00",X"16",X"0E",X"00",X"F8",X"FC",X"26",X"22",X"26",X"FC",X"F8", + X"00",X"FE",X"FE",X"92",X"92",X"92",X"FE",X"6C",X"00",X"38",X"7C",X"C6",X"82",X"82",X"C6",X"44", + X"00",X"FE",X"FE",X"82",X"82",X"C6",X"7C",X"38",X"00",X"FE",X"FE",X"92",X"92",X"92",X"82",X"80", + X"00",X"FE",X"FE",X"12",X"12",X"12",X"12",X"02",X"00",X"38",X"7C",X"C6",X"82",X"92",X"F2",X"F2", + X"00",X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"00",X"82",X"82",X"FE",X"FE",X"82",X"82",X"00", + X"00",X"40",X"C0",X"80",X"80",X"80",X"7E",X"7E",X"00",X"FE",X"FE",X"30",X"78",X"EC",X"C6",X"82", + X"00",X"FE",X"FE",X"80",X"80",X"80",X"80",X"80",X"00",X"FE",X"FE",X"1C",X"38",X"1C",X"FE",X"FE", + X"00",X"FE",X"FE",X"1C",X"38",X"70",X"FE",X"FE",X"00",X"7C",X"FE",X"82",X"82",X"82",X"FE",X"7C", + X"00",X"FE",X"FE",X"22",X"22",X"22",X"3E",X"1C",X"00",X"7C",X"FE",X"82",X"A2",X"C2",X"7E",X"FC", + X"00",X"FE",X"FE",X"22",X"62",X"F2",X"DE",X"9C",X"00",X"4C",X"DE",X"92",X"92",X"96",X"F4",X"60", + X"00",X"02",X"02",X"FE",X"FE",X"02",X"02",X"00",X"00",X"7E",X"FE",X"80",X"80",X"80",X"FE",X"7E", + X"00",X"1E",X"3E",X"70",X"E0",X"70",X"3E",X"1E",X"00",X"FE",X"FE",X"70",X"38",X"70",X"FE",X"FE", + X"00",X"C6",X"EE",X"7C",X"38",X"7C",X"EE",X"C6",X"00",X"0E",X"1E",X"F0",X"F0",X"1E",X"0E",X"00", + X"00",X"C6",X"E6",X"F6",X"DE",X"CE",X"C6",X"00",X"00",X"1E",X"04",X"1A",X"00",X"1C",X"04",X"18", + X"84",X"58",X"20",X"10",X"08",X"F4",X"22",X"C0",X"3C",X"42",X"99",X"A5",X"A5",X"91",X"42",X"3C", + X"00",X"1E",X"04",X"08",X"04",X"1E",X"00",X"90",X"40",X"20",X"10",X"08",X"04",X"F2",X"20",X"C0", + X"F8",X"80",X"80",X"00",X"80",X"00",X"F0",X"48",X"48",X"F0",X"00",X"80",X"00",X"00",X"00",X"00", + X"F8",X"80",X"80",X"00",X"80",X"00",X"38",X"40",X"80",X"40",X"38",X"80",X"00",X"00",X"00",X"00", + X"F8",X"20",X"20",X"F8",X"00",X"70",X"88",X"88",X"70",X"00",X"78",X"80",X"80",X"78",X"00",X"80", + X"90",X"A8",X"A8",X"40",X"00",X"08",X"F8",X"08",X"80",X"00",X"00",X"F8",X"80",X"80",X"00",X"80", + X"70",X"88",X"88",X"00",X"F8",X"20",X"20",X"F8",X"00",X"F8",X"00",X"80",X"00",X"00",X"00",X"00", + X"1F",X"02",X"04",X"1F",X"00",X"10",X"03",X"04",X"1C",X"04",X"13",X"00",X"00",X"00",X"00",X"00", + X"FF",X"07",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"C0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"AA",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"EA",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"E0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38",X"00",X"80",X"84",X"FE",X"FE",X"80",X"80",X"00", + X"00",X"CC",X"E6",X"F2",X"B2",X"BA",X"9E",X"8C",X"00",X"40",X"C2",X"92",X"9A",X"9E",X"F6",X"62", + X"00",X"30",X"38",X"2C",X"26",X"FE",X"FE",X"20",X"00",X"4E",X"CE",X"8A",X"8A",X"FA",X"70",X"00", + X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60",X"00",X"06",X"06",X"E2",X"F2",X"1A",X"0E",X"06", + X"00",X"6C",X"9E",X"9A",X"B2",X"B2",X"EC",X"60",X"00",X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C", + X"00",X"40",X"C0",X"80",X"80",X"80",X"FE",X"7E",X"00",X"7E",X"FE",X"80",X"80",X"80",X"FE",X"7E", + X"00",X"FE",X"FE",X"1C",X"38",X"1C",X"FE",X"FE",X"00",X"FE",X"FE",X"22",X"22",X"22",X"3E",X"1C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"20",X"20",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"E3",X"C1",X"C1",X"C1",X"C3",X"E3",X"E7",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"3F",X"1F",X"0F",X"07",X"47",X"E3",X"73",X"E3",X"E3",X"B3", + X"F7",X"E7",X"4F",X"1F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FD",X"F3",X"E0",X"E0",X"E2",X"C2", + X"C7",X"C3",X"CB",X"CF",X"CF",X"E5",X"E5",X"E5",X"E1",X"E0",X"F0",X"F8",X"FC",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"73",X"34",X"37",X"43",X"81",X"80",X"00",X"00",X"FF",X"FE",X"FC",X"FC",X"FC",X"FC",X"FE",X"FE", + X"FF",X"3F",X"3F",X"43",X"81",X"80",X"00",X"00",X"FF",X"FE",X"FC",X"FC",X"FC",X"FC",X"FE",X"FE", + X"0F",X"03",X"01",X"00",X"00",X"80",X"A1",X"BF",X"FC",X"FC",X"FC",X"FC",X"FE",X"FF",X"FF",X"FF", + X"0F",X"03",X"01",X"00",X"00",X"80",X"E1",X"FF",X"FC",X"FC",X"FC",X"FC",X"FE",X"FF",X"FF",X"FF", + X"DC",X"DC",X"9C",X"DC",X"DE",X"DF",X"1F",X"BF",X"06",X"20",X"20",X"20",X"00",X"00",X"00",X"00", + X"0E",X"17",X"1F",X"1E",X"1F",X"0F",X"0F",X"07",X"07",X"05",X"03",X"03",X"03",X"03",X"03",X"03", + X"03",X"03",X"03",X"03",X"07",X"07",X"06",X"0E",X"0C",X"15",X"1D",X"19",X"1B",X"1B",X"1B",X"2B", + X"3B",X"3B",X"3B",X"19",X"1D",X"1C",X"1E",X"0E",X"0C",X"0E",X"0E",X"06",X"0E",X"0E",X"0E",X"0E", + X"FF",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"7F",X"3F",X"BF",X"BF",X"BF",X"9F",X"DF",X"DF",X"9F",X"DF",X"DF",X"DF",X"DF",X"1F",X"BF", + X"BF",X"BF",X"3F",X"7F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F3",X"F4",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F2",X"F9",X"FC",X"FE",X"FE",X"FE",X"FE",X"FE", + X"FC",X"FD",X"FD",X"FD",X"F9",X"FA",X"FB",X"FB",X"73",X"F4",X"E7",X"EF",X"CF",X"DF",X"9B",X"8D", + X"BF",X"BF",X"BF",X"BF",X"BF",X"BF",X"BE",X"AF",X"9F",X"DF",X"DF",X"CB",X"ED",X"EF",X"EF",X"E7", + X"F0",X"F0",X"F0",X"F0",X"C0",X"F0",X"F0",X"70",X"F0",X"F8",X"F8",X"E8",X"D8",X"FC",X"FC",X"7C", + X"B4",X"F8",X"F8",X"F8",X"F8",X"F8",X"E8",X"F0",X"F0",X"F0",X"E0",X"E0",X"C0",X"C0",X"C0",X"80", + X"80",X"80",X"80",X"80",X"80",X"40",X"C0",X"C0",X"C0",X"C0",X"C0",X"A0",X"E0",X"E0",X"E0",X"F0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F0",X"F0",X"F8",X"FC",X"FC",X"FE",X"FE",X"FF",X"FF",X"FF",X"FD",X"F9",X"79",X"1D",X"3D",X"2F", + X"DF",X"9E",X"DC",X"DC",X"DC",X"DC",X"1E",X"BE",X"FF",X"3F",X"3F",X"43",X"80",X"80",X"00",X"00", + X"FC",X"FC",X"FC",X"FC",X"FE",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3D",X"1C",X"0C",X"06",X"06",X"06",X"0E",X"1A",X"BF",X"BE",X"3C",X"7C",X"7C",X"7C",X"7E",X"FE", + X"FF",X"3F",X"3F",X"43",X"81",X"80",X"00",X"00",X"FC",X"FC",X"FC",X"FC",X"FE",X"FF",X"FF",X"FF", + X"F0",X"90",X"D0",X"F0",X"10",X"F0",X"F0",X"F0",X"07",X"03",X"01",X"00",X"00",X"40",X"C1",X"C5", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"FE",X"70",X"38",X"70",X"FE",X"FE", + X"00",X"FE",X"FE",X"10",X"10",X"10",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"F8",X"E0",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FC", + X"F0",X"F0",X"60",X"60",X"C0",X"80",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"6F",X"3F",X"1F",X"17",X"1F",X"3F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"F0",X"C0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"1F",X"03",X"00",X"80",X"C0",X"E0",X"00",X"00",X"00",X"00",X"80",X"C0",X"60",X"F0", + X"FE",X"FF",X"FF",X"FF",X"7D",X"3F",X"3F",X"FF",X"0F",X"00",X"00",X"01",X"E1",X"03",X"C6",X"EC", + X"F0",X"F0",X"E0",X"E0",X"C0",X"80",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FE",X"E7",X"E7",X"E3",X"E0",X"F0",X"F8",X"FC",X"FE",X"FF",X"FF",X"87",X"0F", + X"1F",X"3F",X"03",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"FF",X"FF",X"7F",X"3F",X"1F", + X"1F",X"74",X"F0",X"C1",X"E1",X"C3",X"8F",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F3",X"F1",X"E1",X"DF",X"FF",X"FF",X"FF",X"7F",X"FF",X"BF",X"FF",X"FF",X"FF",X"CF",X"83",X"80", + X"00",X"40",X"60",X"F0",X"FC",X"FE",X"FC",X"FE",X"3F",X"03",X"01",X"A0",X"F8",X"38",X"58",X"DC", + X"DE",X"CF",X"87",X"07",X"1F",X"FF",X"FF",X"FF",X"0F",X"0F",X"0F",X"1F",X"1F",X"1F",X"3F",X"3F", + X"7F",X"1F",X"0F",X"07",X"03",X"03",X"01",X"00",X"00",X"00",X"01",X"01",X"01",X"03",X"03",X"07", + X"0C",X"08",X"08",X"1E",X"1F",X"1F",X"30",X"21",X"00",X"FE",X"FE",X"92",X"92",X"92",X"82",X"80", + X"00",X"FE",X"FE",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"82",X"FE",X"FE",X"82",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"3F",X"FC",X"E0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"FF",X"FF",X"FF",X"FF",X"E7",X"42",X"00", + X"FF",X"FF",X"F8",X"00",X"00",X"00",X"00",X"00",X"FE",X"E0",X"00",X"00",X"00",X"00",X"01",X"07", + X"F3",X"38",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"7F",X"FF",X"FF", + X"04",X"03",X"FB",X"FF",X"FF",X"FB",X"FC",X"E0",X"FF",X"FF",X"FF",X"FF",X"F8",X"E0",X"20",X"20", + X"80",X"00",X"00",X"03",X"07",X"0F",X"1F",X"1F",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3F",X"FF",X"FE",X"FC",X"E0",X"80",X"01",X"03",X"0F",X"1F",X"FF",X"FF",X"FF",X"FE",X"F8",X"F8", + X"FC",X"E0",X"E0",X"80",X"80",X"00",X"00",X"00",X"F8",X"C8",X"08",X"0B",X"37",X"F7",X"F7",X"F7", + X"00",X"00",X"3F",X"FF",X"FF",X"F2",X"C0",X"00",X"3F",X"FE",X"FC",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7F",X"FF", + X"E0",X"00",X"00",X"00",X"1F",X"FF",X"FF",X"FF",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"3F",X"FC",X"E0",X"00",X"00",X"01",X"0F",X"7F", + X"FF",X"FF",X"F8",X"C0",X"00",X"00",X"00",X"00",X"00",X"01",X"0F",X"3F",X"F8",X"E0",X"80",X"00", + X"03",X"0F",X"3F",X"FF",X"FE",X"F8",X"E0",X"80",X"00",X"00",X"00",X"00",X"00",X"03",X"0F",X"3E", + X"F8",X"E0",X"80",X"00",X"03",X"0F",X"3F",X"FF",X"FE",X"F8",X"E0",X"80",X"00",X"00",X"00",X"00", + X"00",X"03",X"0F",X"3E",X"F8",X"E0",X"80",X"00",X"0E",X"1F",X"3F",X"1F",X"3F",X"7F",X"6F",X"1F", + X"00",X"03",X"1F",X"FE",X"F0",X"80",X"00",X"00",X"07",X"3F",X"FF",X"FF",X"FC",X"E0",X"00",X"00", + X"00",X"00",X"00",X"00",X"07",X"7F",X"FC",X"C0",X"00",X"00",X"01",X"1F",X"FF",X"FF",X"FF",X"F0", + X"00",X"03",X"0F",X"7E",X"F8",X"C0",X"00",X"00",X"07",X"7F",X"FF",X"FF",X"FC",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"1F",X"FE",X"F0",X"80",X"00",X"00",X"07",X"3F",X"FF",X"FF",X"FC", + X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7F", + X"C0",X"00",X"00",X"00",X"1F",X"FF",X"FF",X"FF",X"70",X"38",X"B8",X"DC",X"FC",X"F8",X"FC",X"FC", + X"00",X"01",X"1F",X"FF",X"F0",X"00",X"00",X"00",X"07",X"7F",X"FF",X"FF",X"FC",X"C0",X"00",X"00", + X"00",X"00",X"00",X"01",X"7F",X"FF",X"C0",X"00",X"00",X"00",X"1F",X"FF",X"FF",X"FF",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"1F",X"FF",X"F0",X"00",X"00",X"00",X"07",X"FF",X"FF",X"FF",X"FC", + X"FF",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"FC",X"E0",X"00",X"00",X"00",X"00",X"00", + X"F8",X"E0",X"80",X"00",X"00",X"00",X"00",X"00",X"3F",X"FF",X"E0",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"0F",X"1E",X"38",X"70",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"0E",X"0C",X"1C",X"18",X"18",X"18", + X"18",X"18",X"18",X"18",X"18",X"1C",X"1F",X"0F",X"00",X"00",X"00",X"00",X"03",X"0F",X"3F",X"FF", + X"FE",X"78",X"60",X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"FC",X"3E",X"07",X"03",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"E0",X"60",X"70",X"70",X"30",X"38",X"18",X"18", + X"1C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"FF", + X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"3F",X"3D",X"18",X"01",X"0F",X"06",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"FF",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"FF",X"1F",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"80",X"F8",X"FF",X"0F",X"00",X"00",X"00",X"00", + X"00",X"00",X"C0",X"F8",X"7F",X"0F",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"F8",X"3E", + X"C0",X"E0",X"70",X"38",X"1C",X"0E",X"07",X"1E",X"C0",X"E0",X"70",X"38",X"1C",X"0E",X"FF",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"F0",X"7C",X"1F",X"07",X"00",X"00",X"00",X"00", + X"00",X"80",X"FF",X"FF",X"00",X"00",X"00",X"00",X"07",X"00",X"03",X"0F",X"7E",X"F8",X"C0",X"00", + X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"F8",X"3E",X"0F",X"03",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"E0",X"F0",X"3C",X"1E",X"07",X"03",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"C0",X"F0",X"78",X"1E",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"70",X"38",X"1C",X"0E",X"07",X"03", + X"F4",X"70",X"40",X"E0",X"A0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06", + X"3E",X"FF",X"FF",X"FC",X"E0",X"00",X"00",X"00",X"00",X"01",X"0F",X"FF",X"FF",X"FF",X"F8",X"80", + X"00",X"00",X"00",X"00",X"1F",X"FF",X"FF",X"FF",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"07",X"FF",X"FF",X"FF",X"FC",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"1F", + X"00",X"00",X"01",X"03",X"07",X"0F",X"1F",X"3E",X"7C",X"38",X"10",X"00",X"00",X"00",X"00",X"00", + X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"3F",X"FC", + X"3F",X"1F",X"00",X"60",X"E0",X"C0",X"80",X"00",X"E0",X"F8",X"E0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"3F",X"FE",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"3F",X"FE",X"E0", + X"00",X"20",X"9C",X"83",X"A0",X"F8",X"FF",X"E1",X"80",X"FE",X"FF",X"FF",X"FF",X"00",X"00",X"00", + X"00",X"00",X"E0",X"E0",X"E0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"3E", + X"00",X"00",X"00",X"C1",X"33",X"03",X"01",X"20",X"0F",X"7F",X"F8",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"3F",X"FE",X"E0",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"3F",X"FE",X"E0",X"00",X"00",X"00",X"00",X"00",X"E0",X"E0",X"F0",X"F0",X"F8",X"F8",X"F8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"0F",X"7F",X"FF",X"FF",X"F8",X"C0",X"00",X"00", + X"40",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"FE",X"E0",X"07",X"3F",X"FF",X"FF",X"FC",X"E0", + X"03",X"3F",X"FE",X"E0",X"03",X"1F",X"FF",X"FF",X"FE",X"F0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"3F",X"FE",X"E0",X"01",X"0F",X"FF",X"FF",X"FF",X"F8",X"80",X"00",X"00",X"00", + X"70",X"70",X"FC",X"FC",X"FF",X"7F",X"7F",X"07",X"00",X"07",X"7F",X"FF",X"FF",X"FC",X"C0",X"00", + X"00",X"00",X"00",X"03",X"FF",X"FF",X"FF",X"FE",X"00",X"00",X"00",X"00",X"00",X"01",X"0F",X"7F", + X"78",X"78",X"78",X"7B",X"33",X"A7",X"AF",X"FC",X"00",X"00",X"00",X"07",X"3F",X"FF",X"FF",X"FC", + X"FF",X"FE",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"3F",X"FF",X"7F",X"7C", + X"20",X"F0",X"F0",X"F8",X"F8",X"E0",X"80",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00", + X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7C",X"F8",X"F0",X"E0",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"01",X"E3",X"83",X"87",X"C7",X"5E",X"1E",X"7C", + X"B0",X"D8",X"D8",X"5E",X"4E",X"6F",X"EF",X"E7",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"E0", + X"CF",X"FF",X"F8",X"00",X"00",X"00",X"07",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FD",X"F9",X"7B",X"31",X"10",X"00",X"00",X"00",X"F7",X"F7",X"F7",X"F7",X"F0",X"60",X"20",X"00", + X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"02",X"22",X"12", + X"39",X"7F",X"7F",X"FF",X"FE",X"FE",X"FD",X"FF",X"C0",X"80",X"1E",X"7E",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"30",X"78",X"7C",X"FC",X"41",X"E9",X"27",X"33",X"FD",X"7B",X"3B",X"7B", + X"FB",X"F1",X"FB",X"F3",X"FB",X"FF",X"FD",X"FD",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"FC",X"FE",X"FF",X"FF",X"FF",X"FE",X"F4",X"F8", + X"E9",X"1C",X"12",X"04",X"05",X"03",X"03",X"01",X"FE",X"7C",X"FF",X"79",X"33",X"C7",X"FF",X"FD", + X"EF",X"5F",X"1F",X"BF",X"FF",X"ED",X"C0",X"F1",X"FE",X"EF",X"DF",X"3E",X"EC",X"B0",X"7C",X"E8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"B8",X"04",X"71",X"39",X"10",X"00",X"00",X"00", + X"E0",X"48",X"1C",X"F7",X"F8",X"6E",X"00",X"00",X"C0",X"00",X"60",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"07",X"3F",X"FF",X"FF",X"FC",X"E0",X"00",X"39",X"FF",X"FF",X"E0",X"00",X"00",X"00", + X"FF",X"FF",X"FC",X"F0",X"80",X"00",X"00",X"00",X"01",X"01",X"03",X"1F",X"7F",X"FF",X"FF",X"FF", + X"80",X"00",X"01",X"07",X"3F",X"FF",X"FF",X"FC",X"43",X"DF",X"BF",X"BF",X"BC",X"80",X"C0",X"41", + X"00",X"00",X"00",X"00",X"11",X"1F",X"1F",X"7F",X"F8",X"E0",X"C0",X"00",X"01",X"0F",X"7F",X"FF", + X"FF",X"F8",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"7F",X"FF",X"FF",X"C0",X"00", + X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF", + X"00",X"FE",X"FE",X"22",X"62",X"F2",X"DE",X"9C",X"00",X"70",X"F8",X"A8",X"A8",X"B8",X"B0",X"00", + X"08",X"7C",X"FC",X"88",X"C8",X"40",X"00",X"F6",X"F6",X"00",X"00",X"F8",X"F8",X"20",X"38",X"18", + X"00",X"70",X"F8",X"A8",X"A8",X"B8",X"B0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"7F",X"FF",X"C0", + X"00",X"00",X"01",X"1F",X"FF",X"F0",X"00",X"00",X"0F",X"3E",X"F8",X"E0",X"00",X"00",X"00",X"00", + X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"00",X"00",X"00",X"03",X"0F",X"3E",X"F8",X"E0",X"0F",X"3E",X"F8",X"E0",X"80",X"00",X"00",X"00", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"E0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"3F",X"07",X"3F",X"FC",X"E0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"3F",X"00",X"00",X"00",X"00",X"03",X"3F",X"FF",X"FF", + X"0F",X"1F",X"3E",X"FC",X"F8",X"F0",X"E0",X"80",X"E0",X"C0",X"C0",X"40",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"0F",X"07",X"03",X"07",X"08",X"38",X"F8",X"F0",X"F0",X"F0",X"E0",X"E0", + X"FE",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"1F",X"3E",X"FC",X"F8",X"F0",X"FF",X"FF", + X"E0",X"C0",X"C0",X"42",X"03",X"03",X"FF",X"FF",X"00",X"00",X"00",X"00",X"80",X"E0",X"F8",X"FE", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"03",X"03",X"02",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"FF",X"FF",X"FF",X"F8",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F", + X"7F",X"7F",X"7F",X"3F",X"3F",X"3F",X"3F",X"1F",X"1F",X"1F",X"1F",X"0F",X"0F",X"0F",X"0F",X"07", + X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"F8",X"FC",X"FC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FC",X"F9",X"F3",X"67",X"6F",X"7F",X"3F",X"3E",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"04",X"04",X"07",X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE",X"FE", + X"FF",X"FF",X"FC",X"80",X"00",X"00",X"00",X"00",X"3C",X"FC",X"FF",X"FF",X"FF",X"FF",X"07",X"03", + X"00",X"C2",X"E7",X"FF",X"FF",X"FF",X"FF",X"FF",X"40",X"70",X"F9",X"FF",X"FF",X"FF",X"CF",X"03", + X"40",X"70",X"F1",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F", + X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"01",X"01",X"03",X"1F",X"3F",X"3F",X"3F",X"3F", + X"03",X"9F",X"FF",X"FF",X"FC",X"C0",X"C0",X"C1",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"1F", + X"CF",X"FF",X"FF",X"FF",X"F8",X"E0",X"E0",X"E0",X"1F",X"1F",X"1F",X"0F",X"0F",X"0F",X"0F",X"07", + X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"F8",X"07",X"07",X"07",X"03",X"03",X"03",X"03",X"01", + X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE",X"FE",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80", + X"7F",X"7F",X"7F",X"3F",X"3F",X"3F",X"3F",X"1F",X"C0",X"C0",X"C0",X"C0",X"E0",X"E0",X"E0",X"E0", + X"1F",X"1F",X"1F",X"0F",X"0F",X"0F",X"0F",X"07",X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"F8", + X"07",X"07",X"07",X"03",X"03",X"03",X"03",X"01",X"80",X"00",X"00",X"00",X"00",X"3F",X"FF",X"FF", + X"C1",X"E7",X"FF",X"FF",X"FF",X"FE",X"F0",X"00",X"00",X"00",X"01",X"7F",X"FF",X"FF",X"FF",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"3F",X"FF",X"FF",X"FF",X"FF",X"80",X"00",X"00",X"00", + X"00",X"0F",X"FF",X"FF",X"FF",X"F8",X"00",X"00",X"00",X"00",X"01",X"0F",X"0F",X"7F",X"7F",X"FF", + X"FE",X"FC",X"F8",X"00",X"00",X"00",X"03",X"1F",X"FF",X"FF",X"FE",X"F0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"0F",X"8F",X"FF",X"FF",X"FF",X"FE",X"F0",X"00", + X"00",X"00",X"01",X"07",X"3F",X"FF",X"FF",X"FC",X"E0",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"9F",X"FF",X"FF",X"FF",X"FF",X"80",X"00",X"00",X"01", + X"0F",X"3F",X"FF",X"FF",X"F8",X"E0",X"00",X"00",X"00",X"01",X"01",X"03",X"0F",X"3F",X"FF",X"FF", + X"FE",X"FC",X"F8",X"00",X"03",X"0F",X"7F",X"FF",X"FE",X"F8",X"C0",X"00",X"00",X"00",X"00",X"00", + X"03",X"0D",X"3F",X"FF",X"FF",X"FE",X"F0",X"80",X"00",X"03",X"1F",X"7F",X"FF",X"FE",X"F0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"13",X"3F",X"FF",X"FF",X"FE",X"F8",X"E0",X"80",X"00",X"07",X"1F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"55",X"FF",X"55",X"FF",X"55",X"FF",X"FF", + X"FF",X"55",X"FF",X"55",X"FF",X"55",X"FF",X"FF",X"FC",X"4E",X"FF",X"4B",X"FF",X"4F",X"FF",X"FF", + X"00",X"00",X"00",X"80",X"F8",X"80",X"80",X"00",X"FF",X"FD",X"FF",X"55",X"FF",X"55",X"FF",X"FF", + X"FF",X"FD",X"FF",X"F5",X"FF",X"F5",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"00",X"00",X"00",X"E0",X"F8",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"B9",X"FF",X"B9",X"FF",X"B9",X"FF",X"B9",X"B9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"38",X"7C",X"FC",X"FC",X"7C",X"7C",X"38",X"FF",X"FF",X"FF",X"7F",X"7F",X"00",X"68",X"04", + X"FE",X"FF",X"FE",X"FF",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FE",X"FD",X"F8",X"F5",X"FF",X"55", + X"78",X"DB",X"00",X"5B",X"00",X"5B",X"00",X"00",X"20",X"40",X"2E",X"40",X"2E",X"40",X"3E",X"9F", + X"00",X"00",X"00",X"00",X"00",X"60",X"C0",X"80",X"6B",X"07",X"7F",X"7C",X"F8",X"80",X"80",X"00", + X"E0",X"E0",X"E0",X"00",X"00",X"00",X"00",X"00",X"FF",X"4D",X"FC",X"4A",X"FE",X"4C",X"FC",X"4A", + X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"FE",X"4C",X"FC",X"4A",X"FE",X"4C",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"4D",X"FC",X"4A",X"FE",X"4C",X"FF",X"FF", + X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"00",X"FF",X"FF",X"55",X"FF",X"FF",X"55",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"24",X"FF",X"24",X"FF",X"24",X"FF",X"FF", + X"FF",X"92",X"FF",X"92",X"FF",X"92",X"FF",X"FF",X"FF",X"FF",X"FF",X"F6",X"BE",X"BF",X"FB",X"FF", + X"FE",X"FE",X"DE",X"F6",X"FE",X"DC",X"00",X"00",X"00",X"00",X"00",X"F6",X"BE",X"EA",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"FA",X"BE",X"F6",X"00",X"00",X"00",X"00",X"00",X"00",X"78",X"00", + X"F8",X"F8",X"E0",X"E0",X"E0",X"E0",X"E0",X"F8",X"00",X"FE",X"F6",X"00",X"00",X"00",X"00",X"00", + X"00",X"FE",X"FE",X"00",X"00",X"00",X"00",X"00",X"D6",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"4F",X"FF",X"4B",X"FF",X"4F",X"FF",X"FF", + X"FC",X"4C",X"FC",X"48",X"FE",X"4C",X"FF",X"FF",X"FE",X"FC",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"FE",X"FC",X"F0",X"F0",X"E0",X"E0",X"C0",X"FF",X"FF",X"4D",X"FC",X"4A",X"FE",X"4C",X"FC",X"48", + X"B8",X"78",X"37",X"F0",X"00",X"00",X"00",X"00",X"FE",X"4C",X"FC",X"4A",X"FE",X"4C",X"FF",X"FF", + X"FF",X"FC",X"FF",X"24",X"FF",X"24",X"FF",X"FF",X"FE",X"FC",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FC",X"FF",X"F4",X"FF",X"E4",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"60",X"C0",X"80", + X"FF",X"FF",X"FF",X"55",X"FF",X"55",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FB",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FB", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"0F",X"F1",X"FF",X"82",X"7C",X"B9",X"D7",X"FF",X"FF",X"01",X"FF",X"FE",X"45",X"B9",X"D7", + X"55",X"FF",X"FF",X"01",X"FE",X"45",X"B9",X"D7",X"00",X"00",X"F0",X"0F",X"F2",X"7D",X"2A",X"D7", + X"00",X"00",X"00",X"F0",X"38",X"FF",X"B8",X"F8",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00", + X"FF",X"FF",X"03",X"05",X"0E",X"0F",X"00",X"00",X"2D",X"D5",X"BB",X"01",X"FF",X"F0",X"00",X"00", + X"29",X"D5",X"BB",X"01",X"FF",X"00",X"00",X"00",X"29",X"D5",X"BB",X"01",X"FF",X"00",X"00",X"00", + X"2A",X"D7",X"82",X"7F",X"F0",X"00",X"00",X"00",X"03",X"B7",X"03",X"B5",X"03",X"B7",X"03",X"FF", + X"FE",X"FF",X"00",X"DB",X"00",X"DB",X"00",X"FF",X"00",X"B6",X"03",X"B5",X"03",X"B7",X"03",X"FF", + X"FF",X"4F",X"FF",X"49",X"FF",X"4F",X"FF",X"49",X"FF",X"92",X"FF",X"92",X"FF",X"92",X"FF",X"FF", + X"FC",X"4C",X"FC",X"4A",X"FC",X"4C",X"FF",X"FF",X"FF",X"4F",X"FF",X"4B",X"FF",X"4F",X"FF",X"FF", + X"FE",X"FF",X"F0",X"FB",X"E0",X"EB",X"C0",X"FF",X"00",X"6D",X"00",X"6D",X"00",X"6D",X"00",X"FF", + X"FF",X"FF",X"00",X"AA",X"00",X"AA",X"00",X"FF",X"FF",X"FC",X"FF",X"F4",X"FF",X"E4",X"FF",X"FF", + X"FF",X"24",X"FF",X"24",X"FF",X"24",X"FF",X"FF",X"00",X"00",X"80",X"F0",X"FF",X"F0",X"80",X"00", + X"00",X"00",X"00",X"10",X"1F",X"F0",X"80",X"00",X"FE",X"FC",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"DB",X"00",X"DB",X"00",X"DB",X"00",X"FF",X"FF",X"FC",X"FF",X"24",X"FF",X"24",X"FF",X"FF", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"FC",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"55",X"FF",X"FF",X"55",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"04",X"06",X"07",X"17",X"07",X"07",X"FE",X"FC",X"00",X"00",X"8F",X"FF",X"FF",X"FF", + X"00",X"00",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"04",X"8F",X"FF",X"FF",X"FD",X"FD",X"FF", + X"07",X"FF",X"FF",X"E1",X"80",X"20",X"48",X"F0",X"E0",X"F8",X"F0",X"B8",X"10",X"00",X"00",X"00", + X"07",X"47",X"D7",X"DC",X"7C",X"78",X"60",X"40",X"FF",X"FF",X"FF",X"7F",X"0F",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FB",X"03",X"01",X"00",X"FF",X"FF",X"F9",X"F1",X"E1",X"E0",X"F0",X"58", + X"E0",X"F0",X"C8",X"40",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"09",X"04",X"05",X"05",X"05",X"05",X"01", + X"00",X"80",X"83",X"01",X"04",X"04",X"48",X"48",X"00",X"1C",X"62",X"81",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"20",X"C0",X"80",X"40",X"50",X"00",X"C0",X"C0",X"00",X"C0",X"C5",X"05",X"C5", + X"48",X"44",X"44",X"44",X"08",X"18",X"40",X"40",X"00",X"00",X"E0",X"40",X"E0",X"00",X"C0",X"60", + X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"E0",X"80",X"00",X"E0",X"80",X"00", + X"00",X"00",X"00",X"00",X"81",X"62",X"1C",X"00",X"00",X"00",X"03",X"07",X"07",X"0E",X"0C",X"0C", + X"00",X"E0",X"F8",X"FE",X"0F",X"07",X"03",X"03",X"0E",X"0E",X"0E",X"CE",X"C8",X"08",X"C8",X"CE", + X"01",X"02",X"03",X"03",X"01",X"01",X"01",X"00",X"08",X"C8",X"C8",X"0C",X"CC",X"C4",X"08",X"0C", + X"01",X"01",X"01",X"03",X"03",X"02",X"01",X"03",X"00",X"00",X"C0",X"20",X"00",X"C0",X"A0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"0E",X"07",X"07",X"03",X"00",X"00",X"00", + X"03",X"07",X"0F",X"FE",X"F9",X"E0",X"19",X"F8",X"00",X"40",X"A0",X"00",X"E0",X"00",X"E0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C1",X"01",X"C3",X"03",X"06",X"07",X"0C",X"0F", + X"91",X"F0",X"20",X"E1",X"40",X"C0",X"80",X"80",X"E0",X"00",X"C0",X"20",X"C0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"00",X"B0",X"00",X"00",X"00",X"00",X"18", + X"00",X"01",X"03",X"07",X"0C",X"1B",X"10",X"00",X"07",X"FB",X"FC",X"0F",X"FD",X"FD",X"78",X"00", + X"00",X"00",X"D0",X"94",X"DC",X"EC",X"78",X"3C",X"01",X"18",X"1C",X"0C",X"0E",X"0E",X"0F",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"0C",X"0F",X"0F",X"6F",X"07",X"07",X"6F", + X"18",X"00",X"9C",X"0E",X"6F",X"1F",X"0F",X"0F",X"0F",X"6F",X"6F",X"0F",X"6F",X"6F",X"0F",X"6F", + X"1F",X"5F",X"0F",X"AF",X"0F",X"0F",X"0F",X"0F",X"00",X"60",X"90",X"10",X"90",X"60",X"00",X"00", + X"0F",X"0F",X"9F",X"0E",X"0C",X"98",X"00",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"0F",X"0E",X"0E",X"0C",X"1C",X"19",X"01",X"30",X"F0",X"20",X"20",X"C0",X"C0",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"08",X"08",X"04",X"04",X"04",X"08",X"00", + X"00",X"00",X"01",X"01",X"05",X"08",X"0D",X"4F",X"40",X"80",X"80",X"C0",X"00",X"00",X"00",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"0A",X"40",X"0E",X"00",X"0E",X"4C", + X"FC",X"FF",X"FF",X"FF",X"FA",X"F7",X"F6",X"FB",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"0A",X"00",X"0E",X"0C",X"00",X"07", + X"FF",X"FF",X"FE",X"FE",X"FC",X"F0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"CC",X"04",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"FE",X"FC",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"0F",X"03",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"C0",X"70",X"1C",X"FF",X"FF",X"FF",X"FF",X"FF",X"01",X"00",X"C0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"1C",X"07",X"01",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"C0",X"F0",X"FC",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"7F", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"E0",X"E0",X"E0",X"F0",X"F0",X"F0",X"F0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8", + X"FF",X"FF",X"CF",X"83",X"83",X"83",X"83",X"83",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"0F",X"0F", + X"EC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"E3",X"E3",X"E3",X"E3",X"E3",X"E3",X"E3",X"E3", + X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"07",X"07",X"FE",X"FE",X"FE",X"FE",X"FF",X"FF",X"9F",X"07", + X"FB",X"CF",X"83",X"83",X"83",X"83",X"83",X"E7",X"07",X"07",X"03",X"03",X"03",X"03",X"03",X"03", + X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"07",X"07",X"07",X"07",X"C7",X"C7",X"C7",X"C7", + X"01",X"01",X"01",X"FF",X"FF",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"E0",X"F0",X"F0",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E",X"7E", + X"70",X"70",X"70",X"F0",X"F0",X"70",X"70",X"70",X"7E",X"1E",X"06",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"70",X"10",X"00",X"00",X"00",X"C0",X"C0",X"C0",X"FF",X"FF",X"C0",X"C0",X"C0", + X"C7",X"C7",X"C7",X"C7",X"F7",X"9F",X"07",X"07",X"07",X"07",X"07",X"CF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"3F",X"0F",X"03",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"C0",X"C0",X"F0",X"FF",X"00", + X"FF",X"30",X"FC",X"3F",X"00",X"3F",X"C0",X"00",X"FF",X"00",X"0F",X"F0",X"30",X"1C",X"07",X"00", + X"FF",X"0C",X"07",X"01",X"00",X"00",X"00",X"00",X"FF",X"F0",X"FC",X"FF",X"00",X"00",X"00",X"00", + X"FF",X"03",X"00",X"FF",X"00",X"00",X"00",X"00",X"FF",X"38",X"0E",X"03",X"00",X"00",X"00",X"00", + X"FF",X"0C",X"07",X"01",X"00",X"C0",X"F0",X"FC",X"FF",X"C0",X"F0",X"FC",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F3",X"E0",X"E0",X"E0",X"E0",X"E0",X"F8",X"F8", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"FE",X"F3",X"E0",X"E0",X"E0",X"E0",X"E0",X"F9",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"60",X"00",X"C1",X"FF",X"00",X"00",X"00",X"07",X"10",X"1C",X"1F",X"1F", + X"00",X"40",X"40",X"40",X"60",X"60",X"60",X"70",X"70",X"70",X"78",X"78",X"78",X"7C",X"7C",X"7C", + X"7E",X"7E",X"7E",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"C0",X"C0",X"C0",X"E0",X"E0",X"E0",X"F0", + X"F0",X"F0",X"F8",X"F8",X"F8",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"01",X"01",X"03",X"03",X"03",X"03",X"03",X"03",X"07",X"07",X"07",X"07",X"07",X"07",X"0F",X"0F", + X"0F",X"0F",X"0F",X"0F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F", + X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"1F",X"1F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE", + X"07",X"07",X"07",X"07",X"07",X"07",X"03",X"01",X"FE",X"FE",X"7E",X"7C",X"3C",X"1C",X"1C",X"08", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"70",X"70",X"30",X"30",X"F0",X"F0",X"F0", + X"7E",X"1E",X"06",X"00",X"00",X"FF",X"FF",X"FF",X"F0",X"F0",X"F0",X"F0",X"F0",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"10",X"40",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"03",X"0E",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0E",X"1C",X"10",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"70",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"03",X"0F",X"1E",X"18",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"0E",X"1E",X"7C", + X"F8",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1F",X"7E",X"F8",X"F0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"C0",X"C0",X"C0",X"C0", + X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FE",X"FC",X"F0",X"E0",X"80",X"00",X"00", + X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FC",X"0F",X"1F",X"7F",X"FF",X"FE",X"F8",X"F0",X"C0", + X"00",X"00",X"00",X"01",X"03",X"07",X"07",X"07",X"07",X"06",X"04",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"08",X"10",X"40",X"80",X"00",X"00", + X"02",X"0E",X"1C",X"30",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1E",X"38",X"30",X"00", + X"00",X"00",X"00",X"00",X"00",X"0C",X"1C",X"7C",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03", + X"03",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"0E",X"1E",X"7E",X"FE",X"FC",X"F0",X"E0",X"80",X"00",X"00", + X"00",X"00",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"7F",X"7E",X"7C",X"70",X"60",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"18",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"02",X"0E",X"18",X"10",X"00",X"02",X"0E",X"1C",X"70",X"60",X"00",X"00",X"00", + X"40",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1E",X"78",X"F0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"70",X"F0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"1F",X"1E",X"1C",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10", + X"F0",X"F0",X"F0",X"F0",X"E0",X"80",X"00",X"00",X"FF",X"FE",X"FC",X"F0",X"E0",X"80",X"00",X"00", + X"01",X"03",X"07",X"07",X"07",X"07",X"07",X"04",X"00",X"02",X"08",X"10",X"00",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"08",X"00",X"0C",X"1C",X"70",X"E0",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40", + X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"1F",X"7E",X"7C",X"70",X"60",X"00",X"00",X"00", + X"00",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"02",X"00",X"10",X"00",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"0C",X"18",X"30",X"00",X"00",X"08",X"18",X"70",X"E0",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"0C",X"1C",X"7C",X"FC",X"00",X"00",X"00",X"08",X"18",X"78",X"F8",X"F8", + X"0F",X"0F",X"0F",X"0F",X"0E",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00", + X"10",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"0E",X"1E",X"78",X"F0",X"C0", + X"0F",X"0E",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"1C",X"7C",X"F8",X"F0",X"C0", + X"00",X"00",X"01",X"03",X"0F",X"1F",X"1F",X"1C",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"02",X"00",X"10",X"20",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"18",X"70",X"40",X"00",X"00",X"10",X"70",X"E0",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"00",X"00",X"00",X"00",X"08",X"18",X"78",X"F0",X"C0", + X"0F",X"1E",X"1C",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"70",X"F0",X"F0",X"C0", + X"08",X"18",X"78",X"F8",X"F8",X"F8",X"F0",X"C0",X"00",X"00",X"01",X"03",X"0F",X"1F",X"3F",X"3F", + X"00",X"00",X"04",X"10",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"18",X"70",X"40", + X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"04",X"00",X"00",X"00",X"00",X"10",X"70",X"F0",X"C0", + X"0F",X"1E",X"7C",X"70",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"C0",X"C0",X"C0", + X"03",X"07",X"07",X"07",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80", + X"FF",X"FF",X"10",X"08",X"08",X"04",X"04",X"04",X"04",X"04",X"04",X"08",X"08",X"10",X"20",X"C0", + X"00",X"00",X"00",X"10",X"70",X"F0",X"F0",X"F0",X"1F",X"7F",X"FF",X"FF",X"FE",X"F8",X"F0",X"C0", + X"10",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"C0",X"00",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF", + X"00",X"00",X"00",X"00",X"00",X"10",X"70",X"F0",X"03",X"FE",X"E0",X"00",X"00",X"00",X"00",X"00", + X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0C",X"C0",X"F1",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"60",X"F8",X"FC",X"FC",X"FE",X"FF",X"FB",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"3F",X"3F",X"3F",X"3F",X"3E",X"38",X"30",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"03",X"07",X"07",X"07",X"07",X"07",X"07",X"06",X"04",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"D0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"C5",X"F8",X"E0",X"C0",X"C0",X"DF",X"FF",X"FF",X"70",X"38",X"B8",X"DC",X"FC",X"F8",X"FC",X"FC", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"8F",X"FF",X"FF",X"FF",X"FD",X"FF",X"00",X"00",X"00",X"80",X"E0",X"F0",X"F8",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E7",X"F3",X"C9",X"40",X"20",X"00",X"00",X"00", + X"80",X"E0",X"F8",X"70",X"38",X"10",X"00",X"00",X"00",X"1C",X"62",X"81",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"81",X"62",X"1C",X"00",X"00",X"E0",X"F8",X"FE",X"0F",X"07",X"03",X"03", + X"01",X"02",X"03",X"03",X"01",X"01",X"01",X"00",X"01",X"01",X"01",X"03",X"03",X"02",X"01",X"03", + X"03",X"07",X"0F",X"FE",X"F9",X"E0",X"19",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"80",X"80",X"C0",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"CC",X"04",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"3F",X"3F",X"7F",X"7F",X"7F",X"7F", + X"00",X"F8",X"E4",X"F4",X"F2",X"FA",X"FA",X"FA",X"7F",X"7F",X"3F",X"0F",X"0D",X"00",X"00",X"00", + X"FA",X"FA",X"BA",X"3A",X"10",X"10",X"00",X"00",X"00",X"00",X"04",X"7E",X"00",X"00",X"3C",X"42", + X"00",X"64",X"42",X"52",X"4C",X"00",X"3C",X"42",X"00",X"2E",X"4A",X"4A",X"32",X"00",X"3C",X"42", + X"00",X"02",X"62",X"1A",X"06",X"00",X"3C",X"42",X"7E",X"00",X"3C",X"42",X"42",X"3C",X"00",X"3C", + X"42",X"3C",X"00",X"3C",X"42",X"42",X"3C",X"00",X"42",X"42",X"3C",X"00",X"3C",X"42",X"42",X"3C", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"08",X"5B",X"7F", + X"00",X"00",X"07",X"1F",X"38",X"00",X"58",X"FC",X"00",X"00",X"00",X"80",X"C0",X"40",X"00",X"30", + X"18",X"18",X"30",X"B0",X"B0",X"30",X"70",X"70",X"7F",X"FF",X"FF",X"FD",X"7C",X"78",X"FA",X"F2", + X"F8",X"D0",X"45",X"0F",X"1F",X"1E",X"3C",X"3C",X"18",X"0C",X"C4",X"E0",X"30",X"10",X"00",X"00", + X"71",X"79",X"78",X"7A",X"3E",X"3E",X"2C",X"0C",X"F3",X"F3",X"E1",X"61",X"70",X"20",X"20",X"20", + X"18",X"39",X"33",X"13",X"01",X"21",X"60",X"E0",X"F0",X"E0",X"F8",X"F0",X"FC",X"F0",X"A0",X"00", + X"0C",X"0D",X"0F",X"0B",X"03",X"01",X"01",X"00",X"02",X"06",X"06",X"03",X"93",X"9B",X"9F",X"C9", + X"A7",X"33",X"10",X"02",X"01",X"00",X"00",X"00",X"24",X"FE",X"CC",X"00",X"C0",X"E0",X"70",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"07",X"07",X"1F",X"7F",X"F3",X"C0",X"C0",X"80",X"08", + X"C0",X"F0",X"F8",X"3E",X"0F",X"07",X"03",X"21",X"00",X"00",X"00",X"00",X"80",X"E0",X"F0",X"B8", + X"06",X"06",X"07",X"0F",X"0E",X"0E",X"0C",X"0C",X"00",X"01",X"00",X"00",X"08",X"00",X"40",X"01", + X"00",X"08",X"00",X"00",X"20",X"02",X"00",X"00",X"1C",X"1C",X"0E",X"46",X"06",X"07",X"03",X"03", + X"0E",X"0E",X"0E",X"0C",X"0C",X"0E",X"06",X"07",X"00",X"00",X"10",X"00",X"00",X"02",X"20",X"00", + X"08",X"00",X"40",X"00",X"00",X"12",X"00",X"00",X"87",X"0F",X"0F",X"0F",X"47",X"07",X"07",X"0E", + X"07",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"C7",X"EF",X"FF",X"78",X"00",X"00", + X"40",X"00",X"90",X"F8",X"FC",X"7E",X"1F",X"03",X"0E",X"8E",X"0E",X"1C",X"3C",X"78",X"F0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"28",X"28",X"11",X"00",X"00",X"40",X"40",X"40",X"20",X"0F",X"FF", + X"00",X"00",X"00",X"00",X"00",X"10",X"80",X"E0",X"03",X"07",X"07",X"0F",X"0F",X"0F",X"19",X"0C", + X"FF",X"FF",X"FF",X"EF",X"47",X"1F",X"BE",X"0C",X"F8",X"F8",X"FC",X"FC",X"FC",X"F4",X"29",X"78", + X"04",X"36",X"E9",X"E3",X"F3",X"F1",X"F8",X"F8",X"04",X"61",X"F0",X"F2",X"FB",X"F9",X"7D",X"FF", + X"F8",X"FC",X"9C",X"38",X"18",X"50",X"24",X"CC",X"78",X"11",X"0F",X"03",X"01",X"20",X"00",X"18", + X"5F",X"17",X"87",X"1F",X"FF",X"0F",X"01",X"00",X"F8",X"FC",X"FE",X"FE",X"CE",X"84",X"C0",X"70", + X"00",X"00",X"01",X"00",X"20",X"20",X"10",X"03",X"00",X"00",X"00",X"00",X"40",X"42",X"00",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"07",X"4F",X"1D",X"3F",X"7F",X"4F",X"6B",X"E6", + X"FF",X"FF",X"FF",X"CF",X"C0",X"F1",X"07",X"3F",X"00",X"40",X"70",X"60",X"70",X"7E",X"77",X"7F", + X"F0",X"7A",X"38",X"BC",X"BC",X"9D",X"DC",X"7E",X"83",X"C0",X"61",X"63",X"70",X"3F",X"3F",X"0F", + X"3F",X"4E",X"FA",X"78",X"79",X"F2",X"FE",X"F8",X"7E",X"37",X"31",X"18",X"5C",X"07",X"11",X"00", + X"03",X"82",X"FF",X"7D",X"30",X"18",X"C3",X"7E",X"FC",X"24",X"34",X"FC",X"1C",X"79",X"C0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"80",X"00",X"20",X"70",X"FE",X"7F",X"1F",X"0F",X"0B", + X"00",X"00",X"00",X"00",X"00",X"E0",X"C0",X"E0",X"80",X"80",X"9F",X"C7",X"21",X"18",X"00",X"00", + X"41",X"E0",X"F8",X"FF",X"FF",X"7F",X"1F",X"07",X"D0",X"00",X"00",X"00",X"80",X"E0",X"F8",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"38",X"39",X"31",X"38",X"3E",X"3F",X"1F", + X"FC",X"7E",X"1B",X"20",X"28",X"04",X"80",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"47",X"41",X"00",X"00",X"01",X"01",X"08",X"08",X"70",X"F0",X"60",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"00",X"01",X"03",X"03",X"07",X"3F",X"FF",X"FF",X"FF",X"C0",X"80",X"00",X"00", + X"80",X"E0",X"F8",X"FC",X"7E",X"1F",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"06",X"0E",X"7C",X"7C",X"7C",X"FC",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"07",X"03",X"03",X"03",X"03",X"01",X"01",X"80",X"C0",X"C0",X"C0",X"C0",X"E0",X"E0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"07",X"06",X"00",X"00",X"00", + X"01",X"01",X"61",X"F1",X"61",X"01",X"01",X"01",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0", + X"FF",X"BF",X"9C",X"83",X"A0",X"F8",X"FF",X"E1",X"FE",X"FE",X"00",X"C1",X"33",X"03",X"01",X"20", + X"0F",X"EF",X"E0",X"F0",X"F0",X"F8",X"F8",X"F8",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"20", + X"FF",X"FF",X"00",X"00",X"01",X"00",X"20",X"10",X"FF",X"FF",X"7F",X"FF",X"FE",X"FE",X"FD",X"FF", + X"E7",X"83",X"1E",X"7E",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"30",X"78",X"7C",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FD",X"F9",X"7B",X"31",X"10",X"00",X"FF",X"FF", + X"F7",X"F7",X"F7",X"F7",X"F0",X"60",X"2F",X"8F",X"E0",X"C0",X"80",X"00",X"00",X"00",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"B8",X"04",X"71",X"39",X"10",X"00",X"C2",X"E7", + X"E0",X"48",X"1C",X"F7",X"F8",X"6E",X"11",X"7F",X"C0",X"00",X"60",X"00",X"00",X"00",X"FF",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_chr_bit2.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_chr_bit2.vhd new file mode 100644 index 00000000..dfca9c74 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_chr_bit2.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity travusa_chr_bit2 is +port ( + clk : in std_logic; + addr : in std_logic_vector(12 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of travusa_chr_bit2 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"B0",X"B8",X"A8",X"E8",X"68",X"00",X"00",X"08",X"7C",X"FC",X"88",X"C8",X"40",X"00", + X"00",X"00",X"F8",X"F8",X"08",X"F8",X"F0",X"00",X"60",X"F0",X"90",X"F0",X"7C",X"FC",X"00",X"00", + X"00",X"00",X"F8",X"F8",X"20",X"38",X"18",X"00",X"60",X"F0",X"90",X"F0",X"7C",X"FC",X"00",X"00", + X"00",X"08",X"7C",X"FC",X"88",X"C8",X"40",X"00",X"00",X"FC",X"FC",X"10",X"F0",X"E0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"38",X"7C",X"C2",X"82",X"86",X"7C",X"38",X"00",X"80",X"84",X"FE",X"FE",X"80",X"80",X"00", + X"00",X"CC",X"E6",X"F2",X"B2",X"BA",X"9E",X"8C",X"00",X"40",X"C2",X"92",X"9A",X"9E",X"F6",X"62", + X"00",X"30",X"38",X"2C",X"26",X"FE",X"FE",X"20",X"00",X"4E",X"CE",X"8A",X"8A",X"FA",X"70",X"00", + X"00",X"78",X"FC",X"96",X"92",X"92",X"F2",X"60",X"00",X"06",X"06",X"E2",X"F2",X"1A",X"0E",X"06", + X"00",X"6C",X"9E",X"9A",X"B2",X"B2",X"EC",X"60",X"00",X"0C",X"9E",X"92",X"92",X"D2",X"7E",X"3C", + X"00",X"00",X"00",X"44",X"44",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"40",X"C0",X"80",X"80",X"80",X"FE",X"7E",X"00",X"7E",X"FE",X"80",X"80",X"80",X"FE",X"7E", + X"00",X"FE",X"FE",X"1C",X"38",X"1C",X"FE",X"FE",X"00",X"FE",X"FE",X"22",X"22",X"22",X"3E",X"1C", + X"FF",X"FF",X"F3",X"3E",X"00",X"FF",X"FF",X"00",X"FF",X"FF",X"F9",X"67",X"00",X"9F",X"FF",X"00", + X"3F",X"9F",X"9B",X"8E",X"00",X"DC",X"BF",X"00",X"FC",X"FE",X"CE",X"72",X"00",X"FE",X"F8",X"00", + X"FF",X"FF",X"F3",X"C9",X"81",X"00",X"0C",X"5C",X"1C",X"0C",X"89",X"80",X"C4",X"E1",X"E9",X"FF", + X"7F",X"3F",X"1F",X"57",X"23",X"03",X"81",X"85",X"A0",X"B0",X"F0",X"F8",X"78",X"EA",X"E8",X"B0", + X"F0",X"E1",X"41",X"03",X"03",X"07",X"8F",X"3F",X"FC",X"E0",X"C0",X"80",X"84",X"4F",X"0F",X"0F", + X"07",X"03",X"0B",X"8F",X"8F",X"45",X"05",X"05",X"81",X"A0",X"80",X"C0",X"E0",X"E4",X"F8",X"FE", + X"E7",X"C3",X"81",X"29",X"39",X"7C",X"7C",X"5E",X"F6",X"F6",X"FE",X"FE",X"FE",X"FE",X"FA",X"FE", + X"FF",X"FF",X"FF",X"FF",X"FD",X"FD",X"FF",X"FF",X"FF",X"FB",X"F9",X"FD",X"FF",X"FF",X"FF",X"FF", + X"03",X"C4",X"C7",X"BF",X"19",X"30",X"00",X"00",X"FF",X"FF",X"FF",X"FC",X"FC",X"FC",X"FE",X"FE", + X"FF",X"FF",X"CF",X"BF",X"19",X"30",X"00",X"00",X"3F",X"1F",X"1F",X"1C",X"3C",X"7C",X"FE",X"FE", + X"3F",X"7F",X"19",X"30",X"00",X"00",X"21",X"3F",X"FC",X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE", + X"3F",X"7F",X"19",X"30",X"00",X"80",X"E1",X"FF",X"FC",X"FC",X"FC",X"FC",X"FE",X"FF",X"FF",X"FF", + X"CC",X"C4",X"84",X"C4",X"C2",X"C3",X"03",X"87",X"21",X"1F",X"1B",X"0E",X"00",X"DC",X"BF",X"00", + X"0E",X"17",X"1F",X"1E",X"1F",X"0F",X"0F",X"07",X"07",X"05",X"03",X"03",X"03",X"03",X"03",X"03", + X"03",X"03",X"03",X"03",X"07",X"07",X"06",X"0E",X"0C",X"14",X"1C",X"18",X"18",X"18",X"18",X"28", + X"38",X"38",X"38",X"18",X"1C",X"1C",X"1E",X"0E",X"0C",X"0E",X"0E",X"06",X"0E",X"0E",X"0E",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"1F",X"17",X"03",X"83",X"83",X"87",X"87",X"CF",X"CF",X"87",X"C7",X"C7",X"C3",X"C3",X"03",X"87", + X"87",X"8F",X"0F",X"0F",X"1F",X"1F",X"0F",X"0F",X"3F",X"1F",X"1F",X"1F",X"3F",X"7F",X"FF",X"FF", + X"FF",X"7F",X"3F",X"3F",X"3F",X"7F",X"7F",X"3F",X"3F",X"1F",X"1F",X"0F",X"0F",X"0F",X"2F",X"3F", + X"83",X"C4",X"C7",X"E7",X"E7",X"A7",X"87",X"87",X"82",X"C1",X"C0",X"C0",X"E8",X"F8",X"F8",X"F8", + X"F0",X"E1",X"E1",X"E1",X"E1",X"C2",X"C3",X"83",X"03",X"04",X"07",X"0F",X"0F",X"1F",X"1B",X"0D", + X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3E",X"2F",X"1F",X"1F",X"1F",X"0B",X"0D",X"0F",X"0F",X"07", + X"F0",X"F0",X"F0",X"F0",X"C0",X"F0",X"F0",X"70",X"F0",X"F8",X"F8",X"E8",X"D8",X"FC",X"FC",X"7C", + X"B4",X"F8",X"F8",X"F8",X"F8",X"F8",X"E8",X"F0",X"F0",X"F0",X"E0",X"E0",X"C0",X"C0",X"C0",X"80", + X"80",X"80",X"80",X"80",X"80",X"40",X"C0",X"C0",X"C0",X"C0",X"C0",X"A0",X"E0",X"E0",X"E0",X"F0", + X"FE",X"FE",X"FF",X"FF",X"FF",X"FE",X"FE",X"FF",X"FE",X"FE",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE", + X"FF",X"FF",X"FE",X"FE",X"FC",X"FC",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"BF",X"9F",X"DF",X"FF", + X"80",X"20",X"E0",X"70",X"F8",X"F8",X"FC",X"FC",X"7E",X"7E",X"7C",X"F8",X"68",X"0C",X"0C",X"0E", + X"CF",X"87",X"C7",X"C4",X"C0",X"C0",X"02",X"86",X"FC",X"E0",X"C2",X"BC",X"18",X"30",X"00",X"00", + X"FC",X"7C",X"3C",X"3C",X"3E",X"7F",X"7F",X"3F",X"30",X"7C",X"18",X"30",X"00",X"00",X"00",X"00", + X"3E",X"1E",X"0A",X"00",X"00",X"00",X"00",X"00",X"87",X"8F",X"0F",X"0C",X"1C",X"1C",X"0E",X"0E", + X"FF",X"FF",X"C3",X"BD",X"19",X"30",X"00",X"00",X"FC",X"7C",X"3C",X"3C",X"3E",X"7F",X"7F",X"3F", + X"00",X"80",X"C0",X"E0",X"00",X"E0",X"E0",X"E0",X"37",X"7F",X"19",X"30",X"00",X"00",X"01",X"05", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE", + X"F0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FE",X"F8",X"C0",X"00",X"00",X"00", + X"E0",X"C0",X"40",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F8",X"E0", + X"80",X"C7",X"EF",X"E7",X"EF",X"CF",X"9E",X"80",X"FF",X"FC",X"E0",X"80",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FC",X"F0",X"80",X"00",X"C0",X"1C",X"7E",X"FE",X"FE",X"FE",X"FE",X"FE", + X"FE",X"FF",X"1F",X"03",X"00",X"80",X"C0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E2",X"FF",X"FE",X"FE",X"7C",X"3C",X"39",X"FB",X"0F",X"00",X"00",X"00",X"60",X"00",X"00",X"90", + X"E0",X"C0",X"C0",X"80",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FE",X"FC",X"F1",X"F7",X"7F",X"3F", + X"81",X"CF",X"E7",X"F2",X"E7",X"E7",X"E3",X"E0",X"F0",X"F8",X"F8",X"E0",X"FC",X"FF",X"87",X"00", + X"1F",X"3F",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"03",X"FE",X"7E",X"3E",X"1C", + X"19",X"10",X"30",X"C1",X"81",X"02",X"0C",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"37",X"E0",X"06", + X"F3",X"F1",X"E1",X"DF",X"FF",X"FF",X"FF",X"7F",X"7F",X"1F",X"7F",X"7F",X"7F",X"4F",X"03",X"00", + X"00",X"00",X"00",X"C0",X"E0",X"E8",X"FC",X"FE",X"3C",X"03",X"01",X"20",X"78",X"30",X"10",X"10", + X"D8",X"CC",X"86",X"00",X"03",X"FF",X"3E",X"00",X"F7",X"F7",X"F7",X"E1",X"E8",X"EE",X"CF",X"DE", + X"80",X"E7",X"F3",X"F9",X"FD",X"FC",X"FE",X"FF",X"FF",X"FF",X"FE",X"FE",X"FE",X"FC",X"FD",X"F9", + X"F0",X"F0",X"F0",X"E0",X"E8",X"EE",X"C0",X"C0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"F8",X"FE",X"F7",X"FB",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F3",X"3B",X"FB",X"FB",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"03",X"37",X"F7", + X"00",X"04",X"07",X"7F",X"FF",X"FD",X"7F",X"7F",X"0F",X"7F",X"7B",X"3B",X"BF",X"9F",X"DF",X"DF", + X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"6E",X"EE",X"E7",X"F7",X"37", + X"E7",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"09",X"15",X"74",X"F6", + X"00",X"00",X"00",X"1F",X"FB",X"DD",X"BF",X"FF",X"00",X"1F",X"53",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"07",X"3F",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"07",X"1F",X"7F",X"FF", + X"00",X"00",X"00",X"00",X"01",X"07",X"1F",X"7F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01", + X"07",X"1F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"01",X"07",X"1F",X"7F",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"01",X"07",X"1F",X"7F",X"FF",X"0E",X"1B",X"39",X"10",X"09",X"01",X"04",X"00", + X"00",X"00",X"00",X"01",X"0F",X"7F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"03",X"1F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F", + X"00",X"00",X"00",X"01",X"07",X"3F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"03",X"3F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"1F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"30",X"18",X"18",X"0C",X"54",X"80",X"AC",X"04", + X"00",X"00",X"00",X"00",X"0F",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"03",X"3F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"07",X"1F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"01",X"07",X"0F",X"1F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"07",X"07",X"07", + X"07",X"07",X"07",X"07",X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"F8",X"FC",X"FE",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"C0",X"C0",X"E0",X"E0", + X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"01",X"04",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"F0",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"80",X"F0",X"FE",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0", + X"00",X"00",X"80",X"C0",X"E0",X"F0",X"F8",X"E0",X"00",X"00",X"80",X"C0",X"E0",X"F0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"F8",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"F8",X"FF",X"FC",X"F0",X"80",X"00",X"00",X"00", + X"F0",X"FC",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"C0",X"F0",X"FC",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"F8",X"FC",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"80",X"E0",X"F0",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"F0",X"F8",X"FC", + X"10",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"00",X"00",X"0F",X"1F",X"1F",X"3F",X"7F",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"1F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"1F", + X"00",X"60",X"FC",X"FF",X"FF",X"FF",X"DF",X"A1",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"C0",X"F0",X"F0",X"88",X"04",X"00",X"00",X"07",X"7F",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"01",X"1F",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"C0",X"00",X"60",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"80",X"00",X"00",X"07",X"3F",X"FF",X"FF", + X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"1F",X"F8",X"C0",X"00",X"00",X"03",X"1F", + X"00",X"00",X"01",X"1F",X"FF",X"FF",X"FF",X"FF",X"01",X"0F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"01",X"1F",X"FF",X"FF",X"00",X"00",X"00",X"07",X"7F",X"FF",X"FF",X"FF", + X"06",X"01",X"01",X"60",X"00",X"18",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"3F",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"00",X"00",X"00",X"02",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"00",X"01",X"CF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"83", + X"00",X"00",X"20",X"A0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"70",X"F8",X"F0",X"F0",X"C0",X"40",X"18",X"00", + X"00",X"00",X"00",X"00",X"04",X"08",X"01",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"21",X"80",X"40",X"00",X"00",X"00",X"00", + X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"12",X"7A",X"7C", + X"38",X"6C",X"42",X"00",X"30",X"68",X"C1",X"C1",X"00",X"00",X"1E",X"72",X"F9",X"A8",X"00",X"06", + X"00",X"00",X"00",X"00",X"30",X"78",X"2C",X"04",X"7D",X"FD",X"7F",X"FC",X"FC",X"78",X"78",X"F8", + X"80",X"C0",X"80",X"80",X"40",X"00",X"00",X"00",X"03",X"07",X"0E",X"1A",X"08",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"04",X"84",X"C0",X"41",X"01",X"02",X"00",X"00", + X"E8",X"1C",X"12",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"03",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"EF",X"FE",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"FE",X"FF",X"FF",X"E7",X"FF",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"BF",X"2F",X"6E",X"78",X"00",X"00",X"40",X"40", + X"FF",X"FF",X"FF",X"FF",X"EF",X"E7",X"16",X"70",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FC",X"EE",X"FE",X"C0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F", + X"00",X"00",X"00",X"00",X"00",X"0F",X"FF",X"FF",X"00",X"01",X"07",X"1F",X"FF",X"FF",X"FF",X"FF", + X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"1F",X"00",X"01",X"07",X"1F",X"7F",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"1F",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"C0",X"E0",X"E0",X"E0", + X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"FC",X"FC",X"FE",X"FE",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"E0",X"F0",X"FC",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"EF",X"EF",X"EB",X"EF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FB",X"FB",X"FB",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FB",X"FB",X"B3",X"D7",X"F7",X"03",X"01",X"00", + X"FF",X"FF",X"FF",X"BF",X"7D",X"FB",X"FE",X"00",X"BF",X"9F",X"DF",X"DF",X"DF",X"87",X"01",X"00", + X"BF",X"BF",X"F6",X"FC",X"F9",X"83",X"3F",X"7F",X"7F",X"7F",X"7F",X"7F",X"3F",X"1F",X"0F",X"07", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"07",X"07",X"03",X"03",X"03",X"03",X"03",X"03", + X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"FE",X"FE",X"FF",X"FF",X"C0",X"FF",X"FF",X"FF", + X"FF",X"7F",X"7E",X"78",X"00",X"C0",X"C0",X"C0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"C0",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"80",X"80",X"80",X"80",X"80",X"80",X"C0",X"C0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"C0",X"C0",X"C0",X"C0",X"E0",X"E0",X"E0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3F",X"7F",X"77",X"6F",X"7C",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7",X"F3",X"FB",X"9B",X"FA",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"F3",X"FE",X"7C", + X"78",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"77",X"37",X"BC",X"A0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"F7",X"F7",X"F3",X"3B",X"FB",X"FA",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FE",X"FE",X"FE",X"FF",X"F3",X"FF",X"7C", + X"78",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FC",X"EF",X"6F",X"7C",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"ED",X"ED",X"E7",X"F4",X"70",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"55",X"FF",X"55",X"FF",X"55",X"FF",X"FF", + X"FF",X"55",X"FF",X"55",X"FF",X"55",X"FF",X"00",X"FC",X"4A",X"FF",X"4B",X"FD",X"4B",X"FC",X"00", + X"00",X"00",X"00",X"80",X"F8",X"80",X"00",X"00",X"01",X"01",X"FF",X"55",X"FF",X"55",X"FF",X"FF", + X"01",X"01",X"0F",X"05",X"1F",X"15",X"3F",X"00",X"00",X"00",X"FF",X"55",X"FF",X"55",X"FF",X"00", + X"00",X"00",X"00",X"00",X"00",X"E0",X"B8",X"EF",X"01",X"00",X"0F",X"04",X"1F",X"04",X"3F",X"00", + X"B9",X"EF",X"B9",X"EF",X"B9",X"E7",X"00",X"00",X"FF",X"92",X"FF",X"92",X"FF",X"92",X"FF",X"00", + X"00",X"10",X"38",X"38",X"38",X"38",X"10",X"00",X"00",X"00",X"00",X"80",X"80",X"F8",X"FC",X"F8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"00",X"00",X"01",X"03",X"07",X"0F",X"FF",X"55", + X"87",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"F8",X"C0",X"80",X"D1",X"BF",X"D1",X"BF",X"C1",X"60", + X"00",X"00",X"80",X"C0",X"E0",X"80",X"00",X"00",X"FC",X"F8",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"4A",X"FF",X"4B",X"FD",X"4B",X"FF",X"4B", + X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"00",X"FD",X"4B",X"FF",X"4B",X"FD",X"4B",X"FC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"4A",X"FF",X"4B",X"FD",X"4B",X"FC",X"00", + X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"00",X"00",X"55",X"FF",X"FF",X"55",X"FF",X"00", + X"E0",X"E0",X"E0",X"00",X"00",X"00",X"00",X"00",X"FF",X"24",X"FF",X"24",X"FF",X"24",X"FF",X"00", + X"FF",X"92",X"FF",X"92",X"FF",X"92",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"03",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"80", + X"FF",X"07",X"07",X"07",X"07",X"07",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00", + X"A0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"4A",X"FF",X"4B",X"FD",X"4B",X"FC",X"00", + X"FC",X"4A",X"FF",X"49",X"FD",X"4B",X"FC",X"00",X"01",X"01",X"FF",X"55",X"FF",X"55",X"FF",X"FF", + X"FF",X"55",X"FF",X"55",X"FF",X"55",X"FF",X"FF",X"FF",X"55",X"FF",X"55",X"FF",X"55",X"FF",X"00", + X"01",X"01",X"0F",X"05",X"1F",X"15",X"3F",X"00",X"FC",X"4A",X"FF",X"4B",X"FD",X"4B",X"FF",X"49", + X"F8",X"F8",X"FF",X"F8",X"F0",X"00",X"00",X"00",X"FD",X"4B",X"FF",X"4B",X"FD",X"4B",X"FC",X"00", + X"01",X"00",X"FF",X"24",X"FF",X"24",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"00",X"0F",X"04",X"1F",X"04",X"3F",X"00",X"00",X"00",X"80",X"C0",X"E0",X"80",X"00",X"00", + X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"55",X"FF",X"55",X"FF",X"55",X"FF",X"FF",X"00",X"55",X"FF",X"55",X"FF",X"55",X"FF",X"00", + X"FF",X"55",X"FF",X"55",X"FF",X"55",X"FF",X"00",X"01",X"01",X"FF",X"55",X"FF",X"55",X"FF",X"FF", + X"F5",X"FF",X"FF",X"FF",X"FF",X"FE",X"FF",X"FF",X"55",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"55",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"F0",X"F8",X"FF",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"2A",X"00",X"00", + X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"00",X"00",X"FC",X"48",X"FC",X"4A",X"FC",X"48",X"FC",X"00", + X"01",X"00",X"FF",X"24",X"FF",X"24",X"FF",X"00",X"FC",X"4A",X"FF",X"4B",X"FD",X"4B",X"FC",X"00", + X"00",X"B2",X"03",X"B5",X"01",X"B3",X"03",X"B5",X"00",X"6D",X"00",X"6D",X"00",X"6D",X"00",X"00", + X"00",X"B2",X"03",X"B5",X"01",X"B3",X"00",X"00",X"01",X"B3",X"03",X"B5",X"01",X"B3",X"00",X"00", + X"01",X"00",X"0F",X"04",X"1F",X"04",X"3F",X"00",X"FF",X"92",X"FF",X"92",X"FF",X"92",X"FF",X"00", + X"00",X"00",X"FF",X"55",X"FF",X"55",X"FF",X"00",X"00",X"03",X"00",X"0B",X"00",X"1B",X"00",X"00", + X"00",X"DB",X"00",X"DB",X"00",X"DB",X"00",X"00",X"00",X"00",X"80",X"E0",X"E0",X"00",X"00",X"00", + X"00",X"00",X"80",X"E0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"24",X"FF",X"24",X"FF",X"24",X"FF",X"00",X"00",X"03",X"00",X"DB",X"00",X"DB",X"00",X"00", + X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"01",X"03",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"AA",X"00",X"00",X"AA",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"FF",X"FF",X"FF",X"ED",X"FC",X"FC",X"00",X"00",X"00",X"00",X"8F",X"E7",X"75",X"00", + X"00",X"00",X"1F",X"E1",X"FC",X"CE",X"E3",X"F8",X"00",X"00",X"81",X"E0",X"70",X"30",X"30",X"11", + X"03",X"FD",X"80",X"00",X"00",X"00",X"00",X"C0",X"20",X"B8",X"90",X"00",X"00",X"00",X"00",X"00", + X"FC",X"BC",X"28",X"23",X"83",X"87",X"9F",X"BF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"00",X"00",X"80",X"40",X"60",X"10",X"08", + X"40",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"12",X"0A",X"1A",X"1A",X"1A",X"18", + X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"0C",X"12",X"1A", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"10",X"10",X"10",X"10",X"12",X"1A",X"1A", + X"80",X"A0",X"20",X"20",X"30",X"20",X"80",X"B0",X"00",X"06",X"E9",X"46",X"E0",X"0F",X"C8",X"60", + X"00",X"00",X"00",X"28",X"00",X"10",X"54",X"10",X"CF",X"09",X"E6",X"80",X"0F",X"ED",X"88",X"00", + X"1E",X"08",X"1E",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"04",X"08",X"08",X"01",X"12",X"12", + X"E0",X"18",X"06",X"01",X"F0",X"08",X"04",X"04",X"10",X"10",X"10",X"10",X"14",X"14",X"14",X"10", + X"06",X"05",X"04",X"04",X"02",X"02",X"02",X"03",X"14",X"14",X"14",X"12",X"12",X"1A",X"16",X"12", + X"02",X"02",X"02",X"04",X"04",X"05",X"06",X"04",X"E0",X"F0",X"38",X"D8",X"F8",X"38",X"58",X"38", + X"00",X"00",X"00",X"00",X"00",X"40",X"90",X"A8",X"12",X"11",X"18",X"18",X"1C",X"1F",X"0F",X"0F", + X"04",X"08",X"F0",X"01",X"06",X"1F",X"E6",X"07",X"F8",X"B8",X"58",X"F8",X"18",X"F8",X"18",X"38", + X"48",X"00",X"D0",X"00",X"F0",X"00",X"E0",X"40",X"1E",X"1E",X"1C",X"1C",X"19",X"18",X"03",X"00", + X"46",X"07",X"C7",X"06",X"87",X"03",X"01",X"00",X"19",X"F8",X"38",X"D8",X"38",X"F0",X"E0",X"00", + X"20",X"80",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07", + X"00",X"01",X"03",X"47",X"6C",X"3B",X"70",X"00",X"07",X"FB",X"FF",X"0D",X"FF",X"FF",X"79",X"00", + X"00",X"C0",X"E0",X"E4",X"E4",X"F4",X"F8",X"70",X"07",X"06",X"07",X"03",X"03",X"03",X"03",X"01", + X"00",X"00",X"3F",X"3F",X"DF",X"DF",X"0F",X"E0",X"30",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"00", + X"00",X"00",X"08",X"38",X"1C",X"38",X"08",X"00",X"01",X"00",X"01",X"01",X"01",X"01",X"01",X"01", + X"F8",X"00",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FE",X"FD",X"FB",X"02",X"FB",X"00",X"00",X"40",X"80",X"60",X"80",X"00",X"F0", + X"01",X"03",X"03",X"03",X"03",X"07",X"07",X"07",X"D2",X"F5",X"E6",X"ED",X"CA",X"CA",X"89",X"89", + X"00",X"80",X"60",X"00",X"80",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"07",X"0F", + X"00",X"00",X"02",X"06",X"06",X"0F",X"0F",X"4F",X"A0",X"70",X"70",X"20",X"80",X"C0",X"80",X"F0", + X"00",X"00",X"00",X"00",X"08",X"1C",X"1C",X"08",X"1F",X"11",X"15",X"5F",X"11",X"1F",X"11",X"53", + X"F0",X"EC",X"D8",X"D8",X"B4",X"A8",X"A8",X"B4",X"00",X"00",X"00",X"C0",X"F0",X"F8",X"F8",X"C0", + X"00",X"06",X"03",X"00",X"00",X"00",X"00",X"00",X"1F",X"11",X"35",X"3F",X"71",X"73",X"FF",X"07", + X"B8",X"D8",X"DC",X"EC",X"F0",X"F0",X"F4",X"FC",X"00",X"00",X"00",X"08",X"1C",X"1C",X"08",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"18",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"01",X"03",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"E1",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"3F", + X"00",X"00",X"00",X"00",X"00",X"C0",X"F0",X"FC",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"FF",X"3F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"C0",X"F0",X"FC",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80", + X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"9F",X"9F",X"9F",X"8F",X"CF",X"CF",X"CF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"80",X"80",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"CF",X"CF",X"C7",X"E7",X"E7",X"E7",X"E7",X"E7", + X"FF",X"FF",X"CF",X"E3",X"FB",X"FB",X"FB",X"FB",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"F0",X"F0", + X"E3",X"F3",X"F3",X"F3",X"F3",X"F3",X"F1",X"F9",X"DB",X"C3",X"C3",X"C3",X"C3",X"C3",X"C3",X"C3", + X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"F8",X"F9",X"F9",X"F9",X"F9",X"F8",X"FC",X"9C",X"C4", + X"C3",X"C3",X"E3",X"FB",X"FB",X"FB",X"FB",X"FF",X"F8",X"F8",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC", + X"FF",X"FF",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"F4",X"F4",X"F4",X"F6",X"B6",X"86",X"86",X"86", + X"FE",X"FE",X"FE",X"FF",X"FF",X"FE",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"0F",X"03",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"80",X"E0",X"FF",X"FF",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"7F",X"1F",X"07",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F8",X"F8",X"F8",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"3F",X"3F",X"1F",X"1F",X"3F",X"3F",X"3F", + X"86",X"87",X"87",X"87",X"87",X"87",X"C7",X"F6",X"F6",X"F6",X"F6",X"FC",X"FC",X"FC",X"FC",X"F8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"C0",X"00",X"3C",X"8E",X"E0",X"00", + X"FF",X"0F",X"E3",X"38",X"00",X"FF",X"00",X"00",X"FF",X"C0",X"FF",X"00",X"0F",X"03",X"00",X"00", + X"FF",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"70",X"1C",X"FF",X"00",X"00",X"00",X"00", + X"01",X"FC",X"FF",X"FF",X"00",X"00",X"00",X"00",X"E0",X"3F",X"0F",X"03",X"00",X"00",X"00",X"00", + X"FF",X"03",X"00",X"00",X"00",X"C0",X"F0",X"FC",X"FF",X"C0",X"F0",X"FC",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F3",X"F8",X"FE",X"FE",X"FE",X"FE",X"F6",X"F0", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F8",X"FE",X"FE",X"FE",X"FE",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"8F",X"63",X"00",X"01",X"07",X"FF",X"FF",X"FF",X"C7",X"F0",X"FC",X"FC",X"FC", + X"FF",X"BF",X"BF",X"BF",X"9F",X"9F",X"9F",X"8F",X"8F",X"8F",X"87",X"87",X"87",X"83",X"83",X"83", + X"81",X"81",X"81",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"3F",X"3F",X"3F",X"1F",X"1F",X"1F",X"0F", + X"0F",X"0F",X"07",X"07",X"07",X"03",X"03",X"03",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"3F",X"3F",X"3F",X"3F",X"1F",X"1F",X"1F",X"1F", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FE",X"07",X"07",X"87",X"87",X"C7",X"E7",X"E7",X"F7", + X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F8",X"F8",X"F8",X"F8",X"F8",X"78",X"78",X"F8", + X"7F",X"1F",X"07",X"FF",X"FF",X"00",X"00",X"00",X"F8",X"F8",X"F8",X"7F",X"1F",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"07",X"07",X"03",X"03",X"03",X"03",X"01",X"01",X"01",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF", + X"FF",X"FF",X"FF",X"FF",X"3F",X"0F",X"03",X"00",X"3F",X"0F",X"03",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"04",X"00",X"20",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"00",X"60",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"70",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"E0",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"0C",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"60",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03", + X"0F",X"1E",X"7C",X"F0",X"E0",X"80",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1F",X"7E",X"FC",X"F0",X"E0",X"80",X"00",X"00", + X"00",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FC",X"03",X"0F",X"1F",X"3F",X"3E",X"38",X"30",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"18",X"78",X"F8",X"F8",X"F8",X"F0",X"E0",X"80",X"00",X"00", + X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF",X"FC",X"1F",X"7F",X"FF",X"FF",X"FE",X"F8",X"F0",X"C0", + X"00",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"00",X"00",X"04",X"00",X"20",X"00",X"00",X"00", + X"01",X"00",X"00",X"40",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1C", + X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"C0",X"C0", + X"00",X"00",X"00",X"01",X"03",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C", + X"1C",X"7C",X"FC",X"F0",X"E0",X"80",X"00",X"00",X"03",X"0F",X"1F",X"7F",X"FE",X"F8",X"F0",X"C0", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"04",X"00",X"40",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"01",X"00",X"00",X"60",X"C0",X"01",X"00",X"00",X"00",X"80",X"80",X"00",X"00", + X"38",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"03",X"0F",X"0F",X"0C",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"60",X"E0",X"E0",X"E0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"0F", + X"0F",X"0E",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"08",X"18",X"78",X"F8",X"F8",X"F8",X"00",X"00",X"04",X"00",X"60",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"04",X"03",X"02",X"00",X"00",X"00",X"00",X"00",X"00", + X"78",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02", + X"0E",X"1E",X"7C",X"F0",X"E0",X"80",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1F",X"3C", + X"38",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"00",X"00", + X"7F",X"7E",X"7C",X"70",X"60",X"00",X"00",X"00",X"00",X"00",X"0C",X"00",X"60",X"00",X"00",X"00", + X"00",X"00",X"01",X"03",X"02",X"00",X"40",X"C0",X"03",X"06",X"04",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"02",X"0E",X"1C",X"78",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"0C",X"1C",X"7C",X"F0",X"E0",X"80",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1F",X"7C", + X"00",X"00",X"01",X"03",X"03",X"03",X"03",X"00",X"00",X"01",X"03",X"07",X"07",X"07",X"07",X"04", + X"10",X"70",X"F0",X"F0",X"F0",X"F0",X"F0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"0C", + X"08",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"00",X"10",X"70",X"F0",X"E0",X"80",X"00",X"00",X"01",X"03",X"03",X"03",X"02",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"E0",X"E0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"03",X"0F",X"1F",X"7F",X"7F",X"7C",X"78",X"60",X"40",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"02",X"0E",X"1E",X"7E",X"FE",X"00",X"00",X"0C",X"00",X"40",X"00",X"00",X"00", + X"00",X"00",X"01",X"03",X"06",X"00",X"00",X"80",X"03",X"0E",X"0C",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"1C",X"00",X"01",X"03",X"07",X"06",X"00",X"00",X"00", + X"00",X"00",X"60",X"E0",X"E0",X"80",X"00",X"00",X"01",X"03",X"0F",X"0F",X"0E",X"08",X"00",X"00", + X"07",X"07",X"07",X"07",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"C0", + X"00",X"02",X"08",X"00",X"40",X"80",X"00",X"00",X"00",X"00",X"01",X"03",X"06",X"00",X"00",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"18",X"00",X"01",X"03",X"0F",X"0E",X"08",X"00",X"00", + X"00",X"00",X"00",X"80",X"80",X"80",X"00",X"00",X"01",X"03",X"0F",X"1F",X"3E",X"38",X"30",X"00", + X"00",X"08",X"18",X"78",X"F8",X"F8",X"F0",X"C0",X"0F",X"1F",X"7F",X"7F",X"7E",X"78",X"70",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"03",X"0F",X"0F",X"0F",X"0F",X"0F",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0E",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"03",X"0F",X"0F",X"0F",X"0F",X"02",X"FC",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"0F",X"1F",X"7F",X"FF",X"FF",X"FF",X"FC", + X"00",X"00",X"10",X"70",X"F0",X"F0",X"F0",X"F0",X"C0",X"F1",X"F3",X"FF",X"F3",X"FD",X"F1",X"FD", + X"00",X"60",X"78",X"FC",X"7C",X"FE",X"7F",X"7F",X"00",X"00",X"00",X"00",X"00",X"02",X"0E",X"1E", + X"7F",X"FF",X"FF",X"FF",X"FE",X"F8",X"F0",X"C0",X"7E",X"FE",X"FE",X"FE",X"FE",X"F8",X"F0",X"C0", + X"40",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"08",X"18",X"78",X"F8",X"F8",X"F8",X"F8",X"F8",X"F0",X"E0",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"F0",X"B1",X"AD",X"A1",X"80",X"00",X"0E",X"3F",X"D5", + X"FE",X"7E",X"7C",X"3C",X"38",X"BF",X"FF",X"55",X"30",X"18",X"18",X"0C",X"54",X"80",X"AC",X"04", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"8F",X"C4",X"60",X"30",X"30",X"11",X"00",X"00",X"00",X"00",X"E0",X"30",X"18",X"CC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"41",X"81",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"A0",X"B8",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"18",X"06",X"01",X"F0",X"08",X"64",X"94", + X"06",X"E5",X"54",X"E4",X"02",X"A2",X"52",X"03",X"F2",X"02",X"F2",X"64",X"F4",X"05",X"66",X"94", + X"64",X"08",X"F0",X"01",X"06",X"1F",X"E6",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"01",X"03",X"03",X"81",X"C0",X"80",X"F0",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"C2",X"F7",X"FF",X"FA",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F1",X"F3",X"1B",X"09",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"20",X"20",X"40",X"40",X"40",X"40", + X"00",X"18",X"3C",X"3C",X"7E",X"7E",X"7E",X"7E",X"40",X"40",X"00",X"30",X"12",X"1F",X"07",X"00", + X"7E",X"7E",X"3E",X"BE",X"D8",X"D8",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"5B",X"7F", + X"00",X"00",X"07",X"1F",X"38",X"00",X"58",X"FC",X"00",X"00",X"00",X"80",X"C0",X"40",X"00",X"30", + X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"7F",X"FF",X"FF",X"FD",X"7C",X"78",X"FA",X"F2", + X"F8",X"D0",X"45",X"0F",X"1F",X"1E",X"3C",X"3C",X"18",X"0C",X"C4",X"E0",X"30",X"10",X"00",X"00", + X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"F3",X"F3",X"E1",X"61",X"70",X"20",X"20",X"20", + X"18",X"39",X"33",X"13",X"01",X"21",X"60",X"E0",X"F0",X"E0",X"F8",X"F0",X"FC",X"F0",X"A0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"06",X"06",X"03",X"13",X"1B",X"0B",X"01", + X"A7",X"33",X"10",X"02",X"01",X"00",X"00",X"00",X"24",X"FE",X"CC",X"00",X"C0",X"E0",X"70",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"3F",X"3F",X"7F",X"F7", + X"00",X"00",X"00",X"C0",X"F0",X"F8",X"FC",X"DE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40", + X"01",X"01",X"00",X"00",X"01",X"01",X"03",X"03",X"FF",X"FE",X"FF",X"FF",X"F7",X"FF",X"BF",X"FE", + X"FF",X"F7",X"FF",X"FF",X"DF",X"FD",X"FF",X"FF",X"E0",X"E0",X"F0",X"B8",X"F8",X"F8",X"FC",X"FC", + X"01",X"01",X"01",X"03",X"03",X"01",X"01",X"00",X"FF",X"FF",X"EF",X"FF",X"FF",X"FD",X"DF",X"FF", + X"F7",X"FF",X"BF",X"FF",X"FF",X"ED",X"FF",X"FF",X"78",X"F0",X"F0",X"F0",X"B8",X"F8",X"F8",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"38",X"10",X"00",X"00",X"00",X"00", + X"BF",X"FF",X"6F",X"07",X"03",X"01",X"00",X"00",X"F0",X"70",X"F0",X"E0",X"C0",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"10",X"18",X"18",X"00",X"00",X"00",X"00",X"20",X"20",X"00",X"0F",X"65", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"00",X"01",X"03",X"03",X"01",X"00",X"06",X"33", + X"FF",X"B8",X"FF",X"FF",X"FD",X"FF",X"7F",X"FF",X"38",X"F8",X"2C",X"8C",X"C4",X"E8",X"F0",X"F0", + X"7A",X"78",X"77",X"5F",X"0E",X"6E",X"27",X"07",X"FF",X"FF",X"FF",X"FD",X"FC",X"5E",X"EE",X"FC", + X"F8",X"FC",X"FC",X"FC",X"FC",X"BC",X"D8",X"30",X"07",X"0E",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"FF",X"7F",X"E2",X"00",X"00",X"00",X"00",X"00",X"04",X"0E",X"1A",X"36",X"7E",X"3C",X"00", + X"00",X"00",X"00",X"00",X"10",X"10",X"00",X"00",X"00",X"00",X"00",X"60",X"20",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"0E",X"0F",X"1F",X"3B",X"17",X"1F", + X"EF",X"F7",X"7F",X"3F",X"FF",X"FF",X"FF",X"FF",X"00",X"40",X"70",X"F8",X"7C",X"7E",X"7B",X"5F", + X"0F",X"C5",X"F7",X"73",X"53",X"72",X"33",X"01",X"61",X"33",X"9E",X"9C",X"8F",X"C0",X"FF",X"FF", + X"DF",X"BF",X"0F",X"8F",X"86",X"6C",X"E0",X"F0",X"01",X"08",X"0E",X"07",X"03",X"00",X"00",X"00", + X"EF",X"7D",X"00",X"82",X"CF",X"E7",X"3C",X"00",X"B0",X"D8",X"C8",X"00",X"E1",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"3B",X"7F",X"00",X"00",X"50",X"F8",X"FF",X"FF",X"F7",X"F6", + X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"7F",X"7F",X"7F",X"3F",X"1F",X"07",X"01",X"00", + X"CE",X"E3",X"F8",X"FC",X"EF",X"FF",X"FD",X"FF",X"C0",X"E0",X"C0",X"00",X"80",X"80",X"F8",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"DE",X"D7",X"F0",X"F0",X"F8",X"FE",X"73",X"7F", + X"BC",X"FE",X"FC",X"5E",X"14",X"00",X"80",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3E",X"1F",X"07",X"01",X"00",X"00",X"00",X"00",X"70",X"F0",X"E0",X"F0",X"20",X"00",X"00",X"00", + X"00",X"00",X"03",X"07",X"0F",X"1F",X"1F",X"3F",X"07",X"FF",X"FF",X"F0",X"C0",X"80",X"00",X"00", + X"80",X"E0",X"F8",X"3C",X"7E",X"1F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"3E",X"7E",X"0C",X"0C",X"0C",X"1C",X"18",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"07",X"03",X"03",X"03",X"03",X"00",X"00",X"80",X"C0",X"C0",X"C0",X"C0",X"E0",X"60",X"60", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60", + X"00",X"60",X"FC",X"FF",X"FF",X"FF",X"DF",X"A1",X"00",X"00",X"00",X"C0",X"F0",X"F0",X"88",X"04", + X"00",X"00",X"00",X"00",X"C0",X"00",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"78",X"7E",X"38",X"6C",X"42",X"00",X"30",X"68",X"C1",X"C1", + X"00",X"00",X"1E",X"72",X"F9",X"A8",X"00",X"06",X"00",X"00",X"00",X"00",X"30",X"78",X"2C",X"04", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"60",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF", + X"40",X"21",X"80",X"40",X"00",X"00",X"0F",X"8F",X"80",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"C2",X"E7", + X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"7F",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_chr_bit3.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_chr_bit3.vhd new file mode 100644 index 00000000..02b5cb85 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_chr_bit3.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity travusa_chr_bit3 is +port ( + clk : in std_logic; + addr : in std_logic_vector(12 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of travusa_chr_bit3 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"00",X"00", + X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"00",X"00", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"00",X"00",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"00",X"00", + X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"02",X"F8",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"00",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"3F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"40",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"BF",X"3F",X"7F",X"7F",X"7F",X"01",X"81",X"FF",X"81",X"01",X"7F",X"7F",X"7F",X"01",X"81", + X"FF",X"01",X"01",X"E3",X"C7",X"E3",X"01",X"01",X"FF",X"01",X"01",X"DD",X"DD",X"DD",X"C1",X"E3", + X"FF",X"FF",X"F3",X"3E",X"00",X"00",X"00",X"00",X"FF",X"FF",X"F9",X"67",X"00",X"00",X"00",X"00", + X"3F",X"9F",X"9B",X"8E",X"00",X"00",X"00",X"00",X"FD",X"FE",X"CE",X"72",X"00",X"00",X"01",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"1C",X"1C",X"0C",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"A0",X"B0",X"F0",X"F8",X"78",X"E8",X"E8",X"B0", + X"F0",X"E0",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"0F",X"0F",X"0F", + X"07",X"03",X"0B",X"0F",X"0F",X"05",X"05",X"05",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"C4",X"C7",X"BF",X"1F",X"3F",X"0F",X"0F",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00", + X"00",X"C0",X"C0",X"BC",X"1E",X"3F",X"0F",X"0F",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00", + X"3F",X"7F",X"1F",X"3F",X"0F",X"0F",X"27",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"7C",X"1E",X"3F",X"0F",X"0F",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"C0",X"80",X"C0",X"C0",X"C0",X"00",X"80",X"27",X"1F",X"1B",X"0E",X"00",X"00",X"00",X"00", + X"CE",X"D7",X"DF",X"DE",X"DF",X"CF",X"EF",X"E7",X"F7",X"F5",X"F3",X"FB",X"FB",X"FB",X"FB",X"FB", + X"FB",X"FB",X"FB",X"F3",X"F7",X"F7",X"E6",X"EE",X"CC",X"D4",X"DC",X"D8",X"D8",X"D8",X"98",X"A8", + X"B8",X"B8",X"B8",X"98",X"DC",X"DC",X"DE",X"CE",X"EC",X"EE",X"EE",X"E6",X"EE",X"EE",X"EE",X"EE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"C0",X"C0",X"80",X"C0",X"C0",X"C0",X"C0",X"00",X"80", + X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"04",X"07",X"07",X"07",X"07",X"07",X"07",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"01",X"01",X"01",X"02",X"03",X"03",X"03",X"04",X"07",X"0F",X"0F",X"1F",X"1B",X"0D", + X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3E",X"2F",X"1F",X"1F",X"1F",X"0B",X"0D",X"0F",X"0F",X"07", + X"F7",X"F7",X"F7",X"F7",X"C7",X"F7",X"F7",X"77",X"F3",X"FB",X"FB",X"EB",X"D9",X"FD",X"FD",X"7D", + X"B5",X"F9",X"FB",X"FB",X"FB",X"FB",X"EB",X"F3",X"F7",X"F7",X"E7",X"EF",X"CF",X"DF",X"DF",X"9F", + X"BF",X"BF",X"BF",X"BF",X"9F",X"5F",X"DF",X"DF",X"DF",X"DF",X"CF",X"AF",X"EF",X"EF",X"E7",X"F7", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"DF",X"1F",X"8F",X"07",X"07",X"03",X"03",X"81",X"81",X"81",X"01",X"11",X"11",X"31",X"21", + X"C0",X"81",X"C3",X"C0",X"C0",X"C0",X"00",X"80",X"00",X"C0",X"C0",X"BC",X"1E",X"3F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"7C",X"1E",X"3F",X"0F",X"0F",X"06",X"00", + X"03",X"03",X"07",X"07",X"07",X"07",X"0F",X"1F",X"80",X"81",X"03",X"00",X"00",X"00",X"00",X"00", + X"00",X"C0",X"C0",X"BC",X"1E",X"3F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"37",X"7F",X"1F",X"3F",X"0F",X"0F",X"07",X"05", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"3F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"6F",X"38",X"10",X"10",X"10",X"30",X"61",X"7F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"E3",X"81",X"01",X"01",X"01",X"01",X"01", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"60",X"F0", + X"1C",X"00",X"01",X"01",X"01",X"03",X"06",X"04",X"00",X"00",X"00",X"01",X"81",X"03",X"C7",X"7F", + X"1F",X"3F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"01",X"03",X"0E",X"08",X"80",X"C0", + X"7E",X"30",X"18",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"1E",X"03",X"00",X"00",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"60",X"FC",X"01",X"01",X"01",X"03", + X"06",X"64",X"C0",X"00",X"60",X"C1",X"83",X"FE",X"00",X"00",X"00",X"00",X"00",X"C8",X"1F",X"F9", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"A0",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"C0",X"E0",X"30",X"1C",X"16",X"00",X"00",X"03",X"00",X"00",X"80",X"80",X"08",X"48",X"CC", + X"06",X"03",X"01",X"07",X"1C",X"00",X"C1",X"FF",X"08",X"08",X"08",X"1E",X"17",X"11",X"30",X"21", + X"7F",X"18",X"0C",X"06",X"02",X"03",X"01",X"00",X"00",X"00",X"01",X"01",X"01",X"03",X"02",X"06", + X"0C",X"08",X"08",X"1E",X"17",X"11",X"30",X"21",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"07",X"01",X"08",X"04",X"00",X"00",X"00", + X"00",X"00",X"07",X"FF",X"FF",X"FF",X"FF",X"FF",X"01",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"0C",X"C4",X"04",X"04",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FC",X"C8",X"08", + X"FF",X"FF",X"FC",X"80",X"00",X"06",X"80",X"80",X"F0",X"80",X"84",X"C4",X"40",X"60",X"20",X"20", + X"7F",X"FF",X"FF",X"FF",X"FE",X"FC",X"F8",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"03",X"1F",X"7F",X"FF",X"FF",X"FE",X"F8",X"F0",X"91",X"11",X"18",X"08",X"C8", + X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"3F",X"FF",X"FF",X"FE",X"EA",X"8B",X"09", + X"FF",X"FF",X"FF",X"E0",X"04",X"22",X"40",X"00",X"FF",X"E0",X"AC",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"11",X"24",X"46",X"6F",X"76",X"FE",X"FB",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"E0",X"E0",X"F0",X"A8",X"7C",X"52",X"FA", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"FB",X"FF",X"FF",X"FF",X"FF",X"7F",X"1F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EE",X"BC",X"FC",X"F8",X"F8",X"F0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"E0",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"60",X"FC",X"FF",X"FF",X"FF",X"FF",X"E1",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"03",X"C7",X"F7",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F8",X"F8",X"3C",X"FC",X"9C",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"01",X"03",X"03",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"9F",X"FF",X"E7",X"FC",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CD",X"FD",X"FF",X"FF",X"FD",X"FD",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"DC",X"5C",X"7C",X"FC",X"F0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"7F",X"9F",X"7F",X"FF",X"FF",X"7F",X"E7",X"FF", + X"FE",X"F8",X"FF",X"FF",X"FB",X"F7",X"FE",X"FD",X"00",X"00",X"00",X"00",X"C0",X"C0",X"F0",X"F0", + X"01",X"0F",X"FF",X"FF",X"FF",X"FF",X"F8",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"9F",X"FF",X"FF",X"FF",X"7B",X"39",X"00",X"00",X"BF",X"DE",X"7F",X"BF",X"FF",X"F8",X"F0",X"70", + X"70",X"F0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"11",X"79",X"7F", + X"01",X"13",X"BD",X"FF",X"CF",X"97",X"3E",X"3E",X"D8",X"FC",X"E0",X"8D",X"06",X"57",X"FF",X"F9", + X"00",X"00",X"00",X"00",X"80",X"80",X"D0",X"F8",X"7E",X"FE",X"7E",X"FF",X"FF",X"7F",X"7F",X"FF", + X"7F",X"3F",X"7F",X"7F",X"BF",X"FF",X"FF",X"FF",X"FC",X"F8",X"F1",X"E5",X"F7",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"7A",X"3F",X"BE",X"FE",X"FD",X"FF",X"FE", + X"EF",X"1F",X"13",X"07",X"07",X"0F",X"0F",X"07",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FC",X"FC",X"FE",X"FF",X"FF",X"FF",X"FE",X"FC", + X"0F",X"07",X"02",X"01",X"03",X"01",X"00",X"00",X"FF",X"FF",X"FF",X"FB",X"FB",X"B9",X"3D",X"18", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"80",X"F8",X"F0",X"E0",X"E0",X"80",X"00",X"00",X"00", + X"FF",X"FF",X"F8",X"C0",X"00",X"00",X"00",X"00",X"00",X"10",X"01",X"3F",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"18",X"00",X"01",X"FF", + X"FF",X"FF",X"FE",X"F8",X"C0",X"00",X"00",X"00",X"00",X"90",X"91",X"87",X"FF",X"FF",X"BF",X"BE", + X"00",X"00",X"00",X"00",X"10",X"18",X"09",X"8F",X"3F",X"7F",X"FF",X"FF",X"FE",X"F0",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"11",X"01",X"3F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"F8",X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FE",X"FC",X"F8",X"F0",X"F0",X"F0",X"F4",X"F0",X"E0",X"E0",X"E0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"04",X"04",X"04",X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"04",X"4C",X"28",X"08",X"FC",X"FE",X"FF", + X"00",X"00",X"00",X"40",X"82",X"04",X"01",X"FF",X"40",X"60",X"20",X"20",X"20",X"78",X"FE",X"FF", + X"40",X"40",X"01",X"03",X"07",X"7F",X"FF",X"FF",X"7F",X"7F",X"7F",X"7F",X"3F",X"3F",X"3F",X"3F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F", + X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"01",X"01",X"00",X"00",X"FF",X"FF",X"FF",X"FF", + X"00",X"80",X"81",X"87",X"FF",X"FF",X"FF",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F0",X"C0",X"C0",X"C0",X"E0",X"E0",X"E0",X"E0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"F8",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FC",X"FC",X"FC",X"FC",X"FE",X"FE",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"C0",X"C0",X"C0",X"C0",X"E0",X"E0",X"E0",X"E0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F0",X"F0",X"F0",X"F0",X"F8",X"F8",X"F8",X"F8", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"C0",X"00",X"00", + X"C0",X"80",X"88",X"90",X"83",X"9F",X"FF",X"FF",X"FF",X"FF",X"FE",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"0C",X"04",X"64",X"05",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"F0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"01",X"83", + X"87",X"0F",X"FF",X"FF",X"FF",X"FF",X"FC",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"88",X"C8",X"43",X"5F",X"FF",X"FF", + X"FF",X"FF",X"FE",X"F8",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"0C",X"C4",X"04",X"05",X"FF",X"BF",X"BF",X"BF",X"BE", + X"F0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"0C",X"00",X"83", + X"87",X"0F",X"FF",X"FF",X"FC",X"F0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"10",X"90",X"83",X"9F",X"FF",X"FF",X"FF",X"FC",X"E0",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"12",X"12",X"18",X"0B",X"8F",X"3F",X"FF",X"FF",X"FF",X"F8",X"E0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"03",X"05",X"00",X"00",X"02",X"04",X"03",X"FF", + X"FF",X"FF",X"FF",X"7F",X"07",X"7F",X"FF",X"FF",X"FE",X"FC",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"FC",X"F0",X"F0",X"E0",X"E0",X"C0",X"FF",X"FF",X"FF",X"00",X"AA",X"00",X"AA",X"00",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"47",X"10",X"FE",X"FF",X"F0",X"FB",X"E0",X"FB",X"C0",X"FF", + X"00",X"10",X"00",X"10",X"00",X"18",X"B9",X"B9",X"00",X"6D",X"00",X"6D",X"00",X"6D",X"00",X"FF", + X"FF",X"C7",X"83",X"83",X"83",X"83",X"C7",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"07",X"03",X"07", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"9F",X"FF",X"FF",X"FE",X"FC",X"F8",X"F0",X"00",X"00", + X"78",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"3F",X"7F",X"2E",X"40",X"2E",X"40",X"3E",X"9F", + X"FF",X"FF",X"7F",X"3F",X"1F",X"7F",X"FF",X"FF",X"03",X"07",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"03",X"05",X"00",X"00",X"02",X"04",X"00",X"00", + X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"FF",X"02",X"04",X"00",X"00",X"02",X"04",X"03",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"05",X"00",X"00",X"02",X"04",X"03",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"07", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"87",X"FF", + X"07",X"FF",X"E7",X"E7",X"E7",X"E7",X"E7",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"DF",X"8F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"03",X"05",X"00",X"00",X"02",X"04",X"03",X"FF", + X"03",X"07",X"03",X"01",X"03",X"07",X"03",X"FF",X"FE",X"FC",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"FE",X"FC",X"F0",X"F0",X"E0",X"E0",X"C0",X"FF",X"03",X"07",X"03",X"01",X"03",X"07",X"03",X"01", + X"EF",X"FF",X"E8",X"FF",X"FF",X"FF",X"FF",X"FF",X"03",X"07",X"03",X"01",X"03",X"07",X"03",X"FF", + X"FE",X"FC",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FE",X"FC",X"F0",X"F0",X"E0",X"E0",X"C0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"AA",X"00",X"AA",X"00",X"AA",X"00",X"00",X"FF",X"AA",X"00",X"AA",X"00",X"AA",X"00",X"FF", + X"00",X"AA",X"00",X"AA",X"00",X"AA",X"00",X"FF",X"FE",X"FE",X"00",X"AA",X"00",X"AA",X"00",X"00", + X"FA",X"FF",X"FF",X"FF",X"FF",X"FE",X"FF",X"FF",X"AA",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"EF",X"F8",X"EF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"03",X"05",X"00",X"00",X"02",X"04",X"03",X"FF", + X"FE",X"FC",X"00",X"00",X"00",X"00",X"00",X"FF",X"03",X"07",X"03",X"01",X"03",X"07",X"03",X"FF", + X"03",X"07",X"03",X"01",X"03",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"03",X"05",X"00",X"00",X"00",X"04",X"03",X"FF",X"03",X"07",X"03",X"01",X"03",X"07",X"03",X"FF", + X"FE",X"FC",X"F0",X"F0",X"E0",X"E0",X"C0",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"FF",X"FE",X"FC",X"F0",X"F0",X"E0",X"E0",X"C0",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"7F",X"1F",X"1F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FE",X"FC",X"00",X"00",X"00",X"00",X"00",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"03",X"01",X"00",X"12",X"03",X"03",X"FF",X"FF",X"FF",X"FF",X"70",X"18",X"8A",X"FF", + X"FF",X"FF",X"E0",X"1E",X"03",X"31",X"1C",X"07",X"FF",X"FF",X"7E",X"1F",X"8F",X"CF",X"CF",X"EE", + X"FC",X"02",X"7F",X"FF",X"FF",X"FF",X"FF",X"3F",X"DF",X"47",X"6F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"03",X"43",X"D7",X"DF",X"7F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"9F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"FF",X"FF",X"7F",X"BF",X"9F",X"EF",X"F7", + X"BF",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C", + X"01",X"03",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"19",X"14",X"05",X"15",X"15",X"15",X"11", + X"1F",X"9C",X"9B",X"11",X"14",X"04",X"48",X"48",X"FF",X"1F",X"63",X"81",X"00",X"0C",X"12",X"1A", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"10",X"D0",X"D0",X"10",X"D0",X"D5",X"15",X"D5", + X"48",X"44",X"44",X"44",X"08",X"18",X"40",X"40",X"00",X"06",X"09",X"06",X"00",X"0F",X"08",X"00", + X"3F",X"0F",X"0F",X"07",X"07",X"03",X"03",X"03",X"0F",X"09",X"06",X"00",X"0F",X"0D",X"08",X"00", + X"1E",X"08",X"1E",X"00",X"81",X"62",X"1C",X"C1",X"00",X"00",X"03",X"07",X"07",X"0F",X"1E",X"1E", + X"00",X"E0",X"F8",X"FE",X"FF",X"0F",X"07",X"07",X"1A",X"16",X"1E",X"DE",X"DC",X"1C",X"DC",X"D2", + X"05",X"06",X"07",X"07",X"03",X"03",X"03",X"00",X"1C",X"DC",X"DC",X"1E",X"DE",X"D6",X"1A",X"1E", + X"03",X"03",X"03",X"07",X"07",X"06",X"05",X"07",X"FF",X"1F",X"0F",X"0F",X"0F",X"0E",X"0C",X"0C", + X"FF",X"FF",X"FF",X"FF",X"0F",X"47",X"93",X"AB",X"1E",X"1F",X"17",X"17",X"1B",X"1C",X"0F",X"09", + X"07",X"0F",X"FF",X"FE",X"F8",X"E4",X"1C",X"FC",X"0C",X"0C",X"0C",X"08",X"08",X"0C",X"0C",X"0C", + X"4B",X"03",X"D3",X"07",X"F7",X"07",X"EF",X"4F",X"DF",X"13",X"DF",X"17",X"1E",X"1F",X"0C",X"0F", + X"94",X"F4",X"24",X"E4",X"44",X"C2",X"81",X"84",X"0D",X"0C",X"0E",X"0F",X"0F",X"17",X"E7",X"0F", + X"2F",X"8F",X"5F",X"1F",X"FF",X"FF",X"FF",X"FF",X"07",X"07",X"07",X"07",X"FF",X"FF",X"40",X"18", + X"01",X"02",X"04",X"08",X"13",X"04",X"0B",X"10",X"FF",X"07",X"00",X"F3",X"01",X"01",X"84",X"78", + X"03",X"09",X"DC",X"9A",X"DA",X"EA",X"7C",X"3D",X"06",X"00",X"03",X"00",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"31",X"D7",X"11",X"00",X"E0",X"0B",X"01",X"00",X"27",X"52",X"27",X"00",X"00", + X"FF",X"FF",X"7F",X"7F",X"1F",X"7B",X"4F",X"77",X"00",X"00",X"00",X"00",X"60",X"00",X"00",X"60", + X"07",X"07",X"63",X"91",X"00",X"E0",X"50",X"E0",X"00",X"60",X"60",X"00",X"60",X"60",X"00",X"60", + X"00",X"A0",X"50",X"00",X"F0",X"00",X"F0",X"60",X"FF",X"FF",X"9F",X"1F",X"9F",X"6F",X"9F",X"FF", + X"F0",X"00",X"60",X"90",X"60",X"01",X"02",X"00",X"FF",X"FF",X"BF",X"3F",X"7F",X"9F",X"7F",X"0F", + X"00",X"00",X"00",X"01",X"00",X"03",X"00",X"06",X"E2",X"01",X"04",X"C4",X"22",X"23",X"65",X"65", + X"0F",X"FF",X"7F",X"9F",X"7F",X"3F",X"BF",X"FF",X"30",X"08",X"08",X"04",X"04",X"04",X"08",X"00", + X"E6",X"EF",X"7E",X"7E",X"3E",X"3F",X"1F",X"1F",X"9F",X"0E",X"0C",X"08",X"98",X"FC",X"FF",X"FF", + X"FF",X"FF",X"7F",X"7F",X"77",X"E3",X"C3",X"C3",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F3",X"E3",X"C7",X"C1",X"81",X"82",X"81",X"80",X"E7",X"FF",X"FF",X"7D",X"58",X"50",X"50",X"41", + X"00",X"10",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"60",X"60",X"00",X"07", + X"81",X"C7",X"C2",X"E0",X"F0",X"F1",X"F7",X"FF",X"9F",X"3F",X"7F",X"F7",X"E3",X"C3",X"C3",X"E7", + X"01",X"01",X"03",X"03",X"03",X"07",X"07",X"07",X"F3",X"F8",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F0",X"F0",X"18",X"C8",X"E0",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FE",X"FC",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"80",X"E0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"C7", + X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"0F",X"03",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"FC",X"3F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"C0",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"7F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"80",X"80",X"80",X"80",X"C0",X"C0",X"C0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"0F",X"0F", + X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F8",X"DB",X"C3",X"C3",X"C3",X"C3",X"C3",X"C3",X"C3", + X"0F",X"0F",X"0F",X"0F",X"07",X"07",X"07",X"07",X"F8",X"F8",X"F8",X"F8",X"F8",X"FC",X"FC",X"FC", + X"C3",X"F3",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"07",X"07",X"03",X"03",X"03",X"03",X"03",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"FC",X"FC",X"FE",X"B6",X"86",X"86",X"86", + X"01",X"01",X"01",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"F0",X"FC",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F", + X"78",X"78",X"78",X"38",X"38",X"78",X"78",X"78",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"7F",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"86",X"87",X"87",X"87",X"87",X"E7",X"FF",X"FE",X"FE",X"FE",X"FE",X"FC",X"FC",X"FC",X"FC",X"F8", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"FF",X"FF",X"3F",X"3F",X"8E",X"E0",X"FF", + X"00",X"CF",X"E3",X"38",X"FF",X"FF",X"00",X"FF",X"00",X"FF",X"FF",X"00",X"CF",X"E3",X"F8",X"FF", + X"00",X"F3",X"F8",X"FE",X"FF",X"FF",X"FF",X"FF",X"00",X"0F",X"03",X"00",X"FF",X"FF",X"FF",X"FF", + X"00",X"FC",X"FF",X"00",X"FF",X"FF",X"FF",X"FF",X"00",X"C7",X"F1",X"FC",X"FF",X"FF",X"FF",X"FF", + X"00",X"F3",X"F8",X"FE",X"FF",X"FF",X"FF",X"FF",X"00",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F", + X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"36",X"30", + X"30",X"30",X"30",X"30",X"30",X"30",X"30",X"3C",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F", + X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"00",X"00",X"F0",X"7C",X"FF",X"3E",X"00",X"FF",X"00",X"00",X"3F",X"1E",X"1F",X"1C",X"1C", + X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1C",X"1C",X"0C",X"0C",X"0C",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"04",X"04",X"04",X"04",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"78",X"78",X"78",X"F8",X"F8",X"78",X"78",X"F8", + X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"7F",X"1F",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"07",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"07",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"07",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"01",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"07",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"07",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF",X"01",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"07",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F", + X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"1F",X"3F",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F", + X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F", + X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F", + X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F", + X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F", + X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FD",X"03",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"3F",X"0E",X"0C",X"00",X"0C",X"02",X"0E",X"02", + X"FF",X"BF",X"BF",X"3F",X"BF",X"3F",X"BE",X"BE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F", + X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"0F",X"1F",X"7F",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"4E",X"52",X"5E",X"7F",X"FF",X"F1",X"C0",X"2A", + X"3F",X"BF",X"BF",X"FF",X"FF",X"60",X"00",X"AA",X"40",X"E0",X"E0",X"F0",X"A8",X"7C",X"52",X"FA", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"70",X"3B",X"9F",X"CF",X"CF",X"EE",X"FF",X"FF",X"FF",X"FF",X"1F",X"CF",X"E7",X"33", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"BE",X"7E",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"5F",X"47",X"EF",X"FF",X"FF",X"FF",X"FF",X"FF",X"1F",X"63",X"81",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"81",X"62",X"1C",X"C1",X"00",X"E0",X"F8",X"FE",X"FF",X"0F",X"67",X"97", + X"05",X"E6",X"57",X"E7",X"03",X"A3",X"53",X"00",X"F3",X"03",X"F3",X"67",X"F7",X"06",X"65",X"97", + X"67",X"0F",X"FF",X"FE",X"F8",X"E4",X"1C",X"FC",X"FF",X"FF",X"77",X"47",X"03",X"43",X"47",X"77", + X"9F",X"0E",X"0C",X"08",X"98",X"FC",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"77",X"E3",X"C3",X"C3", + X"E7",X"FF",X"FF",X"7D",X"58",X"50",X"50",X"41",X"9F",X"3F",X"7F",X"F7",X"E3",X"C3",X"C3",X"E7", + X"F0",X"F0",X"18",X"C8",X"E0",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"09",X"0D",X"00",X"0E", + X"00",X"00",X"18",X"18",X"3C",X"3C",X"3C",X"3C",X"05",X"0E",X"40",X"4B",X"2D",X"20",X"18",X"00", + X"3C",X"3C",X"7C",X"7C",X"3C",X"3C",X"18",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"0D",X"0F",X"0C",X"1C",X"B9",X"BF",X"FF",X"F7",X"A0",X"80", + X"38",X"F0",X"F0",X"C0",X"C7",X"FF",X"A7",X"03",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"C0", + X"1F",X"1F",X"3F",X"3E",X"3E",X"3F",X"7F",X"7F",X"80",X"00",X"00",X"02",X"83",X"87",X"05",X"0D", + X"07",X"2F",X"BA",X"F0",X"E0",X"E1",X"C3",X"C3",X"E0",X"F0",X"38",X"18",X"C0",X"E0",X"C0",X"F4", + X"7E",X"7E",X"7F",X"7F",X"3F",X"3F",X"2F",X"0F",X"0C",X"0C",X"1E",X"9E",X"8F",X"DF",X"DF",X"DD", + X"E7",X"C6",X"CC",X"EC",X"FE",X"DE",X"9B",X"19",X"0E",X"1F",X"07",X"0C",X"00",X"08",X"5C",X"F0", + X"0F",X"0F",X"0F",X"0B",X"03",X"01",X"01",X"00",X"FD",X"F9",X"F9",X"FC",X"EC",X"E4",X"F4",X"E8", + X"58",X"CC",X"EF",X"FD",X"7E",X"3B",X"39",X"08",X"D8",X"00",X"30",X"98",X"00",X"00",X"80",X"C0", + X"00",X"00",X"00",X"00",X"01",X"02",X"02",X"04",X"07",X"18",X"60",X"80",X"00",X"00",X"00",X"00", + X"C0",X"30",X"08",X"06",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"60",X"10",X"08", + X"04",X"04",X"04",X"08",X"08",X"08",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"04",X"02",X"02",X"02",X"01",X"01",X"01", + X"08",X"08",X"08",X"08",X"08",X"08",X"04",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"02", + X"04",X"02",X"02",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"87",X"78",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"60",X"1C",X"03",X"02",X"02",X"02",X"04",X"04",X"08",X"10",X"E0", + X"00",X"00",X"00",X"00",X"10",X"38",X"38",X"11",X"00",X"00",X"40",X"60",X"60",X"20",X"0F",X"FF", + X"00",X"00",X"00",X"00",X"00",X"10",X"80",X"E0",X"03",X"07",X"07",X"0F",X"0F",X"0F",X"1F",X"3F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F8",X"F8",X"FC",X"FC",X"FC",X"FC",X"F9",X"F8", + X"7E",X"7E",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"F8",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"7F",X"1F",X"0F",X"03",X"01",X"20",X"00",X"18", + X"FF",X"FF",X"FF",X"FF",X"FF",X"0F",X"01",X"00",X"F8",X"FC",X"FE",X"FE",X"FE",X"FE",X"FC",X"70", + X"00",X"00",X"01",X"00",X"30",X"30",X"10",X"03",X"00",X"00",X"00",X"60",X"60",X"42",X"00",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"07",X"4F",X"1F",X"3F",X"7F",X"7F",X"7F",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"40",X"70",X"F8",X"7C",X"7E",X"7F",X"7F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"E3",X"F3",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"F8",X"7F",X"3F",X"3F",X"1F",X"5F",X"07",X"11",X"00", + X"EF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7E",X"FC",X"FC",X"FC",X"FC",X"FD",X"F9",X"C0",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"C0",X"20",X"18",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"07",X"0E",X"1C",X"1C",X"38",X"00",X"E0",X"80",X"00",X"3F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"F0",X"F8",X"FC",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"39",X"71",X"73",X"73",X"73",X"E3",X"E7",X"E7",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"E7",X"E7",X"E7",X"E7",X"E7",X"E7",X"E7",X"E7",X"FF",X"FF",X"F9",X"F8",X"F9",X"FF",X"FF",X"FF", + X"FF",X"FF",X"9F",X"0F",X"9F",X"FF",X"FF",X"FF",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"00",X"60",X"FC",X"FF",X"FF",X"FF",X"FF",X"E1",X"01",X"01",X"03",X"C7",X"F7",X"FF",X"FF",X"FF", + X"F0",X"F0",X"F8",X"F8",X"3C",X"FC",X"9C",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"70",X"70", + X"00",X"00",X"00",X"01",X"03",X"13",X"7B",X"7F",X"01",X"13",X"BD",X"FF",X"CF",X"97",X"3E",X"3E", + X"D8",X"FC",X"E0",X"8D",X"06",X"57",X"FF",X"F9",X"00",X"00",X"00",X"00",X"80",X"80",X"D0",X"F8", + X"01",X"01",X"01",X"00",X"00",X"00",X"FF",X"FF",X"9F",X"FF",X"FF",X"FF",X"7B",X"39",X"FF",X"FF", + X"BF",X"DE",X"7F",X"BF",X"FF",X"F8",X"FF",X"FF",X"70",X"F0",X"E0",X"C0",X"80",X"00",X"FF",X"FF", + X"0F",X"07",X"02",X"01",X"03",X"01",X"FF",X"FF",X"FF",X"FF",X"FF",X"FB",X"FB",X"B9",X"FF",X"FF", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F8",X"F0",X"E0",X"E0",X"80",X"00",X"FF",X"FF"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_chr_palette.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_chr_palette.vhd new file mode 100644 index 00000000..1324cf03 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_chr_palette.vhd @@ -0,0 +1,54 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity travusa_chr_palette is +port ( + clk : in std_logic; + addr : in std_logic_vector(8 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of travusa_chr_palette is + type rom is array(0 to 511) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"05",X"07",X"A6",X"F0",X"B8",X"C0",X"E2",X"00",X"FF",X"FF",X"00",X"00",X"00",X"07",X"F8", + X"5B",X"FF",X"27",X"28",X"20",X"00",X"9A",X"E8",X"EC",X"FF",X"27",X"28",X"20",X"00",X"9A",X"E8", + X"00",X"FF",X"C0",X"A6",X"03",X"E0",X"F8",X"E7",X"00",X"C0",X"E5",X"FF",X"B7",X"07",X"04",X"63", + X"00",X"F0",X"E3",X"FF",X"B7",X"07",X"A7",X"60",X"00",X"FF",X"18",X"07",X"EC",X"B8",X"E3",X"88", + X"E0",X"FF",X"5B",X"F8",X"04",X"20",X"9B",X"00",X"5B",X"5B",X"FF",X"C0",X"EC",X"00",X"C7",X"FF", + X"E0",X"FF",X"5B",X"FF",X"00",X"00",X"38",X"00",X"5B",X"FF",X"5B",X"FF",X"EC",X"00",X"3F",X"00", + X"B8",X"00",X"E0",X"F8",X"05",X"E2",X"C0",X"80",X"B8",X"FF",X"5B",X"F8",X"04",X"20",X"9B",X"00", + X"F8",X"00",X"B8",X"98",X"EC",X"00",X"00",X"00",X"5B",X"FF",X"B8",X"98",X"EC",X"00",X"60",X"E2", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_sound.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_sound.vhd new file mode 100644 index 00000000..7bd83583 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_sound.vhd @@ -0,0 +1,278 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity travusa_sound is +port ( + clk : in std_logic; + addr : in std_logic_vector(11 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of travusa_sound is + type rom is array(0 to 4095) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"76",X"BD",X"59",X"10",X"5B",X"00",X"5C",X"01",X"5D",X"0D",X"53",X"00",X"12",X"41",X"08",X"12", + X"42",X"08",X"12",X"43",X"08",X"12",X"44",X"08",X"12",X"45",X"08",X"12",X"46",X"08",X"5C",X"0A", + X"5D",X"09",X"12",X"47",X"08",X"12",X"48",X"08",X"12",X"49",X"08",X"12",X"4A",X"08",X"12",X"50", + X"08",X"12",X"55",X"08",X"12",X"5A",X"08",X"12",X"5F",X"08",X"12",X"64",X"08",X"12",X"69",X"08", + X"12",X"6C",X"08",X"12",X"70",X"08",X"12",X"75",X"08",X"12",X"7A",X"08",X"59",X"00",X"5C",X"00", + X"77",X"02",X"FF",X"66",X"B9",X"6D",X"14",X"6E",X"0A",X"FE",X"F0",X"74",X"FE",X"F0",X"74",X"FE", + X"F0",X"C3",X"FE",X"F0",X"C3",X"FE",X"F0",X"74",X"FE",X"F0",X"74",X"FE",X"F0",X"C3",X"FE",X"F0", + X"C3",X"FE",X"F1",X"10",X"42",X"77",X"43",X"00",X"45",X"01",X"69",X"0E",X"6A",X"0E",X"04",X"DD", + X"30",X"6A",X"0E",X"69",X"0E",X"02",X"9F",X"30",X"42",X"86",X"69",X"0E",X"6A",X"0E",X"04",X"7A", + X"30",X"42",X"77",X"69",X"0E",X"6A",X"0E",X"04",X"7A",X"30",X"42",X"86",X"69",X"0E",X"6A",X"0E", + X"04",X"3E",X"30",X"42",X"8E",X"69",X"0E",X"6A",X"0E",X"04",X"3E",X"30",X"42",X"9F",X"69",X"0E", + X"6A",X"0E",X"04",X"1C",X"30",X"42",X"77",X"69",X"0E",X"6A",X"0E",X"04",X"1C",X"30",X"69",X"0E", + X"6A",X"0E",X"FD",X"42",X"86",X"69",X"0E",X"6A",X"0E",X"45",X"02",X"04",X"16",X"30",X"42",X"B3", + X"69",X"0E",X"6A",X"0E",X"04",X"16",X"30",X"42",X"96",X"69",X"0E",X"6A",X"0E",X"45",X"01",X"04", + X"A9",X"30",X"42",X"86",X"69",X"0E",X"6A",X"0E",X"04",X"A9",X"30",X"42",X"96",X"69",X"0E",X"6A", + X"0E",X"04",X"65",X"30",X"42",X"9F",X"69",X"0E",X"6A",X"0E",X"04",X"65",X"30",X"42",X"B3",X"69", + X"0E",X"6A",X"0E",X"04",X"3E",X"30",X"42",X"86",X"69",X"0E",X"6A",X"0E",X"04",X"3E",X"30",X"FD", + X"42",X"B3",X"43",X"00",X"69",X"0E",X"44",X"CE",X"45",X"02",X"2A",X"0E",X"30",X"42",X"77",X"69", + X"0E",X"2A",X"0E",X"30",X"42",X"6A",X"69",X"0E",X"44",X"38",X"2A",X"0E",X"30",X"42",X"77",X"69", + X"0E",X"2A",X"0E",X"30",X"42",X"59",X"69",X"0E",X"44",X"DD",X"45",X"01",X"2A",X"0E",X"30",X"42", + X"6A",X"69",X"0E",X"2A",X"0E",X"30",X"42",X"77",X"69",X"0E",X"44",X"38",X"45",X"02",X"2A",X"0E", + X"30",X"42",X"6A",X"69",X"0E",X"44",X"CE",X"2A",X"0E",X"30",X"42",X"9F",X"69",X"0E",X"44",X"7D", + X"2A",X"0E",X"30",X"42",X"6A",X"69",X"0E",X"2A",X"0E",X"30",X"42",X"5E",X"69",X"0E",X"44",X"FC", + X"45",X"01",X"2A",X"0E",X"30",X"42",X"6A",X"69",X"0E",X"2A",X"0E",X"30",X"42",X"4F",X"69",X"0E", + X"44",X"A9",X"2A",X"0E",X"30",X"42",X"5E",X"69",X"0E",X"2A",X"0E",X"30",X"42",X"6A",X"69",X"0E", + X"44",X"FC",X"2A",X"0E",X"30",X"42",X"9F",X"69",X"0E",X"44",X"7D",X"45",X"02",X"2A",X"0E",X"30", + X"42",X"77",X"69",X"0E",X"44",X"DD",X"45",X"01",X"2A",X"0E",X"30",X"42",X"9F",X"69",X"0E",X"2A", + X"0E",X"30",X"42",X"86",X"69",X"0E",X"44",X"7A",X"2A",X"0E",X"30",X"42",X"77",X"69",X"0E",X"2A", + X"0E",X"30",X"42",X"86",X"69",X"0E",X"44",X"65",X"2A",X"0E",X"30",X"42",X"8E",X"69",X"0E",X"2A", + X"0E",X"30",X"42",X"9F",X"69",X"0E",X"44",X"51",X"2A",X"0E",X"30",X"42",X"77",X"69",X"0E",X"2A", + X"0E",X"30",X"42",X"4F",X"69",X"0E",X"44",X"3E",X"2A",X"0E",X"30",X"42",X"4F",X"69",X"0E",X"2A", + X"0E",X"30",X"67",X"02",X"66",X"B9",X"44",X"1C",X"2A",X"0E",X"30",X"42",X"4F",X"69",X"0E",X"2A", + X"0E",X"30",X"44",X"0C",X"2A",X"0E",X"30",X"69",X"0E",X"2A",X"0E",X"30",X"69",X"0E",X"44",X"FD", + X"45",X"00",X"2A",X"0E",X"30",X"69",X"0E",X"2A",X"0E",X"30",X"FE",X"F0",X"59",X"66",X"B9",X"43", + X"00",X"45",X"02",X"69",X"0E",X"6A",X"0E",X"6C",X"14",X"6D",X"14",X"6E",X"14",X"FE",X"F2",X"C4", + X"FE",X"F2",X"C4",X"FE",X"F3",X"09",X"FE",X"F3",X"09",X"FE",X"F3",X"50",X"FE",X"F3",X"50",X"44", + X"7A",X"45",X"01",X"69",X"0E",X"6A",X"0E",X"02",X"D4",X"30",X"69",X"0E",X"6A",X"0E",X"02",X"96", + X"30",X"44",X"A9",X"69",X"0E",X"6A",X"0E",X"02",X"D4",X"30",X"69",X"0E",X"6A",X"0E",X"02",X"8E", + X"30",X"44",X"DD",X"69",X"0E",X"6A",X"0E",X"02",X"D4",X"30",X"69",X"0E",X"6A",X"0E",X"02",X"86", + X"30",X"44",X"FC",X"69",X"0E",X"6A",X"0E",X"02",X"D4",X"30",X"69",X"0E",X"6A",X"0E",X"02",X"7E", + X"30",X"44",X"7A",X"69",X"0E",X"6A",X"0E",X"02",X"D4",X"30",X"69",X"0E",X"6A",X"0E",X"02",X"7E", + X"30",X"44",X"2C",X"69",X"0E",X"6A",X"0E",X"02",X"D4",X"30",X"69",X"0E",X"6A",X"0E",X"02",X"8E", + X"30",X"44",X"1C",X"69",X"0E",X"6A",X"0E",X"02",X"D4",X"30",X"69",X"0E",X"6A",X"0E",X"02",X"86", + X"30",X"44",X"EE",X"69",X"0E",X"6A",X"0E",X"02",X"D4",X"30",X"69",X"0E",X"6A",X"0E",X"02",X"8E", + X"30",X"FE",X"F2",X"2D",X"44",X"38",X"45",X"02",X"69",X"0E",X"6A",X"0E",X"02",X"8E",X"30",X"69", + X"0E",X"6A",X"0E",X"02",X"8E",X"30",X"44",X"DD",X"45",X"01",X"69",X"0E",X"6A",X"0E",X"02",X"77", + X"30",X"69",X"0E",X"6A",X"0E",X"02",X"8E",X"30",X"44",X"7A",X"69",X"0E",X"6A",X"0E",X"02",X"5E", + X"30",X"69",X"0E",X"6A",X"0E",X"02",X"8E",X"30",X"44",X"DD",X"69",X"0E",X"6A",X"0E",X"02",X"77", + X"30",X"69",X"0E",X"6A",X"0E",X"02",X"8E",X"30",X"FD",X"44",X"7D",X"45",X"02",X"69",X"0E",X"6A", + X"0E",X"02",X"9F",X"30",X"69",X"0E",X"6A",X"0E",X"02",X"9F",X"30",X"44",X"16",X"69",X"0E",X"6A", + X"0E",X"02",X"86",X"30",X"69",X"0E",X"6A",X"0E",X"02",X"9F",X"30",X"44",X"A9",X"45",X"01",X"69", + X"0E",X"6A",X"0E",X"02",X"6A",X"30",X"69",X"0E",X"6A",X"0E",X"02",X"9F",X"30",X"44",X"16",X"45", + X"02",X"69",X"0E",X"6A",X"0E",X"02",X"86",X"30",X"69",X"0E",X"6A",X"0E",X"02",X"9F",X"30",X"FD", + X"44",X"CE",X"45",X"02",X"69",X"0E",X"6A",X"0E",X"02",X"B3",X"30",X"69",X"0E",X"6A",X"0E",X"02", + X"B3",X"30",X"44",X"38",X"69",X"0E",X"6A",X"0E",X"02",X"8E",X"30",X"69",X"0E",X"6A",X"0E",X"02", + X"B3",X"30",X"44",X"DD",X"45",X"01",X"69",X"0E",X"6A",X"0E",X"02",X"77",X"30",X"69",X"0E",X"6A", + X"0E",X"02",X"B3",X"30",X"44",X"38",X"45",X"02",X"69",X"0E",X"6A",X"0E",X"02",X"8E",X"30",X"69", + X"0E",X"6A",X"0E",X"02",X"B3",X"30",X"FD",X"66",X"B9",X"43",X"00",X"45",X"02",X"69",X"0E",X"6A", + X"0E",X"6C",X"14",X"6D",X"14",X"6E",X"14",X"FE",X"F3",X"AD",X"FE",X"F3",X"A7",X"42",X"77",X"45", + X"01",X"69",X"0E",X"6A",X"0E",X"04",X"DD",X"30",X"42",X"5E",X"45",X"02",X"69",X"0E",X"6A",X"0E", + X"04",X"16",X"30",X"42",X"59",X"69",X"0E",X"6A",X"0E",X"04",X"38",X"30",X"42",X"54",X"69",X"0E", + X"6A",X"0E",X"04",X"58",X"30",X"42",X"4F",X"69",X"0E",X"6A",X"0E",X"04",X"7D",X"30",X"42",X"59", + X"69",X"0E",X"6A",X"0E",X"04",X"38",X"30",X"42",X"5E",X"69",X"0E",X"6A",X"0E",X"04",X"16",X"30", + X"42",X"6A",X"45",X"01",X"69",X"0E",X"6A",X"0E",X"04",X"FC",X"30",X"FD",X"76",X"BB",X"55",X"00", + X"54",X"70",X"5A",X"10",X"5B",X"00",X"5C",X"08",X"1D",X"09",X"E0",X"5A",X"00",X"77",X"04",X"FF", + X"76",X"BD",X"52",X"20",X"53",X"00",X"19",X"0F",X"60",X"59",X"00",X"77",X"06",X"FF",X"76",X"BD", + X"52",X"7F",X"53",X"00",X"19",X"0F",X"30",X"19",X"00",X"90",X"19",X"0F",X"30",X"19",X"00",X"90", + X"19",X"0F",X"30",X"19",X"00",X"90",X"52",X"2F",X"19",X"0F",X"70",X"59",X"00",X"77",X"06",X"FF", + X"66",X"F8",X"48",X"10",X"49",X"00",X"4B",X"00",X"4C",X"0A",X"20",X"9F",X"00",X"20",X"20",X"5E", + X"00",X"20",X"20",X"9F",X"00",X"20",X"20",X"A8",X"00",X"20",X"20",X"64",X"00",X"20",X"20",X"A8", + X"00",X"20",X"20",X"B3",X"00",X"20",X"20",X"6A",X"00",X"20",X"20",X"B3",X"00",X"20",X"42",X"77", + X"43",X"00",X"6D",X"10",X"69",X"0F",X"20",X"BD",X"00",X"40",X"67",X"02",X"20",X"9F",X"00",X"20", + X"20",X"8E",X"00",X"20",X"0D",X"09",X"20",X"20",X"86",X"00",X"80",X"67",X"07",X"FF",X"66",X"FC", + X"6C",X"14",X"6D",X"14",X"FE",X"F4",X"CB",X"02",X"1C",X"20",X"40",X"8E",X"68",X"0F",X"29",X"0F", + X"20",X"40",X"7E",X"42",X"51",X"68",X"0F",X"29",X"0F",X"40",X"40",X"8E",X"68",X"0F",X"29",X"0F", + X"20",X"FE",X"F4",X"CB",X"42",X"FC",X"29",X"0F",X"20",X"29",X"0F",X"20",X"42",X"DD",X"29",X"0F", + X"40",X"42",X"C1",X"68",X"0F",X"29",X"0F",X"20",X"FE",X"F4",X"94",X"40",X"6A",X"41",X"00",X"42", + X"A9",X"43",X"01",X"68",X"0F",X"29",X"0F",X"40",X"40",X"8E",X"68",X"0F",X"29",X"0F",X"20",X"40", + X"7E",X"42",X"51",X"68",X"0F",X"29",X"0F",X"40",X"40",X"77",X"68",X"0F",X"29",X"0F",X"20",X"42", + X"1C",X"29",X"0F",X"20",X"FD",X"FE",X"F4",X"94",X"66",X"F8",X"68",X"0F",X"49",X"10",X"4A",X"10", + X"4B",X"00",X"4C",X"10",X"6C",X"14",X"FE",X"F5",X"0F",X"FE",X"F5",X"0F",X"67",X"07",X"FF",X"20", + X"6A",X"00",X"30",X"20",X"7E",X"00",X"30",X"20",X"8E",X"00",X"30",X"20",X"6A",X"00",X"60",X"FD", + X"76",X"BB",X"5A",X"0F",X"55",X"00",X"54",X"58",X"14",X"50",X"04",X"14",X"59",X"04",X"14",X"57", + X"04",X"14",X"5F",X"04",X"14",X"56",X"04",X"14",X"55",X"04",X"14",X"59",X"04",X"14",X"56",X"04", + X"14",X"5A",X"04",X"14",X"57",X"04",X"14",X"50",X"04",X"14",X"5C",X"04",X"14",X"59",X"04",X"14", + X"57",X"04",X"14",X"53",X"04",X"14",X"5C",X"04",X"14",X"58",X"04",X"5A",X"00",X"77",X"04",X"FF", + X"76",X"BB",X"55",X"00",X"54",X"38",X"5A",X"0F",X"14",X"36",X"04",X"14",X"38",X"04",X"14",X"36", + X"04",X"14",X"3A",X"04",X"14",X"33",X"04",X"14",X"37",X"04",X"14",X"3F",X"04",X"14",X"36",X"04", + X"14",X"38",X"04",X"14",X"3C",X"04",X"14",X"34",X"04",X"14",X"39",X"04",X"14",X"3F",X"04",X"14", + X"35",X"04",X"14",X"3D",X"04",X"14",X"38",X"04",X"14",X"33",X"04",X"14",X"3F",X"04",X"5A",X"00", + X"77",X"04",X"FF",X"76",X"AF",X"59",X"10",X"5C",X"01",X"5D",X"0D",X"16",X"1E",X"01",X"16",X"1D", + X"01",X"16",X"1C",X"01",X"16",X"1B",X"01",X"16",X"1A",X"01",X"16",X"19",X"01",X"16",X"18",X"01", + X"16",X"17",X"01",X"16",X"16",X"01",X"16",X"15",X"01",X"16",X"14",X"01",X"16",X"13",X"01",X"16", + X"12",X"01",X"16",X"11",X"01",X"16",X"10",X"01",X"5B",X"A1",X"5C",X"07",X"5D",X"09",X"16",X"0F", + X"01",X"16",X"FE",X"01",X"16",X"0D",X"01",X"16",X"0C",X"01",X"16",X"0B",X"01",X"16",X"0A",X"01", + X"16",X"09",X"01",X"16",X"08",X"01",X"16",X"07",X"01",X"16",X"06",X"01",X"16",X"05",X"01",X"16", + X"04",X"01",X"16",X"03",X"01",X"16",X"02",X"01",X"16",X"01",X"01",X"56",X"00",X"59",X"00",X"5B", + X"00",X"5C",X"00",X"5D",X"00",X"77",X"B8",X"FF",X"76",X"BB",X"55",X"00",X"54",X"70",X"5A",X"10", + X"5B",X"00",X"5C",X"10",X"1D",X"09",X"E0",X"5A",X"00",X"77",X"04",X"FF",X"6C",X"14",X"6D",X"14", + X"6E",X"0A",X"42",X"DD",X"43",X"01",X"4A",X"10",X"46",X"00",X"4B",X"00",X"4C",X"04",X"66",X"9C", + X"FE",X"F6",X"46",X"47",X"BF",X"FF",X"40",X"9F",X"41",X"00",X"42",X"D4",X"43",X"00",X"68",X"0F", + X"69",X"0F",X"0D",X"09",X"15",X"0D",X"09",X"15",X"68",X"0F",X"69",X"0F",X"0D",X"09",X"15",X"40", + X"FD",X"42",X"65",X"43",X"01",X"68",X"0F",X"69",X"0F",X"0D",X"09",X"15",X"0D",X"09",X"15",X"0D", + X"09",X"15",X"40",X"EE",X"42",X"3E",X"68",X"0F",X"69",X"0F",X"0D",X"09",X"15",X"0D",X"09",X"15", + X"0D",X"09",X"15",X"40",X"E1",X"42",X"2C",X"68",X"0F",X"69",X"0F",X"0D",X"09",X"15",X"0D",X"09", + X"15",X"0D",X"09",X"15",X"40",X"D4",X"42",X"1C",X"68",X"0F",X"69",X"0F",X"0D",X"09",X"15",X"0D", + X"09",X"15",X"0D",X"09",X"15",X"40",X"BD",X"42",X"FD",X"43",X"00",X"68",X"0F",X"69",X"0F",X"0D", + X"09",X"15",X"0D",X"09",X"15",X"0D",X"09",X"15",X"40",X"B3",X"42",X"EE",X"68",X"0F",X"69",X"0F", + X"0D",X"09",X"15",X"0D",X"09",X"15",X"0D",X"09",X"15",X"40",X"A8",X"42",X"E1",X"68",X"0F",X"69", + X"0F",X"0D",X"09",X"15",X"0D",X"09",X"15",X"0D",X"09",X"15",X"40",X"9F",X"42",X"D4",X"68",X"0F", + X"69",X"0F",X"0D",X"09",X"15",X"0D",X"09",X"15",X"0D",X"09",X"15",X"40",X"7E",X"42",X"B3",X"68", + X"0F",X"69",X"0F",X"0D",X"09",X"15",X"0D",X"09",X"15",X"0D",X"09",X"15",X"40",X"77",X"42",X"9F", + X"68",X"0F",X"69",X"0F",X"0D",X"09",X"15",X"0D",X"09",X"15",X"0D",X"09",X"15",X"40",X"70",X"42", + X"96",X"68",X"0F",X"69",X"0F",X"0D",X"09",X"15",X"0D",X"09",X"15",X"0D",X"09",X"15",X"40",X"6A", + X"42",X"8E",X"69",X"0F",X"68",X"0F",X"0D",X"09",X"15",X"0D",X"09",X"15",X"0D",X"09",X"15",X"40", + X"5E",X"42",X"7E",X"68",X"0F",X"69",X"0F",X"0D",X"09",X"15",X"0D",X"09",X"15",X"0D",X"09",X"15", + X"40",X"59",X"42",X"77",X"68",X"0F",X"69",X"0F",X"0D",X"09",X"15",X"0D",X"09",X"15",X"0D",X"09", + X"15",X"40",X"54",X"42",X"70",X"68",X"0F",X"69",X"0F",X"0D",X"09",X"15",X"0D",X"09",X"15",X"0D", + X"09",X"15",X"40",X"4F",X"42",X"6A",X"68",X"0F",X"69",X"0F",X"0D",X"09",X"15",X"0D",X"09",X"15", + X"0D",X"09",X"15",X"FD",X"66",X"F8",X"68",X"0F",X"49",X"10",X"4A",X"10",X"4B",X"00",X"4C",X"10", + X"20",X"9F",X"00",X"30",X"20",X"BD",X"00",X"18",X"20",X"EE",X"00",X"48",X"20",X"BD",X"00",X"48", + X"20",X"9F",X"00",X"48",X"20",X"77",X"00",X"90",X"20",X"5E",X"00",X"30",X"20",X"6A",X"00",X"18", + X"20",X"77",X"00",X"48",X"20",X"BD",X"00",X"48",X"20",X"A8",X"00",X"48",X"20",X"9F",X"00",X"90", + X"20",X"9F",X"00",X"24",X"20",X"9F",X"00",X"24",X"20",X"5E",X"00",X"60",X"20",X"6A",X"00",X"18", + X"20",X"77",X"00",X"48",X"20",X"7E",X"00",X"90",X"20",X"8E",X"00",X"24",X"20",X"7E",X"00",X"24", + X"20",X"77",X"00",X"48",X"20",X"77",X"00",X"48",X"20",X"9F",X"00",X"48",X"20",X"EE",X"00",X"90", + X"FE",X"F7",X"80",X"46",X"10",X"66",X"C7",X"48",X"10",X"49",X"10",X"4A",X"10",X"4B",X"00",X"4C", + X"0A",X"0D",X"09",X"20",X"67",X"38",X"FF",X"80",X"88",X"08",X"80",X"80",X"80",X"80",X"00",X"81", + X"80",X"80",X"90",X"80",X"04",X"41",X"FF",X"8C",X"D7",X"24",X"0A",X"E8",X"08",X"29",X"80",X"22", + X"E0",X"81",X"51",X"CC",X"0B",X"42",X"00",X"58",X"A9",X"EA",X"02",X"51",X"29",X"A9",X"BC",X"91", + X"27",X"38",X"9A",X"B9",X"0B",X"17",X"03",X"8A",X"C0",X"80",X"00",X"00",X"49",X"B0",X"00",X"60", + X"D9",X"0A",X"40",X"00",X"58",X"AA",X"CA",X"15",X"21",X"29",X"AA",X"CE",X"01",X"17",X"08",X"98", + X"A8",X"8A",X"15",X"21",X"9A",X"B8",X"00",X"92",X"10",X"7A",X"A0",X"00",X"40",X"E8",X"08",X"28", + X"01",X"59",X"9C",X"BA",X"27",X"01",X"29",X"A9",X"CC",X"02",X"37",X"09",X"89",X"B8",X"98",X"26", + X"38",X"AA",X"A8",X"08",X"83",X"14",X"3F",X"90",X"80",X"4A",X"98",X"00",X"00",X"02",X"79",X"9D", + X"99",X"34",X"02",X"19",X"B9",X"FB",X"12",X"53",X"0A",X"99",X"D8",X"A1",X"27",X"18",X"9A",X"A0", + X"09",X"13",X"05",X"0D",X"90",X"00",X"3C",X"80",X"18",X"80",X"02",X"79",X"BB",X"AA",X"72",X"82", + X"2A",X"A9",X"FA",X"12",X"43",X"0A",X"9A",X"D9",X"91",X"47",X"09",X"8A",X"90",X"8A",X"32",X"14", + X"9C",X"90",X"80",X"3B",X"00",X"5B",X"80",X"02",X"79",X"D8",X"98",X"50",X"83",X"09",X"AB",X"F8", + X"14",X"12",X"89",X"9A",X"CB",X"02",X"57",X"88",X"99",X"98",X"89",X"32",X"31",X"AE",X"80",X"80", + X"18",X"00",X"5C",X"80",X"02",X"3C",X"C0",X"A2",X"30",X"06",X"0A",X"9E",X"B0",X"25",X"03",X"8A", + X"9A",X"DA",X"12",X"72",X"89",X"9B",X"90",X"A0",X"61",X"39",X"9C",X"88",X"00",X"00",X"04",X"0D", + X"08",X"03",X"2E",X"90",X"A3",X"10",X"07",X"89",X"AC",X"B1",X"43",X"04",X"8A",X"9C",X"D8",X"12", + X"71",X"98",X"9A",X"98",X"91",X"52",X"19",X"9C",X"88",X"09",X"30",X"16",X"AB",X"00",X"03",X"2F", + X"88",X"82",X"00",X"87",X"89",X"BA",X"B1",X"71",X"02",X"99",X"9B",X"F0",X"12",X"50",X"89",X"9B", + X"8A",X"82",X"72",X"09",X"AB",X"80",X"0A",X"50",X"13",X"CA",X"80",X"04",X"9B",X"00",X"00",X"01", + X"07",X"1B",X"E9",X"A3",X"50",X"12",X"9A",X"AF",X"A0",X"25",X"30",X"A9",X"9C",X"8B",X"12",X"72", + X"89",X"9B",X"80",X"A1",X"58",X"40",X"C9",X"80",X"04",X"B8",X"01",X"88",X"00",X"17",X"8B",X"B9", + X"B7",X"10",X"21",X"9A",X"9F",X"A1",X"24",X"30",X"A9",X"AD",X"9A",X"22",X"72",X"8A",X"9B",X"08", + X"B3",X"50",X"48",X"C9",X"08",X"02",X"A0",X"05",X"B8",X"00",X"07",X"8C",X"98",X"95",X"00",X"11", + X"99",X"AF",X"91",X"41",X"20",X"A9",X"9D",X"A0",X"13",X"71",X"99",X"9B",X"08",X"A3",X"43",X"2A", + X"DA",X"00",X"00",X"81",X"07",X"B8",X"80",X"00",X"00",X"00",X"01",X"F7",X"F7",X"01",X"80",X"00", + X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00", + X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00", + X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00", + X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"01",X"F4",X"8D",X"F4",X"8D",X"F4", + X"8D",X"F3",X"FC",X"F4",X"10",X"F6",X"18",X"F0",X"00",X"F4",X"1E",X"F5",X"20",X"F5",X"60",X"F0", + X"53",X"F5",X"A3",X"F4",X"8E",X"F4",X"40",X"F6",X"2C",X"F4",X"F8",X"F7",X"74",X"F7",X"E3",X"F2", + X"1D",X"F3",X"97",X"F4",X"8D",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"8E",X"00",X"FF",X"BD",X"FC",X"7A",X"86",X"BF",X"C6",X"07",X"BD",X"FC",X"BA",X"86",X"13", + X"C6",X"0F",X"BD",X"FC",X"BA",X"BD",X"FC",X"8F",X"7F",X"90",X"00",X"0F",X"BD",X"FB",X"C8",X"96", + X"BC",X"2B",X"07",X"BD",X"FE",X"C3",X"86",X"FF",X"97",X"BC",X"0E",X"CE",X"00",X"00",X"DF",X"D1", + X"96",X"80",X"26",X"0B",X"DE",X"84",X"D6",X"8C",X"BD",X"FD",X"BE",X"DF",X"84",X"97",X"80",X"7C", + X"00",X"D2",X"96",X"81",X"26",X"0B",X"DE",X"86",X"D6",X"8D",X"BD",X"FD",X"BE",X"DF",X"86",X"97", + X"81",X"7C",X"00",X"D2",X"96",X"82",X"26",X"0B",X"DE",X"88",X"D6",X"8E",X"BD",X"FD",X"BE",X"DF", + X"88",X"97",X"82",X"7C",X"00",X"D2",X"96",X"83",X"26",X"0B",X"DE",X"8A",X"D6",X"8F",X"BD",X"FD", + X"BE",X"DF",X"8A",X"97",X"83",X"96",X"A8",X"27",X"08",X"7F",X"00",X"A8",X"C6",X"08",X"BD",X"FD", + X"1C",X"96",X"A9",X"27",X"08",X"7F",X"00",X"A9",X"C6",X"09",X"BD",X"FD",X"1C",X"96",X"AA",X"27", + X"08",X"7F",X"00",X"AA",X"C6",X"0A",X"BD",X"FD",X"1C",X"96",X"AB",X"27",X"08",X"7F",X"00",X"AB", + X"C6",X"18",X"BD",X"FD",X"35",X"96",X"AC",X"27",X"08",X"7F",X"00",X"AC",X"C6",X"19",X"BD",X"FD", + X"35",X"96",X"AD",X"27",X"08",X"7F",X"00",X"AD",X"C6",X"1A",X"BD",X"FD",X"35",X"96",X"BE",X"16", + X"9A",X"D8",X"0F",X"97",X"D8",X"54",X"24",X"09",X"D6",X"CB",X"C1",X"02",X"26",X"03",X"5C",X"D7", + X"BC",X"C6",X"0F",X"BD",X"FC",X"C0",X"7E",X"FA",X"9B",X"96",X"C1",X"B7",X"08",X"01",X"96",X"C2", + X"B7",X"08",X"02",X"7C",X"00",X"BD",X"96",X"BF",X"4C",X"97",X"BF",X"44",X"24",X"32",X"DE",X"C3", + X"09",X"27",X"1E",X"DF",X"C3",X"DE",X"C7",X"A6",X"00",X"44",X"44",X"44",X"44",X"97",X"C1",X"DE", + X"C5",X"09",X"27",X"15",X"DF",X"C5",X"DE",X"C9",X"A6",X"00",X"44",X"44",X"44",X"44",X"97",X"C2", + X"3B",X"86",X"01",X"9A",X"BE",X"97",X"BE",X"20",X"E6",X"86",X"02",X"9A",X"BE",X"97",X"BE",X"3B", + X"96",X"C7",X"81",X"A0",X"25",X"09",X"DE",X"C7",X"A6",X"00",X"97",X"C1",X"08",X"DF",X"C7",X"96", + X"C9",X"81",X"A0",X"25",X"09",X"DE",X"C9",X"A6",X"00",X"97",X"C2",X"08",X"DF",X"C9",X"96",X"BF", + X"84",X"0E",X"26",X"CC",X"7C",X"00",X"C0",X"3B",X"96",X"C0",X"27",X"41",X"7A",X"00",X"C0",X"BD", + X"FC",X"19",X"96",X"80",X"27",X"06",X"4C",X"27",X"03",X"7A",X"00",X"80",X"96",X"81",X"27",X"06", + X"4C",X"27",X"03",X"7A",X"00",X"81",X"96",X"82",X"27",X"06",X"4C",X"27",X"03",X"7A",X"00",X"82", + X"96",X"83",X"27",X"06",X"4C",X"27",X"03",X"7A",X"00",X"83",X"CE",X"00",X"06",X"A6",X"AD",X"27", + X"09",X"4A",X"26",X"04",X"6C",X"A7",X"A6",X"B3",X"A7",X"AD",X"09",X"26",X"F0",X"39",X"C6",X"17", + X"96",X"BB",X"8A",X"B1",X"97",X"BB",X"7E",X"FC",X"C0",X"96",X"D9",X"98",X"DA",X"27",X"13",X"96", + X"D9",X"97",X"DA",X"27",X"E9",X"C6",X"17",X"96",X"BB",X"8A",X"BE",X"84",X"BE",X"97",X"BB",X"BD", + X"FC",X"C0",X"DE",X"DC",X"96",X"DB",X"91",X"DC",X"27",X"2F",X"2A",X"08",X"09",X"09",X"09",X"09", + X"09",X"7E",X"FC",X"47",X"C6",X"0A",X"3A",X"DF",X"DC",X"96",X"D9",X"27",X"C0",X"D6",X"09",X"D4", + X"7F",X"3A",X"DF",X"D5",X"96",X"D5",X"C6",X"11",X"BD",X"FC",X"C0",X"96",X"D6",X"C6",X"10",X"BD", + X"FC",X"C0",X"86",X"0F",X"C6",X"18",X"7E",X"FC",X"C0",X"7F",X"00",X"D9",X"39",X"B7",X"90",X"00", + X"C6",X"0E",X"BD",X"FD",X"02",X"84",X"3F",X"97",X"BC",X"3B",X"CE",X"FF",X"FF",X"DF",X"00",X"C6", + X"4F",X"08",X"86",X"00",X"A7",X"80",X"08",X"5A",X"26",X"FA",X"86",X"13",X"97",X"D8",X"39",X"BD", + X"FC",X"A5",X"86",X"BF",X"97",X"BB",X"C6",X"FF",X"D7",X"82",X"D7",X"B1",X"D7",X"B2",X"D7",X"B3", + X"C6",X"17",X"7E",X"FC",X"C0",X"86",X"BF",X"97",X"BA",X"C6",X"FF",X"D7",X"80",X"D7",X"81",X"D7", + X"AE",X"D7",X"AF",X"D7",X"B0",X"C6",X"07",X"7E",X"FC",X"C0",X"7C",X"00",X"BD",X"20",X"04",X"0F", + X"7F",X"00",X"BD",X"37",X"36",X"C1",X"10",X"2A",X"19",X"86",X"0D",X"97",X"03",X"D7",X"02",X"C6", + X"08",X"D7",X"03",X"5C",X"32",X"97",X"02",X"96",X"BD",X"27",X"FC",X"D7",X"03",X"5A",X"D7",X"03", + X"33",X"39",X"86",X"15",X"97",X"03",X"C4",X"0F",X"D7",X"02",X"C6",X"10",X"20",X"E3",X"37",X"20", + X"E4",X"37",X"86",X"15",X"97",X"03",X"C4",X"0F",X"D7",X"02",X"C6",X"14",X"20",X"0D",X"C1",X"10", + X"2A",X"EF",X"37",X"86",X"0D",X"97",X"03",X"D7",X"02",X"C6",X"0C",X"4F",X"97",X"03",X"97",X"00", + X"D7",X"03",X"96",X"02",X"5F",X"D7",X"03",X"5A",X"D7",X"00",X"33",X"39",X"0F",X"BD",X"FD",X"02", + X"C6",X"09",X"7F",X"00",X"BD",X"84",X"1F",X"81",X"10",X"2A",X"08",X"4A",X"81",X"07",X"2B",X"03", + X"BD",X"FC",X"EE",X"0E",X"39",X"0F",X"BD",X"FC",X"F1",X"C6",X"11",X"20",X"E5",X"17",X"84",X"0F", + X"81",X"08",X"2A",X"08",X"A6",X"94",X"AB",X"98",X"A7",X"94",X"20",X"67",X"CB",X"38",X"DE",X"CD", + X"A6",X"05",X"36",X"DE",X"D1",X"AB",X"94",X"A7",X"94",X"32",X"2B",X"0C",X"24",X"02",X"6C",X"98", + X"BD",X"FC",X"BF",X"5C",X"A6",X"94",X"20",X"4B",X"25",X"F6",X"6A",X"98",X"20",X"F2",X"6F",X"8C", + X"DE",X"CD",X"C1",X"A0",X"2B",X"02",X"08",X"08",X"08",X"08",X"08",X"C1",X"C0",X"2B",X"08",X"17", + X"84",X"0F",X"81",X"08",X"2B",X"01",X"08",X"86",X"01",X"39",X"DF",X"CD",X"DE",X"D1",X"6A",X"90", + X"27",X"DC",X"C1",X"A0",X"2A",X"10",X"C4",X"1F",X"A6",X"94",X"36",X"DE",X"CD",X"A6",X"03",X"BD", + X"FC",X"BF",X"0E",X"32",X"08",X"39",X"C1",X"C0",X"2A",X"93",X"A6",X"90",X"44",X"A6",X"94",X"25", + X"02",X"A6",X"98",X"C4",X"1F",X"BD",X"FC",X"BF",X"0E",X"DE",X"CD",X"A6",X"04",X"39",X"26",X"CA", + X"DF",X"CD",X"E6",X"00",X"2A",X"03",X"7E",X"FE",X"75",X"C4",X"3F",X"C1",X"20",X"2A",X"11",X"A6", + X"01",X"BD",X"FC",X"BF",X"0E",X"E6",X"00",X"08",X"08",X"58",X"2B",X"E4",X"A6",X"00",X"08",X"39", + X"C4",X"1F",X"17",X"84",X"0F",X"26",X"31",X"A6",X"01",X"97",X"CE",X"A6",X"02",X"97",X"CD",X"BD", + X"FE",X"B6",X"DC",X"CD",X"04",X"DD",X"CD",X"E6",X"00",X"C4",X"1F",X"5C",X"5C",X"BD",X"FE",X"B6", + X"7C",X"00",X"CE",X"26",X"03",X"7C",X"00",X"CD",X"BD",X"FE",X"B6",X"CB",X"07",X"86",X"09",X"BD", + X"FC",X"C0",X"0E",X"E6",X"00",X"08",X"20",X"BF",X"80",X"08",X"2B",X"29",X"DD",X"CF",X"84",X"03", + X"C1",X"30",X"2B",X"02",X"8B",X"03",X"16",X"A6",X"01",X"CE",X"00",X"00",X"3A",X"D6",X"CF",X"C1", + X"04",X"2A",X"0B",X"A6",X"B4",X"A7",X"AE",X"DE",X"CD",X"D6",X"D0",X"7E",X"FD",X"CF",X"A7",X"B4", + X"DE",X"CD",X"7E",X"FD",X"D5",X"4C",X"27",X"17",X"5C",X"C1",X"10",X"2A",X"09",X"96",X"BA",X"A4", + X"01",X"97",X"BA",X"7E",X"FD",X"D1",X"96",X"BB",X"A4",X"01",X"97",X"BB",X"7E",X"FD",X"D1",X"C1", + X"10",X"2A",X"09",X"96",X"BA",X"AA",X"01",X"97",X"BA",X"7E",X"FD",X"D1",X"96",X"BB",X"AA",X"01", + X"97",X"BB",X"7E",X"FD",X"D1",X"C1",X"F0",X"2A",X"17",X"A6",X"01",X"EE",X"02",X"3C",X"DE",X"D1", + X"E7",X"8C",X"4C",X"A7",X"90",X"32",X"A7",X"94",X"32",X"A7",X"98",X"DE",X"CD",X"86",X"01",X"39", + X"5C",X"27",X"12",X"DE",X"D1",X"5C",X"26",X"10",X"DC",X"CD",X"A7",X"9C",X"E7",X"A0",X"DE",X"CD", + X"EE",X"01",X"86",X"01",X"39",X"86",X"FF",X"39",X"A6",X"9C",X"E6",X"A0",X"DD",X"CD",X"DE",X"CD", + X"08",X"08",X"08",X"86",X"01",X"39",X"96",X"CE",X"BD",X"FC",X"BF",X"5C",X"96",X"CD",X"BD",X"FC", + X"C0",X"5C",X"39",X"26",X"0E",X"BD",X"FC",X"7A",X"7F",X"00",X"D9",X"CE",X"0F",X"00",X"DF",X"DC", + X"7E",X"FC",X"8F",X"81",X"0E",X"2B",X"03",X"7E",X"FF",X"0F",X"97",X"CB",X"96",X"D8",X"8A",X"01", + X"16",X"C4",X"FE",X"D7",X"D8",X"C6",X"0F",X"BD",X"FC",X"C0",X"86",X"05",X"7F",X"00",X"BD",X"D6", + X"BD",X"27",X"FC",X"4A",X"26",X"F6",X"D6",X"CB",X"58",X"58",X"CE",X"F9",X"77",X"3A",X"3C",X"EE", + X"00",X"DF",X"C7",X"38",X"EE",X"02",X"DF",X"C3",X"96",X"BE",X"84",X"02",X"97",X"BE",X"39",X"16", + X"58",X"CE",X"F9",X"9F",X"3A",X"EE",X"00",X"81",X"10",X"2B",X"21",X"27",X"6F",X"81",X"16",X"2A", + X"1C",X"D6",X"82",X"5C",X"27",X"06",X"91",X"A6",X"27",X"02",X"2A",X"10",X"97",X"A6",X"DF",X"88", + X"7F",X"00",X"82",X"7F",X"00",X"8E",X"C6",X"B8",X"DA",X"BB",X"D7",X"BB",X"39",X"81",X"18",X"27", + X"26",X"81",X"1A",X"2A",X"11",X"DF",X"8A",X"97",X"A7",X"7F",X"00",X"83",X"7F",X"00",X"8F",X"86", + X"BE",X"9A",X"BB",X"97",X"BB",X"39",X"81",X"20",X"2A",X"1E",X"3C",X"36",X"BD",X"FC",X"7A",X"7F", + X"00",X"D9",X"BD",X"FC",X"8F",X"32",X"38",X"DF",X"84",X"97",X"A4",X"7F",X"00",X"80",X"7F",X"00", + X"8C",X"86",X"BE",X"9A",X"BA",X"97",X"BA",X"39",X"81",X"22",X"2A",X"03",X"7E",X"FF",X"67",X"80", + X"20",X"97",X"DB",X"39",X"81",X"0E",X"26",X"08",X"7F",X"00",X"D9",X"39",X"86",X"03",X"97",X"DC", + X"86",X"0C",X"97",X"DB",X"86",X"01",X"97",X"D9",X"39",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FA",X"80",X"FA",X"80",X"FA",X"80",X"FA",X"80",X"FC",X"6D",X"FA",X"80",X"FB",X"59",X"FA",X"80"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_bit1.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_bit1.vhd new file mode 100644 index 00000000..cb329a7b --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_bit1.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity travusa_spr_bit1 is +port ( + clk : in std_logic; + addr : in std_logic_vector(12 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of travusa_spr_bit1 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"3F",X"7F",X"7F",X"7F",X"7F",X"3E",X"19",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"19",X"3E",X"7F",X"7F",X"7F",X"7F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"C1",X"C1",X"C1",X"C1",X"C0",X"C0",X"E0",X"E0",X"E1",X"F7",X"FF",X"FF",X"1F",X"08",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"83",X"03",X"FF",X"FF",X"FC",X"0A",X"00",X"00", + X"00",X"00",X"08",X"1F",X"FF",X"FF",X"F7",X"E1",X"E0",X"E0",X"C0",X"C0",X"C1",X"C1",X"C1",X"C1", + X"00",X"00",X"0A",X"FC",X"FF",X"FF",X"03",X"83",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"87",X"87",X"87",X"87",X"87",X"CF",X"FF",X"FF",X"3F",X"F9",X"F8",X"FE",X"3E",X"0C",X"00",X"00", + X"80",X"80",X"80",X"80",X"80",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"07",X"03",X"03",X"00",X"00",X"00",X"00",X"00", + X"03",X"01",X"1F",X"0C",X"6D",X"DF",X"CF",X"FF",X"F7",X"E7",X"03",X"00",X"00",X"01",X"01",X"00", + X"FE",X"BE",X"3C",X"28",X"80",X"C0",X"80",X"03",X"03",X"27",X"7F",X"FF",X"F8",X"FF",X"87",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"FC",X"FE",X"FE",X"FE",X"BA",X"80",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"07",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"BC",X"FE",X"FE",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"07",X"03",X"03",X"00",X"00",X"00",X"00",X"00", + X"03",X"01",X"1F",X"0C",X"6D",X"DF",X"CF",X"FF",X"F7",X"E7",X"03",X"00",X"00",X"01",X"01",X"00", + X"FC",X"FC",X"78",X"50",X"80",X"C0",X"80",X"03",X"07",X"0F",X"7F",X"FF",X"F8",X"FF",X"87",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"FC",X"FE",X"FE",X"FE",X"BA",X"80",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"07",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"F8",X"FC",X"FC",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"07",X"07",X"03",X"01",X"03",X"06",X"00",X"00",X"00",X"00",X"00",X"00", + X"1B",X"3B",X"C9",X"8E",X"FE",X"FC",X"EF",X"EF",X"57",X"11",X"07",X"0F",X"0F",X"1E",X"18",X"00", + X"A0",X"00",X"00",X"00",X"00",X"00",X"10",X"7E",X"FE",X"FF",X"BF",X"2D",X"C1",X"F0",X"3C",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"3F",X"7F",X"7F",X"7F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"C0",X"E0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"07",X"07",X"03",X"01",X"03",X"06",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"3E",X"CA",X"8E",X"FE",X"FC",X"EF",X"EF",X"57",X"11",X"07",X"0F",X"0F",X"1C",X"19",X"00", + X"40",X"00",X"00",X"00",X"00",X"00",X"30",X"7E",X"FE",X"FF",X"BF",X"2D",X"C1",X"F0",X"3C",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0E",X"3F",X"7F",X"7F",X"7F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"2D",X"7F",X"4C",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"4C",X"7F",X"2D",X"00", + X"00",X"00",X"80",X"80",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"80",X"80",X"00",X"00", + X"00",X"12",X"7F",X"33",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"33",X"7F",X"12",X"00", + X"00",X"00",X"80",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"80",X"00",X"00", + X"01",X"01",X"01",X"01",X"02",X"02",X"03",X"03",X"01",X"01",X"03",X"03",X"01",X"00",X"00",X"00", + X"E0",X"14",X"3E",X"F6",X"E4",X"04",X"44",X"E0",X"E0",X"E0",X"E0",X"C0",X"80",X"40",X"C0",X"C0", + X"00",X"01",X"01",X"01",X"02",X"02",X"03",X"03",X"01",X"01",X"03",X"03",X"01",X"00",X"00",X"00", + X"F0",X"14",X"9E",X"F6",X"E4",X"04",X"44",X"E0",X"E0",X"E0",X"E0",X"C0",X"80",X"40",X"C0",X"C0", + X"FF",X"FF",X"FF",X"7F",X"0F",X"0C",X"08",X"00",X"00",X"03",X"01",X"00",X"00",X"00",X"00",X"00", + X"07",X"07",X"03",X"81",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"FE",X"FE",X"FE",X"E1",X"05",X"64",X"7C",X"26",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"26",X"7C",X"64",X"05",X"E1",X"FE",X"FE",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00", + X"FE",X"FE",X"FE",X"E1",X"05",X"64",X"7C",X"26",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"26",X"7C",X"64",X"05",X"E1",X"FE",X"FE",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00", + X"0E",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"0B",X"1F",X"1F",X"1F",X"1F",X"1F", + X"00",X"00",X"00",X"00",X"00",X"E0",X"F8",X"F0",X"F0",X"F0",X"E0",X"E0",X"E0",X"F0",X"F8",X"70", + X"7F",X"FF",X"FF",X"DB",X"E1",X"30",X"82",X"67",X"7A",X"FC",X"3C",X"00",X"00",X"00",X"00",X"00", + X"E0",X"E0",X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"37",X"7F",X"7E",X"FF",X"FF",X"7F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0", + X"7F",X"FF",X"FF",X"DB",X"E1",X"30",X"82",X"67",X"7A",X"FC",X"3C",X"00",X"00",X"00",X"00",X"00", + X"E0",X"E0",X"C0",X"C0",X"80",X"80",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"1F",X"0F",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F8",X"E0",X"80",X"00",X"00",X"60",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"33",X"3F",X"0F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"0F",X"3F",X"33",X"01", + X"00",X"40",X"80",X"80",X"C0",X"F0",X"80",X"80",X"80",X"80",X"F0",X"C0",X"80",X"80",X"40",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"40",X"40",X"01",X"40",X"F1",X"E3",X"E3",X"E3",X"E3",X"F1",X"40",X"01",X"40",X"40",X"00", + X"00",X"00",X"20",X"E0",X"60",X"F0",X"F8",X"E0",X"E0",X"F8",X"F0",X"60",X"E0",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"0E",X"1C",X"3C",X"3C",X"1C",X"0E",X"08",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"70",X"30",X"70",X"F0",X"F0",X"70",X"30",X"70",X"10",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"0F",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"9C",X"1C",X"38",X"1C",X"9C",X"08",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"18",X"30",X"18",X"08",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"04",X"04",X"00",X"06",X"0F",X"3F",X"7F",X"7F",X"7F",X"7F",X"3F",X"0F",X"06",X"00",X"04",X"04", + X"00",X"0C",X"0F",X"03",X"8F",X"1E",X"1E",X"1E",X"1F",X"1F",X"0F",X"83",X"0F",X"0C",X"00",X"00", + X"40",X"C0",X"E0",X"E0",X"F0",X"D0",X"C0",X"C0",X"C0",X"F0",X"F0",X"E0",X"E0",X"60",X"20",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"0F",X"07",X"01",X"07",X"00",X"00",X"00", + X"1F",X"1F",X"0F",X"1B",X"13",X"57",X"FF",X"FF",X"FF",X"FF",X"FF",X"F8",X"18",X"1C",X"1C",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"0F", + X"FC",X"FC",X"FC",X"FC",X"E4",X"C1",X"C1",X"81",X"82",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"C0",X"80",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"70",X"F8",X"C8",X"01",X"01",X"01",X"01",X"F3",X"F9",X"F9",X"FC", + X"00",X"00",X"00",X"00",X"30",X"78",X"F8",X"FC",X"F8",X"E0",X"E0",X"E0",X"E0",X"C0",X"D0",X"F0", + X"0F",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F0",X"F0",X"EC",X"7E",X"5F",X"73",X"7D",X"FF",X"E6",X"60",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"0F",X"0F",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"E7",X"FF", + X"FC",X"FC",X"FE",X"FE",X"7E",X"FE",X"DE",X"8C",X"00",X"00",X"01",X"03",X"07",X"1C",X"38",X"00", + X"00",X"00",X"00",X"00",X"1E",X"3E",X"FF",X"FF",X"FB",X"F1",X"E0",X"C0",X"F0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"E0",X"F8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"60",X"20", + X"7F",X"FF",X"FF",X"7F",X"1F",X"0F",X"07",X"01",X"00",X"00",X"01",X"04",X"06",X"03",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"04",X"2E",X"2E",X"2E",X"3E",X"1E",X"1F",X"1F",X"1F",X"0F",X"1E",X"3E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"FC",X"F8",X"70",X"06",X"8F",X"FF",X"7F",X"3F",X"1B",X"0C",X"04",X"00",X"00",X"00",X"00", + X"18",X"30",X"00",X"00",X"00",X"C0",X"E0",X"E0",X"F0",X"F0",X"70",X"78",X"70",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"30",X"F8",X"38",X"00",X"38",X"7C",X"FC",X"FC",X"FE",X"FE",X"FE",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"38",X"38",X"18", + X"C7",X"CF",X"6F",X"27",X"23",X"30",X"3F",X"3F",X"3F",X"2F",X"2F",X"07",X"01",X"03",X"07",X"0F", + X"F8",X"F8",X"F0",X"E0",X"86",X"06",X"06",X"0C",X"18",X"80",X"80",X"80",X"80",X"80",X"80",X"00", + X"00",X"00",X"19",X"3F",X"3F",X"0F",X"0F",X"0F",X"1F",X"1F",X"0F",X"0F",X"07",X"81",X"80",X"80", + X"7C",X"F8",X"F8",X"F0",X"E0",X"E0",X"B0",X"9C",X"9E",X"8E",X"F0",X"F8",X"F8",X"F8",X"F8",X"F8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"1E",X"3E",X"7E",X"7C",X"FE",X"FE",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"06",X"1B",X"3D",X"7C",X"7C",X"7C",X"7E",X"7F",X"7F",X"3F",X"03",X"01", + X"E0",X"70",X"38",X"00",X"00",X"07",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"3F",X"37",X"01", + X"18",X"18",X"18",X"58",X"F8",X"F0",X"F0",X"F0",X"B0",X"B0",X"B0",X"80",X"80",X"E0",X"E0",X"E0", + X"10",X"10",X"10",X"19",X"0F",X"03",X"87",X"C7",X"E7",X"F7",X"F3",X"FA",X"E8",X"C4",X"C8",X"C0", + X"20",X"E0",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"23",X"03",X"03",X"16",X"1C",X"18", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"41",X"E2",X"E7",X"F7",X"7C",X"08", + X"00",X"00",X"00",X"00",X"60",X"40",X"C0",X"80",X"82",X"06",X"04",X"CC",X"E8",X"F8",X"D0",X"30", + X"00",X"00",X"01",X"01",X"03",X"03",X"03",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"C7",X"E3",X"F3",X"F3",X"F3",X"F3",X"F3",X"E7",X"FF",X"1F",X"0E",X"06",X"02",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"E0",X"E0",X"E0",X"31",X"1F",X"0F",X"0F",X"3F",X"7F", + X"1C",X"0C",X"80",X"80",X"C0",X"60",X"31",X"15",X"1F",X"0E",X"06",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"E0",X"FE",X"F0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"07",X"0E",X"0C",X"18",X"01",X"07",X"1C",X"70",X"E0",X"20",X"20",X"B0",X"B8",X"BC", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"1F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"17",X"07",X"04",X"00",X"00",X"00",X"00",X"00", + X"2C",X"3E",X"3E",X"3E",X"C7",X"E5",X"E5",X"C6",X"02",X"02",X"02",X"00",X"00",X"00",X"00",X"00", + X"02",X"02",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"40",X"60",X"20",X"00",X"00",X"00",X"00", + X"E7",X"E7",X"C7",X"C7",X"C3",X"83",X"83",X"83",X"81",X"C1",X"C1",X"01",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"C0",X"C0",X"C0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E8",X"F8",X"7C",X"7C",X"36", + X"03",X"06",X"0C",X"18",X"18",X"11",X"11",X"10",X"18",X"78",X"70",X"18",X"08",X"08",X"6C",X"F6", + X"00",X"00",X"00",X"00",X"00",X"80",X"A0",X"38",X"38",X"18",X"08",X"00",X"00",X"00",X"00",X"00", + X"3F",X"3F",X"3F",X"3F",X"3F",X"1F",X"03",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"E1",X"E1",X"E1",X"E0",X"F0",X"FC",X"F8",X"E0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"03",X"03",X"1F",X"3F", + X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"E0",X"E0",X"E0",X"E1", + X"FF",X"FF",X"FF",X"FF",X"3E",X"CE",X"CF",X"1E",X"FC",X"FC",X"FE",X"47",X"03",X"02",X"00",X"00", + X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"40",X"C0",X"C3",X"80",X"00",X"01",X"03",X"00",X"00",X"18",X"18",X"70",X"F9",X"FF",X"FF", + X"00",X"00",X"00",X"FC",X"FE",X"FE",X"CE",X"3C",X"70",X"00",X"00",X"00",X"00",X"C0",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"3F",X"7F",X"7F",X"7F",X"7F",X"3E",X"18",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"18",X"3E",X"7F",X"7F",X"7F",X"7F",X"3F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"C1",X"C1",X"C1",X"C1",X"C0",X"C0",X"E0",X"E0",X"E1",X"F7",X"FF",X"FF",X"1F",X"48",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"83",X"03",X"FF",X"FF",X"FC",X"08",X"00",X"00", + X"00",X"00",X"48",X"1F",X"FF",X"FF",X"F7",X"E1",X"E0",X"E0",X"C0",X"C0",X"C1",X"C1",X"C1",X"C1", + X"00",X"00",X"08",X"FC",X"FF",X"FF",X"03",X"83",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"87",X"87",X"87",X"87",X"87",X"CF",X"FF",X"FF",X"3F",X"F9",X"F8",X"FE",X"3E",X"8C",X"00",X"00", + X"80",X"80",X"80",X"80",X"80",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"03",X"00",X"00",X"01",X"03",X"03",X"03",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"40",X"00",X"00",X"00", + X"00",X"00",X"03",X"07",X"0F",X"00",X"00",X"00",X"60",X"20",X"20",X"20",X"20",X"60",X"60",X"60", + X"00",X"00",X"80",X"C0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FF",X"9F",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"F7",X"E1",X"F8",X"FE",X"3F",X"0F",X"03",X"00",X"00", + X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE", + X"C0",X"FC",X"FF",X"FF",X"F7",X"E3",X"C3",X"C1",X"81",X"81",X"03",X"03",X"07",X"07",X"07",X"0F", + X"FC",X"FC",X"F8",X"F8",X"F8",X"FC",X"7C",X"67",X"FF",X"FF",X"FF",X"3F",X"0F",X"07",X"03",X"00", + X"3C",X"3C",X"3C",X"78",X"78",X"78",X"F8",X"F0",X"F8",X"F0",X"20",X"20",X"C0",X"80",X"00",X"00", + X"C0",X"F8",X"FE",X"3F",X"0F",X"C7",X"F7",X"FE",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"FC",X"FC", + X"00",X"00",X"00",X"80",X"F8",X"FC",X"FC",X"70",X"F2",X"FE",X"FE",X"1E",X"1E",X"1F",X"1E",X"1C", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"03",X"07",X"07",X"03",X"03",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"DF",X"1F",X"10",X"10",X"00", + X"01",X"03",X"03",X"07",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"07",X"03",X"03", + X"FF",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"7F",X"7F",X"C7",X"80",X"80",X"00",X"00",X"80",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"06",X"07",X"07",X"03",X"03",X"03",X"01",X"01",X"01", + X"00",X"00",X"10",X"10",X"3F",X"FF",X"7F",X"7F",X"F0",X"E0",X"E0",X"E0",X"B0",X"BF",X"BF",X"FF", + X"F8",X"F8",X"F8",X"FC",X"7F",X"79",X"60",X"30",X"18",X"0F",X"07",X"03",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"DF",X"FF",X"3F",X"1E",X"FC",X"F1",X"FB",X"7F",X"7C",X"00",X"00", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"0F",X"1F",X"3F",X"7F",X"7F",X"FF",X"FE",X"F8", + X"04",X"0E",X"00",X"02",X"07",X"3F",X"FF",X"DF",X"FF",X"FF",X"FF",X"FF",X"FF",X"9F",X"0F",X"0F", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"EF",X"EF",X"66",X"F1",X"FF",X"FF",X"FE",X"60",X"00",X"00", + X"88",X"F8",X"F8",X"F8",X"F8",X"98",X"98",X"F8",X"F0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00", + X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FF", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"08",X"08",X"08",X"08",X"08",X"08", + X"00",X"3F",X"FF",X"6F",X"EF",X"E6",X"F1",X"FF",X"FF",X"FE",X"FE",X"FC",X"FC",X"FE",X"FE",X"FE", + X"38",X"FC",X"F8",X"F8",X"98",X"98",X"F8",X"F8",X"18",X"08",X"08",X"08",X"08",X"08",X"08",X"08", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"F0",X"F8",X"CE",X"47",X"61",X"3F",X"1F",X"0F",X"03",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"03",X"0F",X"3F",X"7F",X"FF",X"FF",X"FD",X"F0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FD",X"CC",X"1E",X"3F",X"CF",X"00", + X"87",X"80",X"80",X"80",X"C0",X"E0",X"F8",X"F8",X"F8",X"E8",X"E8",X"B0",X"70",X"E0",X"80",X"00", + X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"A8",X"78",X"C8",X"80",X"80",X"00",X"00",X"80",X"80",X"87",X"87",X"87",X"87",X"87",X"87",X"87", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C7",X"1F",X"0D", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"FC",X"F8",X"E8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0F",X"0F",X"04",X"06",X"03",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"0F",X"0F",X"0E",X"0E",X"0E",X"0E", + X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"DF",X"7F",X"3B",X"F7",X"E7",X"7F",X"00",X"00", + X"C3",X"C3",X"C3",X"C0",X"C0",X"C0",X"E0",X"F8",X"F8",X"E8",X"E8",X"F8",X"F0",X"E0",X"00",X"00", + X"00",X"00",X"00",X"19",X"07",X"1B",X"7F",X"FF",X"FF",X"FF",X"FF",X"9F",X"1F",X"1F",X"1F",X"1F", + X"00",X"00",X"18",X"FC",X"F8",X"E8",X"E8",X"F8",X"E0",X"C0",X"80",X"C0",X"C0",X"C3",X"C3",X"C3", + X"33",X"73",X"73",X"73",X"73",X"73",X"73",X"73",X"7B",X"7F",X"27",X"31",X"1F",X"07",X"00",X"00", + X"F0",X"F3",X"F3",X"F3",X"F3",X"F3",X"F0",X"FC",X"FC",X"F8",X"FC",X"FC",X"F8",X"F0",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"1F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"FC",X"F8",X"FC",X"F0", + X"00",X"00",X"01",X"03",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"03",X"01",X"00",X"00", + X"1C",X"7E",X"FC",X"3E",X"3C",X"38",X"39",X"39",X"39",X"39",X"38",X"3C",X"3E",X"FC",X"7E",X"1C", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"1C",X"7E",X"DE",X"9C",X"98",X"99",X"99",X"98",X"9C",X"DE",X"7E",X"1C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0E",X"1E",X"36",X"34",X"34",X"34",X"34",X"36",X"1E",X"06",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"06",X"0A",X"0A",X"0A",X"0A",X"06",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"80",X"80",X"C0",X"40",X"4C",X"4F",X"6F",X"6F",X"2F",X"2F",X"07",X"03", + X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"0C",X"0E",X"CF",X"FF",X"FF",X"FF",X"FF",X"FE", + X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"7F",X"E7",X"FF",X"FE",X"FC",X"00",X"00", + X"FE",X"FF",X"FF",X"FF",X"FF",X"CF",X"0E",X"0C",X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"08", + X"00",X"00",X"FC",X"FE",X"FF",X"E7",X"7F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F", + X"E0",X"E0",X"E0",X"FF",X"FF",X"FF",X"E0",X"60",X"60",X"7F",X"7F",X"7F",X"70",X"FE",X"FE",X"7F", + X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"80", + X"7F",X"FF",X"FF",X"7F",X"60",X"60",X"60",X"7F",X"7F",X"FF",X"E0",X"E0",X"E0",X"FF",X"FF",X"FF", + X"80",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"03", + X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FE", + X"03",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF", + X"FE",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"1C",X"3E",X"63",X"5D",X"5D",X"5D",X"5D",X"63",X"3E",X"1C",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"1C",X"3E",X"7F",X"7D",X"41",X"41",X"6D",X"7F",X"3E",X"1E",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"1C",X"3E",X"65",X"45",X"51",X"59",X"49",X"6D",X"3E",X"1C",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"1C",X"3E",X"6B",X"41",X"55",X"5D",X"49",X"6B",X"3E",X"1C",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"1C",X"3E",X"7B",X"41",X"41",X"4B",X"63",X"73",X"3E",X"1C",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"1C",X"3E",X"73",X"51",X"55",X"45",X"45",X"7F",X"3E",X"1C",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"1C",X"3E",X"7B",X"51",X"55",X"55",X"41",X"63",X"3E",X"1C",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"1E",X"3E",X"4F",X"47",X"51",X"59",X"5F",X"4F",X"3E",X"1C",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"1C",X"3E",X"6B",X"51",X"55",X"55",X"45",X"6B",X"3E",X"1C",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"1C",X"3E",X"63",X"41",X"55",X"55",X"45",X"6F",X"3E",X"1C",X"00",X"00",X"00", + X"07",X"0C",X"1B",X"1B",X"1B",X"0C",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"30",X"D8",X"D8",X"D8",X"30",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"0C",X"1E",X"1E",X"1E",X"0E",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"38",X"78",X"78",X"38",X"70",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"08",X"1E",X"18",X"19",X"0C",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"10",X"38",X"F8",X"98",X"30",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"0C",X"19",X"1C",X"19",X"0C",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"30",X"98",X"F8",X"98",X"30",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"0C",X"18",X"1C",X"1C",X"0C",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"F0",X"18",X"98",X"38",X"70",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"0C",X"19",X"18",X"1F",X"0C",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"30",X"F8",X"38",X"38",X"30",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"0C",X"19",X"1C",X"1F",X"0C",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"30",X"98",X"18",X"98",X"30",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"1E",X"1E",X"1C",X"19",X"08",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"70",X"78",X"F8",X"D8",X"10",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"0C",X"19",X"1C",X"1B",X"0C",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"30",X"D8",X"38",X"98",X"30",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"0C",X"19",X"18",X"19",X"0C",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"30",X"F8",X"38",X"98",X"30",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"14",X"5C",X"0F",X"1B",X"77",X"94",X"20",X"84",X"10",X"42",X"90",X"05",X"20",X"0A",X"00", + X"00",X"00",X"00",X"00",X"E0",X"00",X"00",X"00",X"00",X"80",X"12",X"40",X"08",X"21",X"00",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"20",X"05",X"90",X"42",X"10",X"84", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"00",X"21",X"08",X"40",X"12",X"80",X"00", + X"20",X"68",X"F0",X"90",X"18",X"98",X"F0",X"50",X"00",X"00",X"20",X"00",X"00",X"00",X"00",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"20",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"1F",X"3F",X"7F",X"7F",X"E0",X"E0",X"E0",X"F0",X"FF",X"7F",X"7F",X"3F", + X"00",X"00",X"00",X"00",X"F0",X"F8",X"F8",X"FC",X"3C",X"1C",X"1C",X"1C",X"F8",X"F8",X"F0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7F",X"FF",X"FF",X"7F",X"30",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FC",X"FC",X"FC",X"F8",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"1E",X"3F",X"7F",X"FF",X"E7",X"E3",X"E3",X"F1",X"F9",X"F8",X"78",X"30", + X"00",X"00",X"00",X"00",X"0C",X"1C",X"9C",X"9C",X"DC",X"DC",X"FC",X"FC",X"FC",X"FC",X"7C",X"18", + X"00",X"00",X"00",X"00",X"1C",X"3E",X"7F",X"FF",X"EF",X"E7",X"E7",X"F6",X"F8",X"F8",X"78",X"30", + X"00",X"00",X"00",X"00",X"70",X"F8",X"FC",X"FC",X"3C",X"1C",X"1C",X"1C",X"3C",X"78",X"70",X"60", + X"02",X"82",X"92",X"92",X"92",X"FE",X"FE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"F8",X"88",X"88",X"88",X"FE",X"FE",X"00",X"FE",X"FE",X"70",X"38",X"70",X"FE",X"FE",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"E0",X"F0",X"1E",X"1E",X"F0",X"E0",X"00",X"00",X"80",X"80",X"FE",X"FE",X"80",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0E",X"1F",X"1F",X"3F",X"3F",X"3F",X"3F",X"1F",X"3F",X"3F",X"3F",X"1F",X"07",X"07",X"03",X"01", + X"6C",X"7E",X"FE",X"FE",X"FC",X"FC",X"FE",X"FF",X"FF",X"FF",X"FE",X"FC",X"FC",X"FC",X"F8",X"B0", + X"E0",X"F8",X"FE",X"FF",X"FF",X"E7",X"40",X"00",X"40",X"E7",X"FF",X"FF",X"FE",X"F8",X"E0",X"40", + X"00",X"00",X"00",X"80",X"E0",X"F8",X"FE",X"3F",X"FE",X"F8",X"E0",X"80",X"00",X"00",X"00",X"00", + X"40",X"00",X"40",X"E7",X"FF",X"FF",X"FE",X"F8",X"E0",X"40",X"E0",X"FF",X"FF",X"FF",X"E0",X"40", + X"FE",X"3F",X"FE",X"F8",X"E0",X"80",X"00",X"00",X"00",X"02",X"07",X"FF",X"FF",X"FF",X"07",X"02", + X"00",X"00",X"01",X"07",X"1F",X"7F",X"FC",X"7F",X"1F",X"47",X"E1",X"F8",X"FE",X"FF",X"FF",X"E7", + X"1F",X"7F",X"FF",X"FF",X"F7",X"72",X"70",X"72",X"F7",X"FF",X"FF",X"7F",X"1F",X"87",X"E2",X"F8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"78",X"FF",X"FF",X"FF",X"78",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"0F",X"CF",X"0F",X"06",X"00",X"02",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"1F",X"1F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00", + X"18",X"38",X"38",X"10",X"30",X"EF",X"FE",X"FE",X"FE",X"FE",X"EF",X"30",X"10",X"38",X"38",X"18", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"1F",X"3F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00", + X"18",X"38",X"38",X"10",X"30",X"EF",X"FE",X"FE",X"FE",X"FE",X"EF",X"30",X"10",X"38",X"38",X"18", + X"00",X"00",X"00",X"18",X"3C",X"7E",X"FE",X"FE",X"FE",X"FE",X"7E",X"3C",X"18",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"7C",X"7F",X"7F",X"7F",X"7F",X"7C",X"00",X"00",X"00",X"00",X"00", + X"0D",X"1F",X"1F",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"EE",X"FE",X"FE",X"FE",X"7E",X"7F",X"7F",X"73",X"30",X"00",X"00",X"00",X"00",X"00",X"00", + X"7C",X"FC",X"FE",X"FE",X"7E",X"3E",X"FC",X"FC",X"18",X"01",X"03",X"3F",X"70",X"70",X"E0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"7E",X"FF",X"FF",X"FF",X"FD",X"FC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F7",X"41",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"07",X"07",X"03",X"09",X"03",X"06", + X"00",X"00",X"00",X"00",X"00",X"06",X"0E",X"2E",X"7C",X"78",X"F8",X"F7",X"FF",X"FF",X"FF",X"FF", + X"FE",X"8C",X"00",X"00",X"81",X"07",X"1F",X"3F",X"7B",X"38",X"70",X"60",X"00",X"00",X"00",X"00", + X"00",X"00",X"E0",X"FE",X"FE",X"FF",X"FF",X"FB",X"FD",X"3C",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"7E",X"7E",X"7F",X"3F",X"9F",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"17",X"07",X"03",X"01",X"03",X"06", + X"00",X"00",X"00",X"00",X"00",X"06",X"0E",X"2E",X"7C",X"78",X"F8",X"F7",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"1F",X"3F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00", + X"18",X"38",X"38",X"10",X"30",X"ED",X"FB",X"FB",X"FB",X"FB",X"ED",X"30",X"10",X"38",X"38",X"18", + X"00",X"00",X"00",X"30",X"78",X"FC",X"FC",X"FC",X"FC",X"FC",X"FC",X"78",X"30",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"7C",X"7F",X"7F",X"7F",X"7F",X"7C",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0F",X"0F",X"1F",X"5F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00", + X"18",X"38",X"38",X"10",X"30",X"ED",X"FB",X"FB",X"FB",X"FB",X"ED",X"30",X"10",X"38",X"38",X"18", + X"00",X"00",X"00",X"30",X"7C",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"7C",X"30",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"7C",X"7F",X"7F",X"7F",X"7F",X"7C",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"0F",X"1F",X"1F",X"0F",X"01",X"07",X"0C",X"00", + X"00",X"18",X"39",X"3B",X"33",X"A3",X"E1",X"EC",X"FF",X"FF",X"FF",X"FF",X"FF",X"3E",X"38",X"18", + X"00",X"00",X"F0",X"FC",X"FE",X"FE",X"FE",X"FE",X"FE",X"FC",X"D8",X"80",X"00",X"01",X"0F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1E",X"7F",X"7F",X"7F",X"F9",X"F0",X"FC",X"FC", + X"38",X"70",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"13",X"06",X"0C",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"D8",X"CE",X"47",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"0D",X"1F",X"1F",X"4F", + X"00",X"00",X"00",X"00",X"00",X"19",X"3B",X"3F",X"B3",X"E1",X"E4",X"EF",X"FF",X"FF",X"FF",X"F9", + X"00",X"00",X"01",X"07",X"3F",X"3F",X"78",X"38",X"70",X"60",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"FB",X"F1",X"C0",X"FC",X"FC",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"F0",X"F8",X"FC",X"FE",X"FE",X"FE",X"FE",X"DC",X"8C",X"88",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7E",X"7E",X"7F", + X"03",X"26",X"0C",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"D8",X"CE",X"47",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"0D",X"1F",X"3F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"19",X"3B",X"3B",X"B3",X"E1",X"E4",X"EF",X"FF",X"FF",X"FF",X"F9", + X"00",X"00",X"01",X"07",X"3F",X"3F",X"78",X"38",X"70",X"60",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"FB",X"F1",X"C0",X"FC",X"FC",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"F0",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"DE",X"8E",X"8C",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7E",X"7E",X"7F", + X"00",X"00",X"00",X"07",X"07",X"0F",X"1F",X"07",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"11",X"31",X"FD",X"FF",X"FF",X"FF",X"FF",X"FD",X"31",X"11",X"30",X"30",X"10",X"00",X"00", + X"00",X"00",X"E0",X"F0",X"F8",X"F8",X"F8",X"F8",X"F0",X"E0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"FC",X"FF",X"FF",X"FF",X"FF",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"38", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0F",X"0F",X"1F",X"5F",X"0F",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"38",X"12",X"33",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"33",X"12",X"38",X"38",X"18",X"00",X"00", + X"00",X"00",X"C0",X"E0",X"F0",X"F0",X"F0",X"F0",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"FC",X"FF",X"FF",X"FF",X"FF",X"FC",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"38", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"0F",X"1F",X"1F",X"0F",X"01",X"07",X"0C",X"00",X"00",X"00",X"00", + X"3F",X"3F",X"BF",X"FF",X"DF",X"CF",X"FF",X"FE",X"FC",X"DE",X"7E",X"38",X"18",X"00",X"00",X"00", + X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F1",X"61",X"43",X"07",X"1F",X"3F",X"1C",X"38",X"30",X"00", + X"00",X"00",X"00",X"00",X"3E",X"FF",X"FF",X"FF",X"F9",X"F0",X"FC",X"FC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"3B", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"07",X"0F",X"0F",X"17",X"01",X"01",X"03",X"06",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"DF",X"CF",X"FF",X"F6",X"E4",X"E2",X"61",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"E0",X"70",X"61",X"01",X"03",X"04",X"1F",X"1F",X"3C",X"1C",X"38",X"30", + X"00",X"00",X"1E",X"FE",X"FF",X"FF",X"FB",X"C1",X"40",X"7C",X"FC",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"3B",X"3F",X"BF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"E0",X"F0", + X"01",X"01",X"01",X"01",X"0F",X"1F",X"1F",X"0F",X"41",X"03",X"06",X"0C",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"DF",X"CF",X"FF",X"FF",X"FE",X"99",X"C0",X"C0",X"40",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F8",X"F0",X"30",X"21",X"01",X"03",X"04",X"1F",X"1F",X"3C",X"1C",X"38",X"30", + X"00",X"00",X"1E",X"FF",X"FF",X"FF",X"F9",X"C0",X"40",X"7C",X"FC",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"39",X"3D",X"BF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"F0",X"F8", + X"00",X"00",X"00",X"00",X"0C",X"1F",X"1F",X"0F",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"1C",X"14",X"10",X"BB",X"FF",X"FE",X"FE",X"DE",X"CE",X"60",X"20",X"70",X"70",X"30",X"00", + X"00",X"00",X"00",X"18",X"3C",X"7E",X"FE",X"FE",X"FE",X"FE",X"7E",X"3C",X"18",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"7C",X"7E",X"7F",X"7F",X"7F",X"7D",X"FC",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"5B",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"0F",X"2F",X"07",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0C",X"1C",X"3C",X"78",X"78",X"F8",X"F7",X"EF",X"3F",X"FF",X"FF", + X"FE",X"CC",X"80",X"00",X"01",X"07",X"1F",X"1F",X"7B",X"38",X"70",X"60",X"00",X"00",X"00",X"00", + X"00",X"00",X"E0",X"FE",X"FE",X"FF",X"FF",X"FB",X"FD",X"3C",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"3C",X"7E",X"7E",X"7F",X"3F",X"9F",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1D",X"1C",X"0C",X"04",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"1F",X"07",X"03",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"18",X"1C",X"1C",X"1D", + X"7F",X"7F",X"6F",X"6F",X"6D",X"6D",X"2F",X"4F",X"67",X"73",X"73",X"37",X"5F",X"7F",X"7F",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"47",X"63",X"70",X"78",X"3C",X"1C",X"6E",X"77",X"7F",X"7F",X"1F",X"43",X"60",X"78",X"7C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"78",X"7C",X"7E",X"3F",X"1F",X"47",X"63",X"78",X"7C",X"7D",X"7D",X"6D",X"6D",X"7D",X"7D",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"6F",X"6D",X"6D",X"6F",X"6F",X"6F",X"6F",X"7D",X"7D",X"3D",X"5D",X"65",X"71",X"70",X"30",X"58", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"0C",X"0F",X"4F",X"6F",X"7F",X"7D",X"7D",X"7F",X"6F",X"6F",X"7F",X"7D",X"3F",X"1F",X"4F", + X"F0",X"90",X"80",X"80",X"E0",X"F0",X"F0",X"F0",X"F0",X"90",X"80",X"80",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"98",X"9E",X"9F",X"9F",X"8F",X"97",X"91",X"80",X"80",X"80",X"80",X"80",X"C0",X"F0",X"F0", + X"1F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F",X"1F",X"07",X"03",X"00",X"00",X"00", + X"9F",X"9F",X"8F",X"87",X"01",X"00",X"10",X"18",X"1E",X"9F",X"9F",X"8F",X"87",X"01",X"00",X"00", + X"E3",X"E3",X"E3",X"E3",X"E3",X"E3",X"23",X"03",X"03",X"03",X"C0",X"E0",X"F8",X"FD",X"FF",X"3F", + X"00",X"00",X"00",X"90",X"98",X"9C",X"9C",X"9C",X"1C",X"1C",X"9C",X"9C",X"9C",X"9C",X"9C",X"9E", + X"FF",X"7F",X"3F",X"1F",X"0F",X"07",X"03",X"C1",X"E0",X"F8",X"FC",X"FF",X"FF",X"FF",X"E7",X"E3", + X"E0",X"F0",X"F3",X"F3",X"B3",X"BB",X"BF",X"BF",X"9F",X"9F",X"9F",X"9F",X"8F",X"87",X"03",X"01", + X"00",X"00",X"00",X"F0",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"80",X"A0",X"B0",X"B0",X"B0",X"B0",X"B0",X"F0",X"F0",X"F0",X"F0",X"90",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"90",X"80",X"80",X"80",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"A0",X"80",X"80",X"40",X"D0",X"D0",X"D0",X"D0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"B0",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"F0",X"F0",X"80",X"80",X"80",X"80",X"C0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"39",X"38",X"38",X"38",X"18",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E7",X"F7",X"F7",X"7F",X"3F",X"3F",X"1F",X"0F",X"0F",X"07",X"03",X"03",X"01",X"00",X"00",X"00", + X"00",X"0C",X"0E",X"0E",X"2E",X"32",X"30",X"38",X"3C",X"3C",X"3E",X"3F",X"3F",X"3F",X"3B",X"3B", + X"FB",X"7F",X"3F",X"8F",X"C7",X"F1",X"F8",X"7E",X"3F",X"0F",X"07",X"01",X"06",X"87",X"C7",X"C7", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"CF",X"C7",X"F3",X"FB",X"7F",X"3F",X"8F",X"C7",X"F1",X"F8",X"FE",X"FF",X"CF",X"C7",X"F3", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"E0",X"F0",X"78",X"38",X"1C",X"EE",X"FF",X"FF",X"FF",X"0F",X"80",X"C0",X"F0",X"F8",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E6",X"E7",X"E7",X"E3",X"E0",X"E0",X"E0",X"60",X"60",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"06",X"06",X"06",X"C6",X"E6",X"F6",X"F6",X"36",X"1E",X"0E",X"0E",X"0E",X"06",X"06",X"26",X"E6", + X"FF",X"7F",X"3F",X"0F",X"07",X"01",X"00",X"00",X"40",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"0E",X"06",X"06",X"06",X"06",X"06",X"06",X"C6",X"E6",X"F6",X"F6",X"36",X"16",X"06",X"06",X"06", + X"03",X"03",X"03",X"83",X"C3",X"F1",X"F8",X"FE",X"FF",X"FF",X"EF",X"E7",X"E7",X"E7",X"F7",X"FF", + X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"86",X"C6",X"E6",X"F6",X"78",X"3C",X"1C",X"0E", + X"C3",X"C3",X"C3",X"C3",X"43",X"03",X"03",X"03",X"03",X"01",X"00",X"02",X"03",X"03",X"03",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"06",X"06",X"06",X"06", + X"00",X"00",X"00",X"02",X"03",X"03",X"03",X"03",X"03",X"83",X"C3",X"C3",X"C3",X"C1",X"C0",X"C2", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"3F",X"FF",X"FF",X"FF",X"FF",X"FC",X"3C",X"1C",X"04",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"7C",X"7C",X"6C",X"6C",X"7C",X"7C",X"3C",X"18",X"00",X"60",X"FC",X"FC",X"FC",X"FC",X"9C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"F7",X"E3",X"FB",X"FD",X"7D",X"3F",X"DF",X"EF",X"FF",X"FC",X"3C",X"1F",X"C7",X"E3",X"F8", + X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"80",X"80",X"80", + X"40",X"60",X"78",X"7C",X"7D",X"FD",X"ED",X"ED",X"FD",X"7D",X"7F",X"FF",X"EF",X"FF",X"FC",X"7C", + X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_bit2.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_bit2.vhd new file mode 100644 index 00000000..bc771f52 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_bit2.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity travusa_spr_bit2 is +port ( + clk : in std_logic; + addr : in std_logic_vector(12 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of travusa_spr_bit2 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"3C",X"3F",X"3F",X"3F",X"1F",X"07",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"1F",X"3F",X"3F",X"3F",X"3C",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"41",X"41",X"41",X"41",X"40",X"40",X"60",X"20",X"21",X"17",X"FE",X"FF",X"FF",X"E8",X"E0",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"83",X"03",X"07",X"FF",X"FF",X"0F",X"07",X"00", + X"00",X"E0",X"E8",X"FF",X"FF",X"FE",X"17",X"21",X"20",X"60",X"40",X"40",X"41",X"41",X"41",X"41", + X"00",X"07",X"0F",X"FF",X"FF",X"07",X"03",X"83",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"83",X"83",X"83",X"83",X"83",X"C7",X"F7",X"FF",X"1F",X"3F",X"FE",X"FE",X"FE",X"EC",X"E0",X"00", + X"80",X"80",X"80",X"80",X"80",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00", + X"03",X"01",X"13",X"19",X"78",X"D0",X"08",X"1B",X"77",X"C5",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"FF",X"FF",X"FF",X"3F",X"3F",X"7E",X"FC",X"FC",X"D8",X"80",X"00",X"00",X"3F",X"07",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"02",X"82",X"80",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"04",X"04",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"1C",X"38",X"BC",X"7E",X"3E",X"BE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"00", + X"03",X"01",X"13",X"19",X"78",X"D0",X"08",X"1B",X"77",X"C5",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"FF",X"FF",X"FF",X"77",X"3F",X"7E",X"FC",X"F8",X"F0",X"80",X"00",X"00",X"3F",X"07",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"02",X"02",X"82",X"80",X"F0",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"04",X"04",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"38",X"70",X"F8",X"7C",X"3E",X"BE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"06",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"37",X"FF",X"38",X"31",X"33",X"63",X"C7",X"0D",X"0E",X"08",X"01",X"01",X"02",X"00",X"00", + X"E0",X"F0",X"F0",X"F8",X"F8",X"F0",X"E0",X"80",X"00",X"01",X"01",X"21",X"C1",X"F0",X"3C",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"3F",X"47",X"43",X"7B",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"80",X"80",X"80",X"C0",X"C0",X"E0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"06",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"37",X"FF",X"38",X"31",X"33",X"63",X"C7",X"0D",X"0E",X"08",X"01",X"01",X"00",X"01",X"00", + X"E0",X"F0",X"F0",X"F0",X"F0",X"E0",X"C0",X"80",X"00",X"01",X"01",X"21",X"C1",X"F0",X"3C",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"0F",X"3F",X"47",X"43",X"7B",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"00",X"00",X"00",X"80",X"80",X"C0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"12",X"00",X"33",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"61",X"33",X"00",X"12",X"00", + X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00", + X"00",X"2D",X"00",X"4C",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"9E",X"4C",X"00",X"2D",X"00", + X"00",X"00",X"00",X"80",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"80",X"00",X"00",X"00", + X"01",X"00",X"00",X"00",X"03",X"03",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"01",X"00",X"00", + X"80",X"40",X"30",X"08",X"18",X"F8",X"B8",X"18",X"18",X"18",X"18",X"30",X"70",X"B0",X"20",X"00", + X"00",X"00",X"01",X"00",X"03",X"03",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"01",X"00",X"00", + X"30",X"40",X"80",X"08",X"18",X"F8",X"B8",X"18",X"18",X"18",X"18",X"30",X"70",X"B0",X"20",X"00", + X"1F",X"FF",X"FF",X"7F",X"0F",X"0F",X"0F",X"07",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"FC",X"FC",X"7C",X"3E",X"8E",X"CE",X"E7",X"E0",X"C0",X"00",X"00",X"00",X"00",X"00", + X"0E",X"0E",X"0E",X"01",X"19",X"98",X"80",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"80",X"98",X"19",X"01",X"0E",X"0E",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00", + X"0E",X"0E",X"0E",X"01",X"19",X"98",X"80",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"80",X"98",X"19",X"01",X"0E",X"0E",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00", + X"0F",X"03",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"CF",X"CF",X"DF",X"FE",X"FC",X"FA",X"7F",X"3F",X"07",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"0B",X"1F",X"1F",X"0F",X"03",X"13", + X"00",X"00",X"00",X"00",X"70",X"F9",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"F7",X"EF", + X"81",X"01",X"03",X"03",X"01",X"0C",X"0E",X"87",X"82",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"E0",X"C0",X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0C",X"3E",X"DE",X"FD",X"FB",X"FB",X"F6",X"C0",X"80",X"80",X"00",X"00",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"60",X"00",X"80",X"C0", + X"81",X"01",X"03",X"03",X"01",X"0C",X"0E",X"87",X"82",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"E0",X"C0",X"C0",X"80",X"80",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"1F",X"0F",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"E7",X"FB",X"FD",X"7C",X"78",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"C0",X"C0",X"E1",X"9B",X"3C",X"24",X"24",X"24",X"24",X"3C",X"9B",X"E1",X"C0",X"C0",X"00", + X"00",X"40",X"80",X"80",X"C0",X"70",X"00",X"00",X"00",X"00",X"70",X"C0",X"80",X"80",X"40",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"70",X"76",X"6F",X"FE",X"FD",X"FD",X"FD",X"FD",X"FE",X"6F",X"76",X"70",X"00",X"00", + X"00",X"00",X"00",X"00",X"20",X"F0",X"D8",X"40",X"40",X"D8",X"F0",X"20",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"03",X"0E",X"0F",X"1F",X"3F",X"3F",X"1F",X"0F",X"0E",X"03",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"90",X"B0",X"A0",X"40",X"40",X"A0",X"B0",X"90",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"03",X"07",X"0F",X"0F",X"03",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"C0",X"B0",X"EC",X"F4",X"E0",X"F4",X"EC",X"B0",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"08",X"1E",X"3C",X"1E",X"08",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"07",X"07",X"07",X"0F",X"3F",X"7F",X"7F",X"7F",X"7F",X"3F",X"0F",X"07",X"07",X"07",X"01", + X"80",X"D0",X"B0",X"78",X"F6",X"EE",X"E8",X"E8",X"E9",X"EF",X"F6",X"F8",X"70",X"B0",X"C0",X"80", + X"00",X"00",X"20",X"60",X"F0",X"10",X"00",X"00",X"00",X"30",X"F0",X"60",X"20",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"00",X"00",X"00", + X"1F",X"17",X"07",X"03",X"00",X"00",X"00",X"00",X"81",X"86",X"20",X"E0",X"01",X"17",X"1F",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"07",X"0F",X"0F",X"0F", + X"FF",X"FF",X"FF",X"BF",X"3F",X"3E",X"3E",X"7E",X"78",X"38",X"70",X"E0",X"C0",X"80",X"00",X"00", + X"60",X"40",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"38",X"38",X"B8",X"F8",X"FC",X"FE",X"FE",X"FF", + X"00",X"00",X"00",X"00",X"00",X"40",X"E0",X"60",X"40",X"00",X"40",X"40",X"80",X"00",X"10",X"30", + X"0C",X"06",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"82",X"82",X"02",X"83",X"01",X"00",X"00",X"00",X"A0",X"F9",X"7F",X"0F",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"05",X"01", + X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"FF",X"FF",X"FE",X"FC",X"FB",X"60",X"00",X"00", + X"C0",X"80",X"00",X"00",X"06",X"0C",X"0C",X"06",X"20",X"40",X"00",X"40",X"F0",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"FC",X"FD",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0", + X"00",X"A0",X"E4",X"64",X"62",X"70",X"38",X"1F",X"0F",X"07",X"03",X"03",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"20",X"30",X"10",X"10",X"1C",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FE",X"FC",X"F8",X"70",X"00",X"66",X"30",X"18",X"0C",X"04",X"00",X"00",X"00",X"00", + X"E0",X"C0",X"00",X"00",X"00",X"00",X"00",X"20",X"70",X"D0",X"40",X"40",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"30",X"18",X"3C",X"0E",X"3F",X"7F",X"7F",X"7F",X"7F",X"7F",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"00",X"C0",X"E0", + X"3F",X"3F",X"3F",X"3F",X"3F",X"2F",X"20",X"30",X"34",X"22",X"20",X"01",X"01",X"03",X"02",X"00", + X"FC",X"FC",X"F0",X"E0",X"F0",X"F8",X"38",X"10",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"00", + X"00",X"00",X"18",X"30",X"38",X"30",X"30",X"72",X"62",X"64",X"70",X"70",X"78",X"78",X"7C",X"7C", + X"40",X"C0",X"00",X"00",X"00",X"00",X"00",X"0C",X"06",X"0E",X"76",X"FE",X"FE",X"FE",X"FE",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"20",X"60",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"02",X"03",X"07",X"03",X"31",X"78",X"78",X"78",X"7E",X"7F",X"7F",X"3F",X"03",X"01", + X"FF",X"7F",X"7F",X"3F",X"0F",X"00",X"00",X"00",X"00",X"00",X"06",X"0F",X"0F",X"09",X"00",X"00", + X"F8",X"D8",X"D8",X"98",X"38",X"30",X"30",X"30",X"30",X"30",X"30",X"00",X"00",X"00",X"00",X"00", + X"CF",X"CF",X"CF",X"86",X"81",X"9C",X"B8",X"F8",X"F8",X"F8",X"FC",X"FD",X"FF",X"FF",X"FF",X"FF", + X"20",X"60",X"40",X"C0",X"80",X"00",X"00",X"50",X"78",X"7C",X"FC",X"FC",X"FC",X"E8",X"E0",X"F8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"41",X"E2",X"C6",X"C6",X"E4",X"C6", + X"00",X"00",X"00",X"00",X"60",X"40",X"C0",X"80",X"82",X"06",X"04",X"0C",X"08",X"18",X"10",X"30", + X"01",X"00",X"01",X"01",X"03",X"03",X"03",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"F7",X"FF",X"C7",X"C3",X"C3",X"E3",X"E3",X"E3",X"C3",X"C7",X"FF",X"1F",X"0F",X"07",X"03",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"00",X"01",X"03",X"07",X"07",X"C7",X"E7",X"A7",X"87",X"C7",X"87",X"C3",X"80",X"E3",X"F7",X"F7", + X"40",X"10",X"7E",X"7E",X"3F",X"1F",X"0E",X"06",X"1E",X"0E",X"16",X"DC",X"DC",X"EC",X"FC",X"78", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"C0",X"E0",X"F0",X"F0",X"60",X"81",X"C7",X"DC",X"F0",X"C0",X"C0",X"C0",X"40",X"C0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"1F",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"17",X"07",X"07",X"03",X"03",X"03",X"01",X"01", + X"CF",X"C5",X"C6",X"DA",X"C3",X"E1",X"61",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"E0",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"40",X"60",X"20",X"00",X"00",X"00",X"00", + X"FB",X"FB",X"FB",X"F9",X"FD",X"FD",X"FC",X"FC",X"FE",X"FE",X"FE",X"9E",X"9D",X"8E",X"CE",X"C7", + X"80",X"80",X"80",X"C0",X"C0",X"C0",X"E0",X"E0",X"60",X"60",X"60",X"60",X"40",X"80",X"80",X"C0", + X"00",X"00",X"00",X"00",X"08",X"10",X"10",X"10",X"10",X"00",X"00",X"00",X"00",X"30",X"70",X"FA", + X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"38",X"38",X"18",X"08",X"00",X"00",X"00",X"00",X"00", + X"3F",X"3F",X"3F",X"3F",X"3F",X"1F",X"03",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"ED",X"C7",X"03",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"03",X"03",X"1F",X"3F", + X"00",X"00",X"00",X"01",X"0F",X"1F",X"3F",X"7F",X"FF",X"FF",X"DF",X"FF",X"FF",X"FF",X"FF",X"FE", + X"64",X"4C",X"48",X"78",X"B0",X"08",X"0F",X"86",X"04",X"00",X"00",X"80",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"C0",X"BF",X"6F",X"F6",X"D4",X"E0",X"F0",X"E0",X"E0",X"80",X"19",X"3F",X"27", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"3C",X"3F",X"3F",X"3F",X"1B",X"03",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"1B",X"3F",X"3F",X"3F",X"3C",X"20",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"41",X"41",X"41",X"41",X"40",X"40",X"60",X"20",X"21",X"17",X"FE",X"FF",X"FF",X"F8",X"F0",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"83",X"03",X"07",X"FF",X"FF",X"0B",X"03",X"00", + X"00",X"F0",X"F8",X"FF",X"FF",X"FE",X"17",X"21",X"20",X"60",X"40",X"40",X"41",X"41",X"41",X"41", + X"00",X"03",X"0B",X"FF",X"FF",X"07",X"03",X"83",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"83",X"83",X"83",X"83",X"83",X"C7",X"F7",X"FF",X"1F",X"3F",X"FE",X"FE",X"FE",X"FC",X"F0",X"00", + X"80",X"80",X"80",X"80",X"80",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"C0",X"C0",X"C0",X"C0",X"40",X"00",X"00",X"00", + X"00",X"00",X"03",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"B0",X"FC",X"FF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"02",X"02",X"02",X"82",X"E2",X"FA",X"FF",X"FF",X"FF",X"3F",X"0D",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"0F",X"0F",X"1F",X"F7",X"E1",X"C0",X"F8",X"3E",X"0F",X"03",X"01",X"01", + X"3F",X"3F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"03",X"02",X"02", + X"F8",X"FC",X"7F",X"1F",X"37",X"62",X"43",X"C1",X"81",X"81",X"01",X"01",X"05",X"05",X"05",X"0D", + X"FC",X"FC",X"F8",X"F8",X"F8",X"FC",X"7C",X"66",X"C3",X"FF",X"FF",X"FF",X"FF",X"7F",X"1B",X"00", + X"1C",X"1C",X"1C",X"38",X"38",X"38",X"78",X"F0",X"E0",X"F0",X"20",X"20",X"C0",X"80",X"C0",X"C0", + X"C3",X"FB",X"3F",X"0F",X"07",X"C7",X"F6",X"FE",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"FC",X"FC", + X"00",X"C0",X"F0",X"F0",X"F8",X"FC",X"7C",X"3C",X"BE",X"FE",X"FE",X"0E",X"0E",X"0C",X"0E",X"0C", + X"0E",X"0E",X"0E",X"0E",X"0D",X"0D",X"0D",X"03",X"07",X"07",X"03",X"02",X"00",X"00",X"00",X"00", + X"9F",X"80",X"80",X"80",X"80",X"80",X"C0",X"C0",X"80",X"80",X"C0",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0E",X"06",X"02",X"02",X"02",X"02",X"02",X"02",X"03",X"03",X"03",X"07",X"0F",X"0F", + X"FF",X"3F",X"3F",X"3F",X"3F",X"3F",X"3F",X"7F",X"7F",X"C7",X"80",X"80",X"00",X"00",X"80",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"07",X"07",X"0F",X"0F",X"0F",X"0F",X"0F",X"0F", + X"00",X"00",X"00",X"00",X"2F",X"FF",X"FF",X"F0",X"C0",X"E0",X"E0",X"A0",X"30",X"3F",X"3F",X"FF", + X"F8",X"F8",X"F8",X"FC",X"7F",X"79",X"60",X"30",X"18",X"0F",X"07",X"03",X"00",X"00",X"00",X"00", + X"04",X"04",X"04",X"0C",X"08",X"DF",X"FF",X"3F",X"1B",X"F3",X"F1",X"FB",X"7F",X"7F",X"3F",X"00", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8", + X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04",X"04", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"0F",X"1C",X"38",X"78",X"78",X"F8",X"F8",X"F8", + X"00",X"00",X"03",X"03",X"07",X"3F",X"FF",X"FF",X"08",X"0C",X"04",X"04",X"04",X"04",X"04",X"04", + X"01",X"01",X"07",X"3F",X"F7",X"EF",X"EF",X"EF",X"E6",X"F1",X"FF",X"FF",X"FF",X"FF",X"BF",X"00", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"E0",X"C0",X"F8",X"F8",X"F8",X"F0",X"00", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03", + X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F7",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"37",X"EF",X"EF",X"EF",X"E6",X"F1",X"FF",X"07",X"00",X"00",X"00",X"01",X"03",X"03",X"03", + X"00",X"E0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"10",X"00",X"70",X"F0",X"F0",X"F0",X"F0",X"F0", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"F0",X"F8",X"CE",X"47",X"61",X"3F",X"1F",X"0F",X"03",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"03",X"0E",X"38",X"70",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0",X"E0", + X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"C3",X"8E",X"FD",X"FD",X"3C",X"7E",X"3F",X"FF",X"F7", + X"FF",X"F8",X"F8",X"F8",X"F8",X"78",X"78",X"F8",X"F8",X"F8",X"F8",X"B0",X"70",X"E0",X"F8",X"F0", + X"FC",X"8E",X"C3",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40",X"40", + X"B8",X"78",X"C8",X"00",X"18",X"38",X"78",X"F8",X"F8",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"7D",X"3D", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0F",X"0F",X"04",X"06",X"03",X"01",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"06",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E", + X"08",X"08",X"08",X"08",X"08",X"08",X"08",X"09",X"D7",X"7F",X"3F",X"E7",X"E7",X"7F",X"3D",X"00", + X"7B",X"7B",X"7B",X"78",X"78",X"78",X"38",X"F8",X"F8",X"F8",X"F8",X"F8",X"F0",X"E0",X"F8",X"00", + X"00",X"00",X"00",X"01",X"07",X"1F",X"7F",X"D7",X"09",X"08",X"08",X"08",X"08",X"08",X"08",X"08", + X"00",X"00",X"00",X"F0",X"F8",X"F8",X"F8",X"F8",X"E0",X"18",X"38",X"78",X"78",X"7B",X"7B",X"7B", + X"31",X"71",X"71",X"71",X"71",X"71",X"71",X"71",X"79",X"7C",X"27",X"31",X"1F",X"07",X"03",X"00", + X"1C",X"1F",X"1F",X"1F",X"1F",X"1F",X"1C",X"0C",X"3C",X"FC",X"FC",X"FC",X"F8",X"F0",X"BC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"0C",X"19",X"31", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"FC",X"FC",X"3C",X"00", + X"00",X"00",X"01",X"03",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"06",X"03",X"01",X"00",X"00", + X"1C",X"7E",X"FE",X"0E",X"02",X"06",X"07",X"07",X"07",X"07",X"06",X"02",X"0E",X"FE",X"7E",X"1C", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"1C",X"7E",X"CE",X"82",X"86",X"87",X"87",X"86",X"82",X"CE",X"7E",X"1C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0E",X"1E",X"36",X"36",X"36",X"36",X"36",X"36",X"1E",X"06",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"06",X"0A",X"0A",X"0A",X"0A",X"06",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"C0",X"E0",X"A0",X"A0",X"B0",X"D0",X"40",X"4C",X"5F",X"7D",X"7C",X"3D",X"2F",X"07",X"03", + X"00",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"03",X"C0",X"F8",X"FF",X"FF",X"FF",X"FE", + X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"80",X"18",X"7C",X"00",X"00",X"00",X"00", + X"FE",X"FF",X"FF",X"FF",X"F8",X"C0",X"03",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"00",X"00",X"00",X"00",X"7C",X"18",X"80",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"FF",X"FF",X"FF",X"E0",X"E0",X"E0",X"FF",X"7F",X"7F",X"60",X"60",X"60",X"7F",X"FF",X"FF",X"7F", + X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"80", + X"7F",X"FE",X"FE",X"70",X"7F",X"7F",X"7F",X"60",X"60",X"E0",X"FF",X"FF",X"FF",X"E0",X"E0",X"E0", + X"80",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"03", + X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"FE", + X"03",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00", + X"FE",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00",X"FF",X"FF",X"FF",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"1C",X"22",X"22",X"22",X"22",X"1C",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"3E",X"3E",X"12",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"1A",X"3A",X"2E",X"26",X"36",X"12",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"14",X"3E",X"2A",X"22",X"36",X"14",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"04",X"3E",X"3E",X"34",X"1C",X"0C",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0C",X"2E",X"2A",X"3A",X"3A",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"04",X"2E",X"2A",X"2A",X"3E",X"1C",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"30",X"38",X"2E",X"26",X"20",X"30",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"14",X"2E",X"2A",X"2A",X"3A",X"14",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"1C",X"3E",X"2A",X"2A",X"3A",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"04",X"04",X"04",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"C0",X"20",X"20",X"20",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"C0",X"80",X"80",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"01",X"07",X"06",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"E0",X"C0",X"00",X"60",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"06",X"03",X"06",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"C0",X"60",X"00",X"60",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"07",X"03",X"03",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"E0",X"60",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"06",X"07",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"C0",X"00",X"C0",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"06",X"03",X"00",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"C0",X"60",X"E0",X"60",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"01",X"03",X"06",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"80",X"00",X"20",X"E0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"06",X"03",X"04",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"C0",X"20",X"C0",X"60",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"03",X"06",X"07",X"06",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"C0",X"00",X"C0",X"60",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"1C",X"00",X"02",X"02",X"02",X"3C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"2A",X"2A",X"12",X"00",X"1C",X"22", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"1C",X"00",X"2A",X"2A",X"3E",X"00",X"30",X"0C",X"02",X"0C",X"30",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"04",X"2A",X"2A",X"12",X"00",X"1E",X"24",X"24",X"1E",X"00",X"2E",X"2A", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"12",X"00",X"3C",X"02",X"02",X"3C",X"00",X"1C",X"22",X"22",X"1C",X"00",X"3E",X"08",X"08",X"3E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3E",X"08",X"10",X"3E",X"00",X"1C",X"22",X"22",X"1C",X"00",X"20",X"3E",X"20",X"04",X"2A",X"2A", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"22",X"22",X"1C",X"00",X"3E",X"00",X"3E",X"08",X"08",X"3E",X"00",X"22",X"22",X"1C",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"1C",X"22",X"22",X"1C",X"00",X"2E",X"2A",X"22",X"1C",X"00",X"1E",X"24",X"24",X"1E",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"02",X"00",X"3E",X"08",X"10",X"3E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"30",X"08",X"0E",X"08",X"30",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"14",X"5C",X"0F",X"1B",X"77",X"94",X"20",X"84",X"10",X"42",X"90",X"05",X"20",X"0A",X"00", + X"00",X"00",X"00",X"00",X"E0",X"00",X"00",X"00",X"00",X"80",X"12",X"40",X"08",X"21",X"00",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"20",X"05",X"90",X"42",X"10",X"84", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"00",X"21",X"08",X"40",X"12",X"80",X"00", + X"20",X"68",X"F0",X"90",X"18",X"98",X"F0",X"50",X"00",X"00",X"20",X"00",X"00",X"00",X"00",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"20",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"3F",X"7F",X"7F",X"E0",X"C0",X"C0",X"C0",X"E0",X"7F",X"7F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"E0",X"F0",X"F0",X"38",X"18",X"18",X"18",X"38",X"F0",X"F0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"FF",X"FF",X"7F",X"20",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"F8",X"F8",X"F8",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"3C",X"7E",X"FF",X"E7",X"C3",X"C3",X"C1",X"E1",X"F0",X"70",X"30", + X"00",X"00",X"00",X"00",X"00",X"18",X"18",X"18",X"18",X"98",X"98",X"D8",X"F8",X"F8",X"78",X"18", + X"00",X"00",X"00",X"00",X"00",X"38",X"7D",X"FF",X"EF",X"C6",X"C6",X"C6",X"E0",X"F0",X"70",X"30", + X"00",X"00",X"00",X"00",X"00",X"E0",X"F0",X"F8",X"38",X"18",X"18",X"18",X"38",X"78",X"70",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0E",X"1F",X"1F",X"3F",X"3F",X"3F",X"3F",X"1F",X"3F",X"3F",X"3F",X"1F",X"07",X"07",X"03",X"01", + X"6C",X"7E",X"FE",X"FE",X"FC",X"FC",X"FE",X"FF",X"FF",X"FF",X"FE",X"FC",X"FC",X"FC",X"F8",X"B0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0F",X"01",X"01",X"01",X"01",X"0F",X"00",X"00",X"00",X"00",X"00", + X"1E",X"3F",X"29",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"29",X"3F",X"1E", + X"00",X"00",X"00",X"00",X"00",X"0F",X"01",X"01",X"21",X"01",X"0F",X"00",X"00",X"00",X"00",X"00", + X"1E",X"3F",X"29",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"29",X"3F",X"1E", + X"00",X"C0",X"F0",X"FC",X"FF",X"7F",X"FF",X"87",X"87",X"FF",X"7F",X"FF",X"FC",X"F0",X"C0",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"81",X"81",X"81",X"81",X"80",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"50",X"7C",X"3F",X"03",X"01",X"00",X"00",X"00",X"00", + X"7C",X"8C",X"86",X"F7",X"7F",X"3F",X"FF",X"7F",X"FF",X"FE",X"FC",X"C0",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"01",X"01",X"01",X"01",X"FC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"38",X"1E",X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"03",X"06", + X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"0A",X"40",X"40",X"80",X"80",X"00",X"C0",X"D0",X"70", + X"3F",X"7F",X"FF",X"FF",X"7E",X"F8",X"E0",X"5F",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"E0",X"00",X"00",X"00",X"01",X"01",X"E3",X"FD",X"3C",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"C0",X"F0",X"38",X"1C",X"3C",X"46",X"42",X"7B",X"3F",X"9F",X"7F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"10",X"00",X"00",X"00",X"03",X"06", + X"00",X"00",X"00",X"00",X"00",X"07",X"0F",X"0A",X"40",X"40",X"80",X"80",X"00",X"C0",X"D0",X"70", + X"00",X"00",X"00",X"00",X"00",X"0F",X"01",X"01",X"21",X"01",X"0F",X"00",X"00",X"00",X"00",X"00", + X"1F",X"3F",X"28",X"01",X"01",X"41",X"03",X"02",X"02",X"03",X"41",X"01",X"01",X"28",X"3F",X"1F", + X"80",X"C0",X"F0",X"FC",X"FF",X"FF",X"FF",X"1F",X"1F",X"FF",X"FF",X"FF",X"FC",X"F0",X"C0",X"80", + X"00",X"00",X"00",X"00",X"00",X"80",X"81",X"81",X"81",X"81",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0F",X"01",X"01",X"41",X"01",X"0F",X"00",X"00",X"00",X"00",X"00", + X"1F",X"3F",X"28",X"01",X"01",X"41",X"03",X"02",X"02",X"03",X"41",X"01",X"01",X"28",X"3F",X"1F", + X"80",X"C0",X"F0",X"FC",X"FF",X"FF",X"FF",X"1F",X"1F",X"FF",X"FF",X"FF",X"FC",X"F0",X"C0",X"80", + X"00",X"00",X"00",X"00",X"00",X"80",X"81",X"81",X"81",X"81",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"01",X"07",X"0C",X"00", + X"00",X"1F",X"3F",X"2A",X"02",X"03",X"01",X"04",X"03",X"00",X"40",X"C0",X"80",X"29",X"3F",X"1F", + X"00",X"C0",X"F0",X"3C",X"1E",X"DF",X"FF",X"FF",X"FF",X"7F",X"77",X"7F",X"FF",X"FE",X"F0",X"C3", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"81",X"81",X"81",X"01",X"00",X"FC",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"13",X"06",X"0C",X"00",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"41", + X"00",X"00",X"00",X"00",X"00",X"1F",X"3E",X"2E",X"03",X"01",X"04",X"03",X"00",X"40",X"E8",X"BE", + X"EF",X"FF",X"FE",X"F8",X"C1",X"DF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"81",X"03",X"01",X"40",X"FC",X"FC",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"F0",X"38",X"1C",X"DE",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"77", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"81", + X"03",X"26",X"0C",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"20",X"01", + X"00",X"00",X"00",X"00",X"00",X"1F",X"3E",X"2A",X"03",X"01",X"04",X"03",X"00",X"40",X"E8",X"BE", + X"EF",X"FF",X"FE",X"F8",X"C1",X"DF",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"81",X"03",X"01",X"40",X"FC",X"FC",X"00",X"00",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"F0",X"3C",X"1E",X"DF",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F",X"77", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"81", + X"00",X"00",X"00",X"07",X"01",X"01",X"11",X"01",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"21",X"01",X"01",X"5D",X"3F",X"21",X"21",X"3F",X"5D",X"01",X"01",X"21",X"36",X"17",X"03",X"00", + X"E0",X"F8",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"F8",X"E0",X"E0",X"60",X"C0",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"1F",X"3E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"60",X"E0", + X"00",X"00",X"00",X"0F",X"01",X"01",X"41",X"01",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"2B",X"03",X"03",X"5F",X"3F",X"21",X"21",X"3F",X"5F",X"03",X"03",X"2B",X"3D",X"1E",X"03",X"00", + X"E0",X"F8",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"F8",X"E0",X"C0",X"C0",X"80",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"1F",X"3E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"60",X"E0", + X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"00",X"01",X"07",X"0C",X"00",X"00",X"00",X"00", + X"3F",X"23",X"21",X"3D",X"1F",X"0F",X"1B",X"43",X"C3",X"81",X"29",X"3E",X"1F",X"00",X"00",X"00", + X"EE",X"FF",X"FF",X"FF",X"FF",X"FF",X"EE",X"DE",X"BC",X"F8",X"E0",X"C3",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"7C",X"FC",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"3F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0", + X"01",X"01",X"01",X"01",X"00",X"00",X"10",X"01",X"01",X"03",X"06",X"00",X"00",X"00",X"00",X"00", + X"21",X"3D",X"1F",X"0F",X"5B",X"63",X"E3",X"85",X"0E",X"03",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"CF",X"9E",X"FE",X"FC",X"F8",X"E3",X"EF",X"40",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"01",X"40",X"7C",X"FC",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"3F",X"3F",X"23", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"FC", + X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"01",X"41",X"03",X"06",X"0C",X"00",X"00",X"00",X"00", + X"21",X"3D",X"1F",X"0D",X"59",X"69",X"F9",X"9E",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"EF",X"DE",X"FE",X"FC",X"F8",X"E3",X"EF",X"40",X"00",X"00",X"00", + X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"00",X"40",X"7C",X"FC",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1F",X"3F",X"3D",X"23", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"E0",X"F0",X"FE", + X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"0F",X"03",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"1F",X"15",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"50",X"7F",X"3F",X"00", + X"C0",X"E0",X"FC",X"FF",X"FF",X"7F",X"FF",X"87",X"87",X"FF",X"7F",X"FC",X"F8",X"F0",X"80",X"00", + X"00",X"00",X"00",X"00",X"80",X"80",X"81",X"81",X"81",X"81",X"FC",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1C",X"0E",X"07",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0C",X"1F",X"17",X"40",X"40",X"80",X"80",X"00",X"00",X"28",X"38", + X"3F",X"3F",X"7F",X"FF",X"FE",X"F8",X"E0",X"5F",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"80",X"00",X"00",X"00",X"01",X"01",X"E3",X"FD",X"3C",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"F0",X"78",X"1C",X"3C",X"46",X"42",X"7B",X"3F",X"9F",X"7F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"E0",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"EF",X"E7",X"E3",X"E3",X"E2", + X"80",X"80",X"90",X"90",X"92",X"92",X"D0",X"B0",X"98",X"8C",X"8C",X"C8",X"A0",X"80",X"80",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"E0",X"B8",X"9C",X"8F",X"87",X"C3",X"E3",X"91",X"88",X"80",X"80",X"E0",X"BC",X"9F",X"87",X"83", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"87",X"83",X"81",X"C0",X"E0",X"B8",X"9C",X"87",X"83",X"82",X"82",X"92",X"92",X"82",X"82",X"C0", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"80",X"80",X"80",X"90",X"90",X"90",X"90",X"82",X"82",X"C2",X"A2",X"9A",X"8E",X"8F",X"CF",X"A7", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"F0",X"F8",X"FC",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"EF",X"67",X"61",X"60",X"60",X"70",X"60",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"70",X"78",X"FE",X"FF",X"EF",X"E7",X"E1",X"60",X"60",X"70",X"78",X"FE",X"FF",X"FF", + X"1C",X"1C",X"1C",X"1C",X"1C",X"1C",X"DC",X"FC",X"FC",X"FC",X"3F",X"1F",X"07",X"02",X"00",X"C0", + X"FF",X"FF",X"FF",X"6F",X"67",X"63",X"63",X"63",X"E3",X"E3",X"63",X"63",X"63",X"63",X"63",X"61", + X"00",X"80",X"C0",X"E0",X"F0",X"F8",X"FC",X"3E",X"1F",X"07",X"03",X"00",X"00",X"00",X"18",X"1C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"60",X"60",X"60",X"60",X"70",X"78",X"FC",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7F",X"7C",X"58",X"70",X"40",X"80",X"00",X"00",X"00",X"00", + X"FE",X"FC",X"F8",X"E0",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"40",X"70",X"78",X"7C",X"7F",X"7F",X"FF",X"FF",X"FF",X"7F",X"7F",X"7F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"F8",X"FC",X"FE",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C6",X"C7",X"C7",X"C7",X"E7",X"F7",X"FE",X"FC",X"F8",X"F0",X"C0",X"80",X"00",X"00",X"00",X"00", + X"18",X"08",X"08",X"80",X"C0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"F3",X"F1",X"F1",X"D1",X"CD",X"CF",X"C7",X"C3",X"C3",X"C1",X"C0",X"C0",X"C0",X"C4",X"C4", + X"04",X"80",X"C0",X"70",X"38",X"0E",X"07",X"81",X"C0",X"F0",X"F8",X"FE",X"F9",X"78",X"38",X"38", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"30",X"38",X"0C",X"04",X"80",X"C0",X"70",X"38",X"0E",X"07",X"01",X"00",X"30",X"38",X"0C", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"3F",X"1F",X"0F",X"87",X"C7",X"E3",X"11",X"00",X"00",X"00",X"F0",X"7F",X"3F",X"0F",X"07",X"01", + X"00",X"80",X"C0",X"F0",X"F8",X"FC",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"F8",X"FC",X"FE",X"FF",X"FF",X"7F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F9",X"F9",X"F9",X"39",X"19",X"09",X"09",X"C9",X"E1",X"F1",X"F0",X"F0",X"F0",X"E0",X"C0",X"00", + X"00",X"80",X"C0",X"F0",X"F8",X"F8",X"F0",X"E0",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F1",X"F9",X"F9",X"F9",X"F9",X"F9",X"F9",X"39",X"19",X"09",X"09",X"C9",X"E9",X"F9",X"F9",X"F9", + X"FC",X"FC",X"FC",X"7C",X"3C",X"0E",X"07",X"01",X"00",X"00",X"10",X"18",X"18",X"18",X"08",X"00", + X"F0",X"F8",X"F8",X"F9",X"F9",X"F9",X"F9",X"F9",X"79",X"39",X"19",X"09",X"87",X"C3",X"E3",X"F1", + X"00",X"00",X"00",X"00",X"80",X"E0",X"F0",X"F8",X"FC",X"FE",X"FF",X"FD",X"FC",X"FC",X"FC",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"83",X"83",X"93",X"93",X"83",X"83",X"C3",X"E7",X"FF",X"9F",X"03",X"03",X"03",X"00",X"60", + X"80",X"C0",X"E0",X"F8",X"FC",X"FE",X"FF",X"FE",X"FC",X"F8",X"E0",X"C0",X"80",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"E0",X"38",X"1C",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_bit3.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_bit3.vhd new file mode 100644 index 00000000..5c9aa7f2 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_bit3.vhd @@ -0,0 +1,534 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity travusa_spr_bit3 is +port ( + clk : in std_logic; + addr : in std_logic_vector(12 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of travusa_spr_bit3 is + type rom is array(0 to 8191) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"40",X"C0",X"D0",X"CC",X"C1",X"47",X"07",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"00",X"07",X"47",X"C1",X"C0",X"C0",X"C0",X"40",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"3E",X"3E",X"3E",X"3E",X"3F",X"3F",X"1F",X"1F",X"1E",X"08",X"01",X"00",X"E0",X"E0",X"E0",X"00", + X"00",X"00",X"00",X"00",X"00",X"40",X"30",X"00",X"7C",X"FC",X"F8",X"00",X"03",X"07",X"07",X"00", + X"00",X"E0",X"E0",X"E0",X"00",X"01",X"08",X"1E",X"1F",X"1F",X"3F",X"3F",X"3E",X"3E",X"3E",X"3E", + X"00",X"07",X"07",X"03",X"00",X"F8",X"FC",X"7C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"7C",X"7C",X"7C",X"7C",X"7C",X"38",X"08",X"00",X"E0",X"C0",X"01",X"01",X"C0",X"E0",X"E0",X"00", + X"40",X"40",X"40",X"40",X"40",X"C0",X"40",X"C0",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"38",X"7D",X"73",X"63",X"3C",X"00",X"00",X"00", + X"07",X"07",X"07",X"01",X"60",X"C4",X"1C",X"1C",X"78",X"DA",X"5C",X"8F",X"07",X"01",X"01",X"00", + X"C0",X"C1",X"C3",X"C7",X"07",X"07",X"62",X"10",X"00",X"C0",X"C0",X"E0",X"E7",X"FF",X"9F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"06",X"02",X"C2",X"F8",X"F8",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"04",X"04",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"00",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"38",X"7D",X"73",X"63",X"3C",X"00",X"00",X"00", + X"07",X"07",X"07",X"01",X"60",X"C4",X"1C",X"1C",X"78",X"DA",X"5C",X"8F",X"07",X"01",X"01",X"00", + X"C2",X"83",X"87",X"8F",X"07",X"0F",X"46",X"24",X"00",X"C0",X"C0",X"E0",X"E7",X"FF",X"9F",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"06",X"02",X"C2",X"F8",X"F8",X"F0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"04",X"04",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"40",X"02",X"82", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"38",X"7C",X"F9",X"E3",X"C7",X"78",X"00",X"00",X"00",X"00",X"00", + X"7C",X"3C",X"C6",X"00",X"09",X"3F",X"74",X"D0",X"AA",X"6E",X"7C",X"7F",X"3F",X"1F",X"1C",X"07", + X"00",X"10",X"00",X"C0",X"E0",X"80",X"00",X"00",X"02",X"03",X"41",X"31",X"D9",X"F8",X"3C",X"EC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"44",X"40",X"78",X"7C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"08",X"38",X"7C",X"F9",X"E3",X"C7",X"78",X"00",X"00",X"00",X"00",X"00", + X"78",X"38",X"C4",X"00",X"09",X"3F",X"74",X"D0",X"AA",X"6E",X"7C",X"7F",X"3F",X"1D",X"1D",X"07", + X"20",X"30",X"10",X"80",X"C0",X"80",X"00",X"00",X"02",X"03",X"41",X"31",X"D9",X"F8",X"3C",X"EC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"44",X"40",X"78",X"7C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"7F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7F",X"00",X"00", + X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00", + X"00",X"00",X"7F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"7F",X"00",X"00", + X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00", + X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"00",X"00", + X"80",X"A4",X"FE",X"0E",X"1C",X"3C",X"7C",X"F8",X"F8",X"F8",X"F8",X"D0",X"90",X"50",X"C0",X"C0", + X"00",X"00",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"01",X"00",X"00",X"00", + X"30",X"A4",X"EE",X"0E",X"1C",X"3C",X"7C",X"F8",X"F8",X"F8",X"F8",X"D0",X"90",X"50",X"C0",X"C0", + X"00",X"E0",X"E0",X"70",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"FC",X"7C",X"7C",X"3E",X"0E",X"0E",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"5F",X"5F",X"7E",X"29",X"07",X"E6",X"FE",X"E6",X"82",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"FE",X"80",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"82",X"E6",X"FE",X"E6",X"07",X"29",X"7E",X"5F",X"5F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"80",X"FE",X"FF", + X"5F",X"5F",X"7E",X"29",X"07",X"E6",X"FE",X"E6",X"82",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"FC",X"80",X"C0",X"C0",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"82",X"E6",X"FE",X"E6",X"07",X"29",X"7E",X"5F",X"5F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"80",X"FC",X"FE", + X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"1F",X"1E",X"3C",X"3A",X"3F",X"1F",X"07",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"0C",X"1C",X"1C",X"0C",X"00",X"10", + X"00",X"00",X"00",X"00",X"00",X"01",X"07",X"0F",X"0F",X"0F",X"1F",X"1F",X"1F",X"0F",X"07",X"0F", + X"8B",X"0B",X"0F",X"07",X"05",X"00",X"82",X"E7",X"FB",X"FD",X"3C",X"00",X"00",X"00",X"00",X"00", + X"E0",X"F8",X"D8",X"E0",X"F0",X"F8",X"7C",X"3E",X"9E",X"8F",X"25",X"17",X"0E",X"00",X"00",X"00", + X"00",X"00",X"00",X"0C",X"3E",X"DE",X"FD",X"FB",X"FB",X"F7",X"C7",X"83",X"80",X"03",X"05",X"85", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"C0",X"E0", + X"8B",X"0B",X"0F",X"07",X"05",X"00",X"82",X"E7",X"FB",X"FD",X"3C",X"00",X"00",X"00",X"00",X"00", + X"E0",X"F8",X"D8",X"E0",X"F0",X"F8",X"7C",X"3C",X"9E",X"8E",X"2E",X"1C",X"00",X"00",X"00",X"00", + X"1C",X"1C",X"0E",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"0F",X"0F",X"07",X"07",X"03",X"01",X"00",X"60",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"C3",X"CF",X"FE",X"9C",X"3F",X"27",X"27",X"27",X"27",X"3F",X"9C",X"FE",X"CF",X"C3",X"01", + X"00",X"20",X"70",X"70",X"20",X"F0",X"FE",X"FF",X"FF",X"FE",X"F0",X"20",X"70",X"70",X"20",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"03",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"40",X"40",X"06",X"0F",X"0E",X"1D",X"1D",X"1D",X"1D",X"0E",X"0F",X"06",X"40",X"40",X"00", + X"00",X"00",X"20",X"78",X"D8",X"80",X"F8",X"7F",X"7F",X"F8",X"80",X"D8",X"78",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"01",X"13",X"33",X"33",X"13",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"10",X"A8",X"C8",X"B0",X"5F",X"5F",X"B0",X"C8",X"A8",X"10",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"0C",X"0C",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"38",X"62",X"F8",X"EF",X"F8",X"62",X"38",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"06",X"2F",X"06",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"04",X"04",X"00",X"00",X"00",X"30",X"70",X"70",X"70",X"70",X"30",X"00",X"00",X"00",X"04",X"04", + X"00",X"10",X"33",X"7F",X"77",X"EE",X"E8",X"E8",X"E9",X"EF",X"F7",X"7F",X"73",X"30",X"00",X"00", + X"40",X"C0",X"D8",X"98",X"00",X"D0",X"FE",X"FE",X"FE",X"F0",X"00",X"98",X"D8",X"60",X"20",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"78",X"7F",X"7F",X"3F",X"00",X"00", + X"1F",X"1F",X"0F",X"1B",X"10",X"10",X"90",X"B0",X"31",X"16",X"30",X"F8",X"D8",X"9C",X"1C",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"0F", + X"C3",X"C3",X"C3",X"83",X"03",X"23",X"23",X"67",X"42",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"6C",X"58",X"F0",X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"70",X"F8",X"F8",X"38",X"38",X"38",X"38",X"0C",X"86",X"C6",X"C3", + X"00",X"00",X"00",X"00",X"30",X"58",X"E8",X"7C",X"5C",X"1E",X"5F",X"43",X"93",X"3B",X"32",X"36", + X"3C",X"1E",X"0F",X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"18",X"30",X"30",X"A0",X"E0",X"40",X"40",X"40",X"E0",X"E0",X"60",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"78",X"70",X"70",X"38", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"47",X"4F", + X"F3",X"F3",X"F1",X"F1",X"61",X"01",X"01",X"03",X"0F",X"1F",X"3E",X"FC",X"FF",X"7F",X"39",X"00", + X"C0",X"80",X"00",X"00",X"06",X"0C",X"0D",X"07",X"27",X"4F",X"07",X"73",X"FB",X"33",X"86",X"FC", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"00",X"E1",X"F3", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"C0",X"E0",X"E0",X"E0", + X"60",X"E0",X"E4",X"64",X"02",X"00",X"00",X"00",X"00",X"00",X"02",X"07",X"07",X"03",X"01",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"30",X"70",X"78",X"78",X"78",X"70",X"70",X"70",X"70",X"70",X"33",X"30",X"00",X"07",X"1E",X"30", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"03",X"06",X"8C",X"F8",X"F0",X"C0",X"E6",X"F0",X"DC",X"4F",X"65",X"31",X"1F",X"0F",X"07", + X"F8",X"F0",X"00",X"00",X"00",X"00",X"00",X"20",X"70",X"D0",X"D0",X"F8",X"F0",X"E0",X"80",X"00", + X"00",X"00",X"00",X"00",X"30",X"F8",X"38",X"00",X"38",X"7C",X"7C",X"7C",X"7C",X"7C",X"39",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"38",X"F8",X"F8", + X"F0",X"F0",X"70",X"38",X"7C",X"EF",X"E0",X"B0",X"B4",X"A2",X"A0",X"89",X"DD",X"FF",X"7E",X"3F", + X"70",X"00",X"00",X"00",X"76",X"FE",X"3E",X"1C",X"18",X"00",X"00",X"00",X"80",X"80",X"80",X"00", + X"01",X"01",X"18",X"3F",X"39",X"00",X"00",X"02",X"02",X"04",X"00",X"40",X"40",X"C0",X"E0",X"E0", + X"C0",X"00",X"30",X"00",X"C0",X"E0",X"30",X"1C",X"1E",X"0E",X"70",X"F8",X"F8",X"F8",X"F8",X"F8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"1E",X"3E",X"7E",X"70",X"E0",X"E0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"04",X"32",X"7B",X"7B",X"7B",X"7F",X"7F",X"7E",X"3C",X"00",X"00", + X"00",X"00",X"40",X"3F",X"0F",X"00",X"00",X"00",X"00",X"00",X"06",X"0F",X"0F",X"39",X"07",X"01", + X"64",X"46",X"C2",X"82",X"02",X"02",X"02",X"02",X"02",X"46",X"4C",X"7C",X"F8",X"E0",X"80",X"E0", + X"00",X"00",X"00",X"00",X"01",X"1C",X"38",X"38",X"18",X"08",X"0C",X"05",X"07",X"03",X"02",X"02", + X"20",X"60",X"40",X"C0",X"C0",X"68",X"28",X"78",X"78",X"7D",X"BF",X"9F",X"1F",X"3E",X"3C",X"64", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"41",X"E2",X"E6",X"F6",X"7C",X"00", + X"02",X"07",X"07",X"0E",X"6E",X"5C",X"DC",X"B8",X"BA",X"76",X"74",X"2C",X"08",X"18",X"10",X"30", + X"00",X"00",X"01",X"01",X"03",X"03",X"03",X"03",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"07",X"FB",X"DC",X"CC",X"EC",X"EC",X"EC",X"CC",X"D8",X"F0",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"03",X"07",X"87",X"C7",X"E7",X"E7",X"E7",X"E7",X"37",X"1F",X"08",X"03",X"07",X"07", + X"40",X"13",X"FF",X"FF",X"FF",X"7F",X"3F",X"17",X"1F",X"0E",X"06",X"00",X"00",X"00",X"00",X"00", + X"78",X"F0",X"E0",X"C0",X"00",X"E0",X"FE",X"FE",X"FE",X"7C",X"F8",X"F0",X"60",X"00",X"00",X"00", + X"00",X"C3",X"E7",X"FF",X"FF",X"7E",X"8D",X"DF",X"DF",X"F3",X"D0",X"D0",X"D8",X"4F",X"C7",X"C3", + X"00",X"00",X"00",X"F8",X"0C",X"C6",X"E6",X"E6",X"C6",X"8E",X"1C",X"3C",X"F8",X"F0",X"EC",X"9C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0E",X"1C",X"3C",X"3C",X"3C",X"38",X"38",X"38",X"10",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"15",X"37",X"3B",X"C3",X"E3",X"E3",X"C1",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"F3",X"E3",X"F1",X"F8",X"FC",X"3E",X"9E",X"CF",X"E7",X"F7",X"F3",X"EB",X"63",X"33",X"1E",X"00", + X"18",X"18",X"38",X"38",X"3C",X"7C",X"7C",X"7C",X"7E",X"3E",X"3E",X"1E",X"1F",X"1F",X"3F",X"3F", + X"67",X"77",X"53",X"0B",X"23",X"33",X"1E",X"18",X"18",X"18",X"18",X"1C",X"3E",X"FF",X"FF",X"F7", + X"03",X"07",X"0E",X"1E",X"1E",X"1E",X"1F",X"1E",X"1F",X"1F",X"6F",X"07",X"07",X"07",X"03",X"09", + X"00",X"00",X"00",X"00",X"00",X"18",X"98",X"00",X"00",X"E0",X"F0",X"F8",X"FC",X"3E",X"9E",X"CF", + X"38",X"38",X"38",X"38",X"38",X"1C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1E",X"1E",X"1E",X"1F",X"0F",X"03",X"07",X"0F",X"0E",X"0D",X"07",X"03",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1C",X"38", + X"00",X"00",X"00",X"01",X"00",X"00",X"03",X"07",X"0F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1E", + X"67",X"4F",X"4F",X"7F",X"FF",X"07",X"00",X"99",X"FB",X"FF",X"FF",X"C7",X"03",X"02",X"00",X"00", + X"20",X"80",X"C0",X"F0",X"FC",X"FE",X"7F",X"1F",X"86",X"80",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"40",X"C0",X"C3",X"BF",X"6F",X"F7",X"D7",X"E0",X"F0",X"E0",X"E0",X"84",X"18",X"3C",X"24", + X"00",X"00",X"00",X"FC",X"FE",X"FE",X"CE",X"3C",X"70",X"00",X"00",X"00",X"00",X"20",X"70",X"70", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"00",X"00",X"40",X"C0",X"D0",X"CC",X"C1",X"43",X"03",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"00",X"03",X"43",X"C1",X"C0",X"C0",X"C0",X"40",X"00",X"00",X"80",X"00",X"00",X"00",X"00",X"00", + X"3E",X"3E",X"3E",X"3E",X"3F",X"3F",X"1F",X"1F",X"1E",X"08",X"01",X"00",X"E0",X"F0",X"F0",X"00", + X"00",X"00",X"00",X"00",X"00",X"40",X"30",X"00",X"7C",X"FC",X"F8",X"00",X"03",X"03",X"03",X"00", + X"00",X"F0",X"F0",X"E0",X"00",X"01",X"08",X"1E",X"1F",X"1F",X"3F",X"3F",X"3E",X"3E",X"3E",X"3E", + X"00",X"03",X"03",X"03",X"00",X"F8",X"FC",X"7C",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"7C",X"7C",X"7C",X"7C",X"7C",X"38",X"08",X"00",X"E0",X"C0",X"01",X"01",X"C0",X"F0",X"F0",X"00", + X"40",X"40",X"40",X"40",X"40",X"C0",X"40",X"C0",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00", + X"01",X"03",X"03",X"02",X"02",X"07",X"07",X"06",X"06",X"06",X"02",X"02",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"40",X"00",X"00",X"00",X"00",X"00", + X"00",X"07",X"0C",X"1C",X"1C",X"20",X"20",X"20",X"60",X"40",X"40",X"40",X"C0",X"80",X"80",X"80", + X"00",X"00",X"30",X"3C",X"1F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"60",X"F8",X"3C",X"0C",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"F0",X"F4",X"F4",X"E2",X"08",X"1E",X"3F",X"07",X"01",X"00",X"00",X"01",X"01", + X"C0",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01", + X"38",X"00",X"00",X"00",X"08",X"1D",X"3C",X"3E",X"7E",X"7E",X"FC",X"FC",X"F8",X"F8",X"F8",X"F0", + X"03",X"03",X"07",X"07",X"07",X"03",X"83",X"99",X"3C",X"00",X"00",X"C0",X"F0",X"78",X"18",X"00", + X"E2",X"E2",X"E2",X"C6",X"C4",X"C4",X"84",X"0C",X"18",X"08",X"18",X"10",X"30",X"60",X"00",X"00", + X"03",X"03",X"C1",X"F0",X"F8",X"38",X"09",X"01",X"00",X"00",X"00",X"00",X"01",X"01",X"03",X"03", + X"00",X"C0",X"F0",X"70",X"00",X"00",X"82",X"C3",X"41",X"01",X"01",X"F1",X"F1",X"F3",X"F1",X"F3", + X"0E",X"0E",X"0E",X"0E",X"0C",X"0C",X"0C",X"00",X"00",X"00",X"00",X"09",X"0F",X"07",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"90",X"FF",X"FF",X"00", + X"0E",X"0C",X"0D",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00",X"0C",X"0C", + X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"80",X"80",X"38",X"7F",X"7F",X"FF",X"FF",X"7F",X"1F", + X"00",X"00",X"00",X"00",X"01",X"03",X"00",X"00",X"00",X"00",X"0C",X"0C",X"0C",X"0E",X"0E",X"0E", + X"00",X"00",X"7F",X"FF",X"D0",X"00",X"00",X"0F",X"3F",X"1F",X"1F",X"5F",X"CF",X"C0",X"C0",X"00", + X"07",X"07",X"07",X"03",X"00",X"06",X"1F",X"0F",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F8",X"F8",X"F8",X"F0",X"F0",X"20",X"00",X"C0",X"E5",X"0F",X"0E",X"04",X"00",X"03",X"3F",X"00", + X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07",X"07", + X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03",X"07",X"07",X"07",X"07",X"07",X"07", + X"04",X"0E",X"0F",X"05",X"00",X"00",X"00",X"20",X"F0",X"F0",X"F8",X"F8",X"F8",X"F8",X"F8",X"F8", + X"01",X"01",X"00",X"00",X"0E",X"1F",X"1F",X"1F",X"9F",X"0E",X"00",X"00",X"01",X"9F",X"BF",X"00", + X"FE",X"FE",X"EE",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"1C",X"38",X"78",X"F8",X"F8",X"F0",X"00", + X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03",X"03", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE", + X"00",X"0E",X"1F",X"9F",X"1F",X"1F",X"0E",X"00",X"00",X"01",X"01",X"03",X"03",X"03",X"03",X"03", + X"38",X"1C",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"EE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"0F",X"07",X"31",X"38",X"1E",X"00",X"00",X"00",X"00",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"01",X"07",X"0F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F",X"1F", + X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"01",X"03",X"03",X"F3",X"E1",X"C0",X"30",X"F7", + X"FF",X"FE",X"FE",X"FE",X"FE",X"7E",X"7E",X"36",X"86",X"C6",X"C6",X"CE",X"8C",X"18",X"78",X"F0", + X"03",X"01",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80", + X"C6",X"86",X"36",X"7E",X"7E",X"FE",X"FE",X"FE",X"FE",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C1",X"E3",X"F3", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"8C",X"CE",X"C6", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"03",X"01",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01", + X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"20",X"81",X"C5",X"18",X"18",X"00",X"3D",X"00", + X"7F",X"7F",X"7F",X"7E",X"7E",X"7E",X"3E",X"1E",X"86",X"C6",X"C6",X"86",X"0C",X"18",X"F8",X"00", + X"00",X"00",X"00",X"18",X"18",X"05",X"01",X"20",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0",X"F0", + X"00",X"00",X"18",X"0C",X"86",X"C6",X"C6",X"86",X"1E",X"3E",X"7E",X"7E",X"7E",X"7F",X"7F",X"7F", + X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"0E",X"06",X"02",X"18",X"0E",X"00",X"00",X"03",X"00", + X"1E",X"1F",X"1F",X"1F",X"1F",X"1F",X"1E",X"0E",X"02",X"32",X"32",X"02",X"06",X"0C",X"BC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"02",X"06",X"0E", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C",X"06",X"32",X"32",X"02",X"0E", + X"00",X"00",X"00",X"00",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"01",X"00",X"00",X"00",X"00", + X"02",X"0D",X"0D",X"C1",X"C3",X"C7",X"C7",X"C7",X"C7",X"C7",X"C7",X"C3",X"C1",X"0D",X"0D",X"02", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"02",X"05",X"25",X"63",X"67",X"67",X"67",X"67",X"63",X"25",X"05",X"02",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"03",X"09",X"0B",X"0B",X"0B",X"0B",X"09",X"03",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"05",X"05",X"05",X"05",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"7F",X"7F",X"7F",X"3F",X"3F",X"3F",X"1F",X"0F",X"0F",X"1F",X"1F",X"1F",X"1F",X"0F",X"07",X"00", + X"FF",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FD",X"FF",X"FF",X"FF",X"FF",X"03",X"00", + X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"83",X"FE",X"FC",X"00",X"00", + X"00",X"03",X"FF",X"FF",X"FF",X"FF",X"FD",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"FB",X"F8", + X"00",X"00",X"FC",X"FE",X"83",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"FF",X"3F", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"70",X"3E",X"1E",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"1E",X"3E",X"70",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"00",X"40",X"00",X"00",X"00",X"80",X"20",X"84",X"10",X"42",X"90",X"05",X"20",X"0A",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"12",X"40",X"08",X"21",X"00",X"88", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0A",X"20",X"05",X"90",X"42",X"10",X"84", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"88",X"00",X"21",X"08",X"40",X"12",X"80",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"00",X"00",X"00",X"00",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"40",X"00",X"00",X"00",X"00",X"00",X"20",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0F",X"1F",X"3F",X"3F",X"7F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"FF",X"7F",X"7F",X"3F", + X"F8",X"FC",X"FC",X"FE",X"FE",X"FE",X"FE",X"FE",X"FC",X"FC",X"FC",X"FC",X"F8",X"F8",X"F0",X"E0", + X"00",X"00",X"00",X"00",X"3F",X"7F",X"7F",X"3F",X"7F",X"FF",X"FF",X"7F",X"30",X"20",X"00",X"00", + X"00",X"00",X"00",X"00",X"FE",X"FE",X"FE",X"FC",X"FC",X"FC",X"FC",X"F8",X"00",X"00",X"00",X"00", + X"0F",X"1F",X"3F",X"7F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"F9",X"F9",X"F8",X"78",X"30", + X"06",X"8E",X"CE",X"CE",X"EE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"FC",X"FC",X"FC",X"7C",X"18", + X"0E",X"1F",X"3F",X"7F",X"7F",X"7F",X"7F",X"FF",X"FF",X"FF",X"FF",X"F6",X"F8",X"F8",X"78",X"30", + X"38",X"7C",X"FE",X"FE",X"FE",X"FE",X"FE",X"FE",X"3C",X"3C",X"3C",X"3C",X"3C",X"78",X"70",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"04",X"0C",X"0E",X"1E",X"3D",X"3F",X"17",X"0F",X"2F",X"3F",X"19",X"03",X"03",X"03",X"01", + X"00",X"00",X"60",X"F0",X"70",X"F0",X"E0",X"E6",X"C7",X"B3",X"F0",X"F0",X"F8",X"F8",X"F0",X"B0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"E0",X"40",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FF",X"07",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"40",X"00",X"40",X"E0",X"FF",X"FF",X"FF",X"E0",X"40",X"03",X"0F",X"1F",X"7F",X"FC",X"FF",X"FF", + X"00",X"00",X"00",X"00",X"FE",X"FF",X"FF",X"3F",X"FE",X"F8",X"F0",X"C0",X"02",X"07",X"FF",X"FF", + X"40",X"E0",X"F8",X"FC",X"FE",X"FF",X"EF",X"47",X"03",X"47",X"EF",X"FF",X"FE",X"FC",X"F8",X"E0", + X"00",X"00",X"00",X"00",X"00",X"02",X"87",X"FF",X"FF",X"FF",X"87",X"03",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0F",X"70",X"E0",X"E0",X"70",X"0F",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"10",X"30",X"60",X"21",X"61",X"61",X"21",X"60",X"30",X"10",X"10",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0F",X"70",X"E0",X"E0",X"70",X"0F",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"10",X"30",X"60",X"21",X"61",X"61",X"21",X"60",X"30",X"10",X"10",X"00",X"00", + X"00",X"00",X"00",X"84",X"C3",X"F1",X"F9",X"81",X"81",X"F9",X"F1",X"C3",X"84",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"87",X"8D",X"8D",X"87",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"60",X"E0",X"F0",X"CC",X"60",X"30",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"20",X"60",X"61",X"21",X"61",X"40",X"60",X"A0",X"00",X"00",X"00",X"01",X"00",X"00",X"00",X"00", + X"70",X"88",X"80",X"F1",X"F9",X"F1",X"E3",X"03",X"87",X"0E",X"3C",X"C0",X"F0",X"70",X"E0",X"C0", + X"00",X"00",X"00",X"00",X"80",X"80",X"86",X"0D",X"0D",X"07",X"03",X"FF",X"FE",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"09",X"04",X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"80",X"C8",X"8C",X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"38",X"38",X"34",X"1A",X"13",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"0C",X"18",X"18",X"30",X"20",X"E0",X"A0",X"00", + X"01",X"03",X"07",X"1F",X"7E",X"F8",X"E0",X"7F",X"7F",X"3E",X"73",X"61",X"00",X"00",X"00",X"00", + X"E0",X"E0",X"00",X"06",X"0C",X"0D",X"07",X"E7",X"FF",X"FE",X"36",X"CC",X"78",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"44",X"C0",X"F8",X"FC",X"F8",X"71", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"18",X"38",X"38",X"34",X"12",X"13",X"0F", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"0C",X"18",X"18",X"30",X"20",X"E0",X"A0",X"00", + X"00",X"00",X"00",X"00",X"00",X"0F",X"70",X"E0",X"E0",X"70",X"0F",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"11",X"31",X"63",X"27",X"66",X"66",X"27",X"63",X"31",X"11",X"10",X"00",X"00", + X"00",X"00",X"10",X"8C",X"87",X"C3",X"E3",X"03",X"03",X"E3",X"C3",X"87",X"8C",X"10",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"87",X"8D",X"8D",X"87",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"0F",X"70",X"E0",X"E0",X"70",X"0F",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"10",X"11",X"31",X"63",X"27",X"66",X"66",X"27",X"63",X"31",X"11",X"10",X"00",X"00", + X"00",X"00",X"10",X"8C",X"83",X"C1",X"E1",X"01",X"01",X"E1",X"C1",X"83",X"8C",X"10",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"80",X"87",X"8D",X"8D",X"87",X"80",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"F0",X"FF",X"C7",X"6C",X"3F", + X"00",X"00",X"01",X"12",X"36",X"27",X"27",X"67",X"63",X"20",X"60",X"E0",X"B0",X"D1",X"C0",X"80", + X"00",X"00",X"C0",X"20",X"00",X"C1",X"E1",X"C1",X"81",X"03",X"07",X"0F",X"8F",X"1E",X"30",X"E3", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"86",X"8D",X"8D",X"87",X"07",X"0F",X"FF",X"FF", + X"38",X"70",X"60",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FE",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F7",X"DF",X"DE",X"66",X"3B",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"98",X"CF",X"87",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"60",X"F1", + X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"12",X"37",X"67",X"67",X"23",X"20",X"70",X"D0",X"80", + X"0F",X"3F",X"FE",X"F8",X"C1",X"FF",X"7B",X"39",X"70",X"60",X"00",X"00",X"00",X"00",X"00",X"00", + X"87",X"07",X"0F",X"7F",X"FF",X"FF",X"7B",X"9B",X"EE",X"1C",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"C0",X"20",X"00",X"C0",X"E1",X"C1",X"81",X"03",X"03",X"07",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"86",X"8C",X"8D", + X"E7",X"FF",X"DE",X"67",X"39",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"10",X"98",X"CF",X"87",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"60",X"F1", + X"00",X"00",X"00",X"00",X"00",X"01",X"02",X"16",X"37",X"67",X"67",X"23",X"20",X"70",X"D0",X"80", + X"0F",X"3F",X"FE",X"F8",X"C1",X"FF",X"7B",X"39",X"70",X"60",X"00",X"00",X"00",X"00",X"00",X"00", + X"87",X"07",X"0F",X"7F",X"FF",X"FF",X"7B",X"9B",X"EE",X"1C",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"C0",X"20",X"00",X"C0",X"E0",X"C0",X"80",X"01",X"01",X"03",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"86",X"8C",X"8D", + X"00",X"00",X"00",X"07",X"38",X"70",X"70",X"38",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"10",X"30",X"7C",X"3E",X"60",X"60",X"3E",X"7C",X"30",X"10",X"10",X"00",X"00",X"00",X"00", + X"20",X"38",X"1E",X"0F",X"07",X"07",X"07",X"07",X"0F",X"1E",X"38",X"20",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"07",X"0D",X"0D",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"0F",X"70",X"E0",X"E0",X"70",X"0F",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"10",X"10",X"30",X"7C",X"3E",X"60",X"60",X"3E",X"7C",X"30",X"10",X"10",X"00",X"00",X"00",X"00", + X"60",X"78",X"3E",X"1F",X"0F",X"0F",X"0F",X"0F",X"1F",X"3E",X"78",X"60",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"07",X"0D",X"0D",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"60",X"F0",X"FF",X"C7",X"6C",X"3F",X"00",X"00",X"00", + X"1C",X"22",X"20",X"3C",X"7E",X"7C",X"38",X"60",X"F0",X"90",X"90",X"C0",X"80",X"00",X"00",X"00", + X"0E",X"0F",X"0F",X"0F",X"0F",X"0F",X"0E",X"1E",X"3C",X"78",X"30",X"3F",X"1C",X"38",X"30",X"00", + X"00",X"00",X"00",X"00",X"06",X"0D",X"0D",X"07",X"07",X"0F",X"7F",X"FF",X"FE",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"10",X"38",X"7F",X"71",X"67",X"6F",X"66",X"30",X"1F",X"00",X"00", + X"60",X"7C",X"3E",X"3C",X"78",X"50",X"C0",X"80",X"90",X"4C",X"6F",X"6F",X"C3",X"83",X"00",X"00", + X"0F",X"0F",X"0F",X"0F",X"1F",X"0F",X"1E",X"3E",X"3C",X"7B",X"E3",X"FF",X"FF",X"FD",X"38",X"30", + X"00",X"00",X"06",X"0C",X"0D",X"07",X"07",X"3F",X"FF",X"FF",X"FF",X"FB",X"33",X"86",X"FC",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1C",X"22", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"71",X"FF",X"E3",X"CE",X"DE",X"CC",X"61",X"3F",X"00", + X"60",X"7C",X"3E",X"3C",X"78",X"50",X"C0",X"80",X"10",X"0C",X"8F",X"CF",X"C7",X"83",X"00",X"00", + X"07",X"07",X"07",X"07",X"0F",X"0F",X"1E",X"1E",X"1C",X"7B",X"E3",X"FF",X"FD",X"FC",X"38",X"30", + X"00",X"00",X"06",X"0D",X"0D",X"07",X"07",X"3F",X"C7",X"7F",X"FF",X"F3",X"86",X"FC",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"1C",X"22", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"06", + X"00",X"00",X"00",X"00",X"70",X"E0",X"E0",X"70",X"3E",X"0F",X"03",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"01",X"11",X"30",X"20",X"61",X"61",X"01",X"41",X"E1",X"21",X"20",X"00",X"00",X"00", + X"00",X"00",X"8C",X"C7",X"C3",X"F1",X"F9",X"81",X"81",X"F9",X"F1",X"C0",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"80",X"86",X"8D",X"8D",X"87",X"83",X"FF",X"FC",X"00",X"00",X"00",X"00", + X"08",X"07",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"80",X"D0",X"88",X"0C",X"06",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"30",X"70",X"70",X"78",X"26",X"20",X"11", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"08",X"08",X"18",X"18",X"30",X"20",X"30",X"10",X"00", + X"01",X"03",X"07",X"0F",X"3E",X"F8",X"E0",X"5F",X"7F",X"3B",X"71",X"60",X"00",X"00",X"00",X"00", + X"80",X"80",X"00",X"06",X"0C",X"0D",X"07",X"E7",X"FF",X"3E",X"CC",X"78",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"38",X"44",X"C0",X"F8",X"FC",X"F8",X"71", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"01",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"E0",X"F8",X"3C",X"1F",X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"04",X"06",X"07",X"07",X"03",X"03",X"03", + X"00",X"00",X"10",X"10",X"02",X"12",X"10",X"10",X"18",X"0C",X"07",X"0F",X"07",X"07",X"03",X"81", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"18",X"1C",X"0F",X"07",X"03",X"01",X"11",X"08",X"00",X"00",X"00",X"1C",X"1F",X"07",X"03", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"07",X"03",X"01",X"00",X"00",X"18",X"1C",X"07",X"03",X"02",X"02",X"12",X"12",X"02",X"02",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"0C",X"05",X"01",X"10",X"10",X"10",X"10",X"02",X"02",X"00",X"00",X"18",X"0C",X"06",X"0E",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"08",X"0C",X"0F",X"0F",X"0F",X"07",X"01",X"00",X"02",X"02",X"02",X"02",X"00",X"00",X"00",X"08", + X"70",X"10",X"00",X"00",X"60",X"F0",X"F0",X"F0",X"70",X"10",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E7",X"67",X"61",X"60",X"60",X"60",X"70",X"50",X"00",X"00",X"00",X"80",X"80",X"C0",X"F0",X"F0", + X"80",X"F8",X"FC",X"FC",X"3C",X"1C",X"04",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"20",X"00",X"00",X"04",X"86",X"C7",X"E7",X"E1",X"60",X"60",X"00",X"00",X"00",X"C4",X"E6", + X"18",X"18",X"18",X"18",X"08",X"00",X"80",X"C0",X"F0",X"F8",X"3E",X"1F",X"07",X"03",X"00",X"00", + X"80",X"E4",X"E6",X"67",X"67",X"23",X"03",X"43",X"63",X"63",X"63",X"63",X"63",X"63",X"63",X"61", + X"03",X"01",X"00",X"00",X"00",X"30",X"38",X"3E",X"1F",X"07",X"03",X"00",X"00",X"00",X"18",X"18", + X"60",X"70",X"F3",X"F3",X"33",X"23",X"20",X"60",X"60",X"60",X"60",X"20",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"F0",X"FF",X"FF",X"7F",X"07",X"00",X"00",X"00",X"E0",X"20",X"03",X"03",X"03", + X"00",X"00",X"00",X"80",X"A0",X"B0",X"B0",X"B0",X"30",X"30",X"70",X"70",X"70",X"70",X"10",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"70",X"10",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"60",X"20",X"00",X"00",X"60",X"F0",X"F0",X"F0",X"70", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"F0",X"F0",X"F0",X"70",X"70",X"60",X"20",X"00",X"00",X"40",X"E0",X"E0",X"E0",X"60",X"60",X"60", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"F0",X"F0",X"F0",X"70",X"70",X"00",X"00",X"00",X"80",X"C0",X"E0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"06",X"06",X"06",X"02",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"18",X"08",X"08",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"03",X"01",X"00",X"00",X"0C",X"0F",X"07",X"03",X"03",X"01",X"00",X"00",X"00",X"04",X"04", + X"04",X"80",X"80",X"30",X"38",X"0E",X"07",X"01",X"80",X"C0",X"C0",X"E0",X"F1",X"70",X"38",X"38", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"03", + X"00",X"30",X"38",X"0C",X"04",X"00",X"00",X"30",X"38",X"0E",X"07",X"01",X"00",X"30",X"38",X"0C", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"3C",X"1E",X"0E",X"07",X"07",X"23",X"11",X"00",X"00",X"00",X"30",X"3C",X"3E",X"0F",X"07",X"01", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"20",X"30",X"38", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"E0",X"E1",X"E1",X"E0",X"E0",X"E0",X"E0",X"60",X"60",X"20",X"00",X"00",X"00",X"00",X"00",X"00", + X"C0",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"C1",X"F1",X"F9",X"39",X"19",X"09",X"01",X"C1",X"C1",X"41",X"80",X"C0",X"C0",X"C0",X"E0",X"E0", + X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"C1",X"C1",X"C1",X"C1",X"C1",X"F1",X"F9",X"39",X"19",X"09",X"01",X"C1",X"C1",X"C1",X"C1",X"C1", + X"80",X"A0",X"B0",X"3C",X"3C",X"0E",X"07",X"01",X"00",X"00",X"10",X"18",X"18",X"18",X"08",X"00", + X"00",X"00",X"00",X"01",X"81",X"C1",X"E1",X"F1",X"79",X"39",X"18",X"09",X"07",X"83",X"C3",X"C1", + X"C0",X"C0",X"C0",X"C0",X"C0",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"80",X"80",X"80", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"C0",X"C0",X"C0",X"C0",X"C0",X"C0", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"FC",X"FF",X"3F",X"1F",X"07",X"03",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"03",X"83",X"83",X"13",X"13",X"83",X"82",X"C0",X"C0",X"FF",X"9F",X"03",X"03",X"03",X"00",X"40", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"63",X"73",X"63",X"63",X"61",X"61",X"23",X"13",X"03",X"03",X"00",X"C0",X"E3",X"3B",X"1F",X"07", + X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00",X"00",X"80",X"80",X"80", + X"40",X"60",X"78",X"7C",X"7D",X"3D",X"0D",X"05",X"11",X"11",X"13",X"13",X"03",X"03",X"00",X"40", + X"00",X"00",X"00",X"00",X"00",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"80",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_palette.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_palette.vhd new file mode 100644 index 00000000..2b7c12e4 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_palette.vhd @@ -0,0 +1,38 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity travusa_spr_palette is +port ( + clk : in std_logic; + addr : in std_logic_vector(7 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of travusa_spr_palette is + type rom is array(0 to 255) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"01",X"02",X"03",X"04",X"05",X"06",X"07",X"00",X"02",X"08",X"01",X"03",X"05",X"04",X"07", + X"00",X"06",X"05",X"0A",X"02",X"04",X"0B",X"00",X"00",X"04",X"09",X"0A",X"01",X"06",X"05",X"00", + X"00",X"03",X"07",X"04",X"00",X"00",X"00",X"00",X"00",X"09",X"0A",X"04",X"05",X"0C",X"03",X"07", + X"00",X"01",X"08",X"02",X"03",X"05",X"04",X"07",X"00",X"02",X"08",X"06",X"03",X"05",X"04",X"07", + X"00",X"06",X"08",X"02",X"03",X"05",X"04",X"07",X"00",X"08",X"08",X"01",X"03",X"05",X"04",X"07", + X"00",X"02",X"08",X"01",X"03",X"05",X"04",X"07",X"00",X"07",X"02",X"08",X"04",X"05",X"01",X"03", + X"00",X"06",X"02",X"08",X"04",X"05",X"01",X"07",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"04",X"02",X"03",X"04",X"05",X"06",X"07",X"00",X"07",X"02",X"03",X"04",X"05",X"06",X"07", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_rgb_lut.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_rgb_lut.vhd new file mode 100644 index 00000000..e74e14cc --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/proms/travusa_spr_rgb_lut.vhd @@ -0,0 +1,24 @@ +library ieee; +use ieee.std_logic_1164.all,ieee.numeric_std.all; + +entity travusa_spr_rgb_lut is +port ( + clk : in std_logic; + addr : in std_logic_vector(4 downto 0); + data : out std_logic_vector(7 downto 0) +); +end entity; + +architecture prom of travusa_spr_rgb_lut is + type rom is array(0 to 31) of std_logic_vector(7 downto 0); + signal rom_data: rom := ( + X"00",X"C0",X"F8",X"2F",X"01",X"07",X"38",X"FF",X"D8",X"98",X"88",X"5A",X"9C",X"00",X"00",X"00", + X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00",X"00"); +begin +process(clk) +begin + if rising_edge(clk) then + data <= rom_data(to_integer(unsigned(addr))); + end if; +end process; +end architecture; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80.vhd new file mode 100644 index 00000000..2fd8f9f5 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80.vhd @@ -0,0 +1,1175 @@ +-------------------------------------------------------------------------------- +-- **** +-- T80(c) core. Attempt to finish all undocumented features and provide +-- accurate timings. +-- Version 350. +-- Copyright (c) 2018 Sorgelig +-- Test passed: ZEXDOC, ZEXALL, Z80Full(*), Z80memptr +-- (*) Currently only SCF and CCF instructions aren't passed X/Y flags check as +-- correct implementation is still unclear. +-- +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup. +-- +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- 0210 : Fixed wait and halt +-- 0211 : Fixed Refresh addition and IM 1 +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- 0232 : Removed refresh address output for Mode > 1 and added DJNZ M1_n fix by Mike Johnson +-- 0235 : Added clock enable and IM 2 fix by Mike Johnson +-- 0237 : Changed 8080 I/O address output, added IntE output +-- 0238 : Fixed (IX/IY+d) timing and 16 bit ADC and SBC zero flag +-- 0240 : Added interrupt ack fix by Mike Johnson, changed (IX/IY+d) timing and changed flags in GB mode +-- 0242 : Added I/O wait, fixed refresh address, moved some registers to RAM +-- 0247 : Fixed bus req/ack cycle +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use IEEE.STD_LOGIC_UNSIGNED.all; + +entity T80 is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 0 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic; + out0 : in std_logic := '0'; -- 0 => OUT(C),0, 1 => OUT(C),255 + REG : out std_logic_vector(211 downto 0); -- IFF2, IFF1, IM, IY, HL', DE', BC', IX, HL, DE, BC, PC, SP, R, I, F', A', F, A + + DIRSet : in std_logic := '0'; + DIR : in std_logic_vector(211 downto 0) := (others => '0') -- IFF2, IFF1, IM, IY, HL', DE', BC', IX, HL, DE, BC, PC, SP, R, I, F', A', F, A + ); +end T80; + +architecture rtl of T80 is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + -- Registers + signal ACC, F : std_logic_vector(7 downto 0); + signal Ap, Fp : std_logic_vector(7 downto 0); + signal I : std_logic_vector(7 downto 0); + signal R : unsigned(7 downto 0); + signal SP, PC : unsigned(15 downto 0); + + signal RegDIH : std_logic_vector(7 downto 0); + signal RegDIL : std_logic_vector(7 downto 0); + signal RegBusA : std_logic_vector(15 downto 0); + signal RegBusB : std_logic_vector(15 downto 0); + signal RegBusC : std_logic_vector(15 downto 0); + signal RegAddrA_r : std_logic_vector(2 downto 0); + signal RegAddrA : std_logic_vector(2 downto 0); + signal RegAddrB_r : std_logic_vector(2 downto 0); + signal RegAddrB : std_logic_vector(2 downto 0); + signal RegAddrC : std_logic_vector(2 downto 0); + signal RegWEH : std_logic; + signal RegWEL : std_logic; + signal Alternate : std_logic; + + -- Help Registers + signal WZ : std_logic_vector(15 downto 0); -- MEMPTR register + signal IR : std_logic_vector(7 downto 0); -- Instruction register + signal ISet : std_logic_vector(1 downto 0); -- Instruction set selector + signal RegBusA_r : std_logic_vector(15 downto 0); + + signal ID16 : signed(15 downto 0); + signal Save_Mux : std_logic_vector(7 downto 0); + + signal TState : unsigned(2 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal IntE_FF1 : std_logic; + signal IntE_FF2 : std_logic; + signal Halt_FF : std_logic; + signal BusReq_s : std_logic := '0'; + signal BusAck : std_logic := '0'; + signal ClkEn : std_logic; + signal NMI_s : std_logic; + signal IStatus : std_logic_vector(1 downto 0); + + signal DI_Reg : std_logic_vector(7 downto 0); + signal T_Res : std_logic; + signal XY_State : std_logic_vector(1 downto 0); + signal Pre_XY_F_M : std_logic_vector(2 downto 0); + signal NextIs_XY_Fetch : std_logic; + signal XY_Ind : std_logic; + signal No_BTR : std_logic; + signal BTR_r : std_logic; + signal Auto_Wait : std_logic; + signal Auto_Wait_t1 : std_logic; + signal Auto_Wait_t2 : std_logic; + signal IncDecZ : std_logic; + + -- ALU signals + signal BusB : std_logic_vector(7 downto 0); + signal BusA : std_logic_vector(7 downto 0); + signal ALU_Q : std_logic_vector(7 downto 0); + signal F_Out : std_logic_vector(7 downto 0); + + -- Registered micro code outputs + signal Read_To_Reg_r : std_logic_vector(4 downto 0); + signal Arith16_r : std_logic; + signal Z16_r : std_logic; + signal ALU_Op_r : std_logic_vector(3 downto 0); + signal Save_ALU_r : std_logic; + signal PreserveC_r : std_logic; + signal MCycles : std_logic_vector(2 downto 0); + + -- Micro code outputs + signal MCycles_d : std_logic_vector(2 downto 0); + signal TStates : std_logic_vector(2 downto 0); + signal IntCycle : std_logic; + signal NMICycle : std_logic; + signal Inc_PC : std_logic; + signal Inc_WZ : std_logic; + signal IncDec_16 : std_logic_vector(3 downto 0); + signal Prefix : std_logic_vector(1 downto 0); + signal Read_To_Acc : std_logic; + signal Read_To_Reg : std_logic; + signal Set_BusB_To : std_logic_vector(3 downto 0); + signal Set_BusA_To : std_logic_vector(3 downto 0); + signal ALU_Op : std_logic_vector(3 downto 0); + signal Save_ALU : std_logic; + signal PreserveC : std_logic; + signal Arith16 : std_logic; + signal Set_Addr_To : std_logic_vector(2 downto 0); + signal Jump : std_logic; + signal JumpE : std_logic; + signal JumpXY : std_logic; + signal Call : std_logic; + signal RstP : std_logic; + signal LDZ : std_logic; + signal LDW : std_logic; + signal LDSPHL : std_logic; + signal IORQ_i : std_logic; + signal Special_LD : std_logic_vector(2 downto 0); + signal ExchangeDH : std_logic; + signal ExchangeRp : std_logic; + signal ExchangeAF : std_logic; + signal ExchangeRS : std_logic; + signal I_DJNZ : std_logic; + signal I_CPL : std_logic; + signal I_CCF : std_logic; + signal I_SCF : std_logic; + signal I_RETN : std_logic; + signal I_BT : std_logic; + signal I_BC : std_logic; + signal I_BTR : std_logic; + signal I_RLD : std_logic; + signal I_RRD : std_logic; + signal I_RXDD : std_logic; + signal I_INRC : std_logic; + signal SetWZ : std_logic_vector(1 downto 0); + signal SetDI : std_logic; + signal SetEI : std_logic; + signal IMode : std_logic_vector(1 downto 0); + signal Halt : std_logic; + signal XYbit_undoc : std_logic; + signal DOR : std_logic_vector(127 downto 0); + +begin + + REG <= IntE_FF2 & IntE_FF1 & IStatus & DOR & std_logic_vector(PC) & std_logic_vector(SP) & std_logic_vector(R) & I & Fp & Ap & F & ACC when Alternate = '0' + else IntE_FF2 & IntE_FF1 & IStatus & DOR(127 downto 112) & DOR(47 downto 0) & DOR(63 downto 48) & DOR(111 downto 64) & + std_logic_vector(PC) & std_logic_vector(SP) & std_logic_vector(R) & I & Fp & Ap & F & ACC; + + mcode : work.T80_MCode + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + IR => IR, + ISet => ISet, + MCycle => MCycle, + F => F, + NMICycle => NMICycle, + IntCycle => IntCycle, + XY_State => XY_State, + MCycles => MCycles_d, + TStates => TStates, + Prefix => Prefix, + Inc_PC => Inc_PC, + Inc_WZ => Inc_WZ, + IncDec_16 => IncDec_16, + Read_To_Acc => Read_To_Acc, + Read_To_Reg => Read_To_Reg, + Set_BusB_To => Set_BusB_To, + Set_BusA_To => Set_BusA_To, + ALU_Op => ALU_Op, + Save_ALU => Save_ALU, + PreserveC => PreserveC, + Arith16 => Arith16, + Set_Addr_To => Set_Addr_To, + IORQ => IORQ_i, + Jump => Jump, + JumpE => JumpE, + JumpXY => JumpXY, + Call => Call, + RstP => RstP, + LDZ => LDZ, + LDW => LDW, + LDSPHL => LDSPHL, + Special_LD => Special_LD, + ExchangeDH => ExchangeDH, + ExchangeRp => ExchangeRp, + ExchangeAF => ExchangeAF, + ExchangeRS => ExchangeRS, + I_DJNZ => I_DJNZ, + I_CPL => I_CPL, + I_CCF => I_CCF, + I_SCF => I_SCF, + I_RETN => I_RETN, + I_BT => I_BT, + I_BC => I_BC, + I_BTR => I_BTR, + I_RLD => I_RLD, + I_RRD => I_RRD, + I_INRC => I_INRC, + SetWZ => SetWZ, + SetDI => SetDI, + SetEI => SetEI, + IMode => IMode, + Halt => Halt, + NoRead => NoRead, + Write => Write, + XYbit_undoc => XYbit_undoc); + + alu : work.T80_ALU + generic map( + Mode => Mode, + Flag_C => Flag_C, + Flag_N => Flag_N, + Flag_P => Flag_P, + Flag_X => Flag_X, + Flag_H => Flag_H, + Flag_Y => Flag_Y, + Flag_Z => Flag_Z, + Flag_S => Flag_S) + port map( + Arith16 => Arith16_r, + Z16 => Z16_r, + WZ => WZ, + XY_State=> XY_State, + ALU_Op => ALU_Op_r, + IR => IR(5 downto 0), + ISet => ISet, + BusA => BusA, + BusB => BusB, + F_In => F, + Q => ALU_Q, + F_Out => F_Out); + + ClkEn <= CEN and not BusAck; + + T_Res <= '1' when TState = unsigned(TStates) else '0'; + + NextIs_XY_Fetch <= '1' when XY_State /= "00" and XY_Ind = '0' and + ((Set_Addr_To = aXY) or + (MCycle = "001" and IR = "11001011") or + (MCycle = "001" and IR = "00110110")) else '0'; + + Save_Mux <= BusB when ExchangeRp = '1' else + DI_Reg when Save_ALU_r = '0' else + ALU_Q; + + process (RESET_n, CLK_n) + variable n : std_logic_vector(7 downto 0); + variable ioq : std_logic_vector(8 downto 0); + begin + if RESET_n = '0' then + PC <= (others => '0'); -- Program Counter + A <= (others => '0'); + WZ <= (others => '0'); + IR <= "00000000"; + ISet <= "00"; + XY_State <= "00"; + IStatus <= "00"; + MCycles <= "000"; + DO <= "00000000"; + + ACC <= (others => '1'); + F <= (others => '1'); + Ap <= (others => '1'); + Fp <= (others => '1'); + I <= (others => '0'); + R <= (others => '0'); + SP <= (others => '1'); + Alternate <= '0'; + + Read_To_Reg_r <= "00000"; + Arith16_r <= '0'; + BTR_r <= '0'; + Z16_r <= '0'; + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + PreserveC_r <= '0'; + XY_Ind <= '0'; + I_RXDD <= '0'; + + elsif rising_edge(CLK_n) then + + if DIRSet = '1' then + ACC <= DIR( 7 downto 0); + F <= DIR(15 downto 8); + Ap <= DIR(23 downto 16); + Fp <= DIR(31 downto 24); + I <= DIR(39 downto 32); + R <= unsigned(DIR(47 downto 40)); + SP <= unsigned(DIR(63 downto 48)); + PC <= unsigned(DIR(79 downto 64)); + A <= DIR(79 downto 64); + IStatus <= DIR(209 downto 208); + + elsif ClkEn = '1' then + ALU_Op_r <= "0000"; + Save_ALU_r <= '0'; + Read_To_Reg_r <= "00000"; + + MCycles <= MCycles_d; + + if IMode /= "11" then + IStatus <= IMode; + end if; + + Arith16_r <= Arith16; + PreserveC_r <= PreserveC; + if ISet = "10" and ALU_OP(2) = '0' and ALU_OP(0) = '1' and MCycle = "011" then + Z16_r <= '1'; + else + Z16_r <= '0'; + end if; + + if MCycle = "001" and TState(2) = '0' then + -- MCycle = 1 and TState = 1, 2, or 3 + + if TState = 2 and Wait_n = '1' then + if Mode < 2 then + A(7 downto 0) <= std_logic_vector(R); + A(15 downto 8) <= I; + R(6 downto 0) <= R(6 downto 0) + 1; + end if; + + if Jump = '0' and Call = '0' and NMICycle = '0' and IntCycle = '0' and not (Halt_FF = '1' or Halt = '1') then + PC <= PC + 1; + end if; + + if IntCycle = '1' and IStatus = "01" then + IR <= "11111111"; + elsif Halt_FF = '1' or (IntCycle = '1' and IStatus = "10") or NMICycle = '1' then + IR <= "00000000"; + else + IR <= DInst; + end if; + + ISet <= "00"; + if Prefix /= "00" then + if Prefix = "11" then + if IR(5) = '1' then + XY_State <= "10"; + else + XY_State <= "01"; + end if; + else + if Prefix = "10" then + XY_State <= "00"; + XY_Ind <= '0'; + end if; + ISet <= Prefix; + end if; + else + XY_State <= "00"; + XY_Ind <= '0'; + end if; + end if; + + else + -- either (MCycle > 1) OR (MCycle = 1 AND TState > 3) + + if MCycle = "110" then + XY_Ind <= '1'; + if Prefix = "01" then + ISet <= "01"; + end if; + end if; + + if T_Res = '1' then + BTR_r <= (I_BT or I_BC or I_BTR) and not No_BTR; + if Jump = '1' then + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= WZ(7 downto 0); + PC(15 downto 8) <= unsigned(DI_Reg); + PC(7 downto 0) <= unsigned(WZ(7 downto 0)); + elsif JumpXY = '1' then + A <= RegBusC; + PC <= unsigned(RegBusC); + elsif Call = '1' or RstP = '1' then + A <= WZ; + PC <= unsigned(WZ); + elsif MCycle = MCycles and NMICycle = '1' then + A <= "0000000001100110"; + PC <= "0000000001100110"; + elsif MCycle = "011" and IntCycle = '1' and IStatus = "10" then + A(15 downto 8) <= I; + A(7 downto 0) <= WZ(7 downto 0); + PC(15 downto 8) <= unsigned(I); + PC(7 downto 0) <= unsigned(WZ(7 downto 0)); + else + case Set_Addr_To is + when aXY => + if XY_State = "00" then + A <= RegBusC; + else + if NextIs_XY_Fetch = '1' then + A <= std_logic_vector(PC); + else + A <= WZ; + end if; + end if; + when aIOA => + if Mode = 3 then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + elsif Mode = 2 then + -- Duplicate I/O address on 8080 + A(15 downto 8) <= DI_Reg; + else + A(15 downto 8) <= ACC; + end if; + A(7 downto 0) <= DI_Reg; + WZ <= (ACC & DI_Reg) + "1"; + when aSP => + A <= std_logic_vector(SP); + when aBC => + if Mode = 3 and IORQ_i = '1' then + -- Memory map I/O on GBZ80 + A(15 downto 8) <= (others => '1'); + A(7 downto 0) <= RegBusC(7 downto 0); + else + A <= RegBusC; + if SetWZ = "01" then + WZ <= RegBusC + "1"; + end if; + if SetWZ = "10" then + WZ(7 downto 0) <= RegBusC(7 downto 0) + "1"; + WZ(15 downto 8) <= ACC; + end if; + end if; + when aDE => + A <= RegBusC; + if SetWZ = "10" then + WZ(7 downto 0) <= RegBusC(7 downto 0) + "1"; + WZ(15 downto 8) <= ACC; + end if; + when aZI => + if Inc_WZ = '1' then + A <= std_logic_vector(unsigned(WZ) + 1); + else + A(15 downto 8) <= DI_Reg; + A(7 downto 0) <= WZ(7 downto 0); + if SetWZ = "10" then + WZ(7 downto 0) <= WZ(7 downto 0) + "1"; + WZ(15 downto 8) <= ACC; + end if; + end if; + when others => + A <= std_logic_vector(PC); + end case; + end if; + + if SetWZ = "11" then + WZ <= std_logic_vector(ID16); + end if; + + Save_ALU_r <= Save_ALU; + ALU_Op_r <= ALU_Op; + + if I_CPL = '1' then + -- CPL + ACC <= not ACC; + F(Flag_Y) <= not ACC(5); + F(Flag_H) <= '1'; + F(Flag_X) <= not ACC(3); + F(Flag_N) <= '1'; + end if; + if I_CCF = '1' then + -- CCF + F(Flag_C) <= not F(Flag_C); + F(Flag_Y) <= ACC(5); + F(Flag_H) <= F(Flag_C); + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + if I_SCF = '1' then + -- SCF + F(Flag_C) <= '1'; + F(Flag_Y) <= ACC(5); + F(Flag_H) <= '0'; + F(Flag_X) <= ACC(3); + F(Flag_N) <= '0'; + end if; + end if; + + if (TState = 2 and I_BTR = '1' and IR(0) = '1') or (TState = 1 and I_BTR = '1' and IR(0) = '0') then + ioq := ('0' & DI_Reg) + ('0' & std_logic_vector(ID16(7 downto 0))); + F(Flag_N) <= DI_Reg(7); + F(Flag_C) <= ioq(8); + F(Flag_H) <= ioq(8); + ioq := (ioq and x"7") xor ('0'&BusA); + F(Flag_P) <= not (ioq(0) xor ioq(1) xor ioq(2) xor ioq(3) xor ioq(4) xor ioq(5) xor ioq(6) xor ioq(7)); + end if; + + if TState = 2 and Wait_n = '1' then + if ISet = "01" and MCycle = "111" then + IR <= DInst; + end if; + if JumpE = '1' then + PC <= unsigned(signed(PC) + signed(DI_Reg)); + WZ <= std_logic_vector(signed(PC) + signed(DI_Reg)); + elsif Inc_PC = '1' then + PC <= PC + 1; + end if; + if BTR_r = '1' then + PC <= PC - 2; + end if; + if RstP = '1' then + WZ <= (others =>'0'); + WZ(5 downto 3) <= IR(5 downto 3); + end if; + end if; + if TState = 3 and MCycle = "110" then + WZ <= std_logic_vector(signed(RegBusC) + signed(DI_Reg)); + end if; + + if MCycle = "011" and TState = 4 and No_BTR = '0' then + if I_BT = '1' or I_BC = '1' then + WZ <= std_logic_vector(PC)-"1"; + end if; + end if; + + if (TState = 2 and Wait_n = '1') or (TState = 4 and MCycle = "001") then + if IncDec_16(2 downto 0) = "111" then + if IncDec_16(3) = '1' then + SP <= SP - 1; + else + SP <= SP + 1; + end if; + end if; + end if; + + if LDSPHL = '1' then + SP <= unsigned(RegBusC); + end if; + if ExchangeAF = '1' then + Ap <= ACC; + ACC <= Ap; + Fp <= F; + F <= Fp; + end if; + if ExchangeRS = '1' then + Alternate <= not Alternate; + end if; + end if; + + if TState = 3 then + if LDZ = '1' then + WZ(7 downto 0) <= DI_Reg; + end if; + if LDW = '1' then + WZ(15 downto 8) <= DI_Reg; + end if; + + if Special_LD(2) = '1' then + case Special_LD(1 downto 0) is + when "00" => + ACC <= I; + F(Flag_P) <= IntE_FF2; + F(Flag_S) <= I(7); + + if I = x"00" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + + F(Flag_Y) <= I(5); + F(Flag_H) <= '0'; + F(Flag_X) <= I(3); + F(Flag_N) <= '0'; + + + when "01" => + ACC <= std_logic_vector(R); + F(Flag_P) <= IntE_FF2; + F(Flag_S) <= R(7); + + if R = x"00" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + + F(Flag_Y) <= R(5); + F(Flag_H) <= '0'; + F(Flag_X) <= R(3); + F(Flag_N) <= '0'; + + when "10" => + I <= ACC; + when others => + R <= unsigned(ACC); + end case; + end if; + end if; + + if (I_DJNZ = '0' and Save_ALU_r = '1') or ALU_Op_r = "1001" then + if Mode = 3 then + F(6) <= F_Out(6); + F(5) <= F_Out(5); + F(7) <= F_Out(7); + if PreserveC_r = '0' then + F(4) <= F_Out(4); + end if; + else + F(7 downto 1) <= F_Out(7 downto 1); + if PreserveC_r = '0' then + F(Flag_C) <= F_Out(0); + end if; + end if; + end if; + if T_Res = '1' and I_INRC = '1' then + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + F(Flag_X) <= DI_Reg(3); + F(Flag_Y) <= DI_Reg(5); + if DI_Reg(7 downto 0) = "00000000" then + F(Flag_Z) <= '1'; + else + F(Flag_Z) <= '0'; + end if; + F(Flag_S) <= DI_Reg(7); + F(Flag_P) <= not (DI_Reg(0) xor DI_Reg(1) xor DI_Reg(2) xor DI_Reg(3) xor + DI_Reg(4) xor DI_Reg(5) xor DI_Reg(6) xor DI_Reg(7)); + end if; + + if TState = 1 and Auto_Wait_t1 = '0' then + -- Keep D0 from M3 for RLD/RRD (Sorgelig) + I_RXDD <= I_RLD or I_RRD; + if I_RXDD='0' then + DO <= BusB; + end if; + if I_RLD = '1' then + DO(3 downto 0) <= BusA(3 downto 0); + DO(7 downto 4) <= BusB(3 downto 0); + end if; + if I_RRD = '1' then + DO(3 downto 0) <= BusB(7 downto 4); + DO(7 downto 4) <= BusA(3 downto 0); + end if; + end if; + + if T_Res = '1' then + Read_To_Reg_r(3 downto 0) <= Set_BusA_To; + Read_To_Reg_r(4) <= Read_To_Reg; + if Read_To_Acc = '1' then + Read_To_Reg_r(3 downto 0) <= "0111"; + Read_To_Reg_r(4) <= '1'; + end if; + end if; + + if TState = 1 and I_BT = '1' then + F(Flag_X) <= ALU_Q(3); + F(Flag_Y) <= ALU_Q(1); + F(Flag_H) <= '0'; + F(Flag_N) <= '0'; + end if; + if TState = 1 and I_BC = '1' then + n := ALU_Q - ("0000000" & F_Out(Flag_H)); + F(Flag_X) <= n(3); + F(Flag_Y) <= n(1); + end if; + if I_BC = '1' or I_BT = '1' then + F(Flag_P) <= IncDecZ; + end if; + + if (TState = 1 and Save_ALU_r = '0' and Auto_Wait_t1 = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10111" => + ACC <= Save_Mux; + when "10110" => + DO <= Save_Mux; + when "11000" => + SP(7 downto 0) <= unsigned(Save_Mux); + when "11001" => + SP(15 downto 8) <= unsigned(Save_Mux); + when "11011" => + F <= Save_Mux; + when others => + end case; + if XYbit_undoc='1' then + DO <= ALU_Q; + end if; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- BC('), DE('), HL('), IX and IY +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if rising_edge(CLK_n) then + if ClkEn = '1' then + -- Bus A / Write + RegAddrA_r <= Alternate & Set_BusA_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusA_To(2 downto 1) = "10" then + RegAddrA_r <= XY_State(1) & "11"; + end if; + + -- Bus B + RegAddrB_r <= Alternate & Set_BusB_To(2 downto 1); + if XY_Ind = '0' and XY_State /= "00" and Set_BusB_To(2 downto 1) = "10" then + RegAddrB_r <= XY_State(1) & "11"; + end if; + + -- Address from register + RegAddrC <= Alternate & Set_Addr_To(1 downto 0); + -- Jump (HL), LD SP,HL + if (JumpXY = '1' or LDSPHL = '1') then + RegAddrC <= Alternate & "10"; + end if; + if ((JumpXY = '1' or LDSPHL = '1') and XY_State /= "00") or (MCycle = "110") then + RegAddrC <= XY_State(1) & "11"; + end if; + + if I_DJNZ = '1' and Save_ALU_r = '1' and Mode < 2 then + IncDecZ <= F_Out(Flag_Z); + end if; + if (TState = 2 or (TState = 3 and MCycle = "001")) and IncDec_16(2 downto 0) = "100" then + if ID16 = 0 then + IncDecZ <= '0'; + else + IncDecZ <= '1'; + end if; + end if; + + RegBusA_r <= RegBusA; + end if; + end if; + end process; + + RegAddrA <= + -- 16 bit increment/decrement + Alternate & IncDec_16(1 downto 0) when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and XY_State = "00" else + XY_State(1) & "11" when (TState = 2 or + (TState = 3 and MCycle = "001" and IncDec_16(2) = '1')) and IncDec_16(1 downto 0) = "10" else + -- EX HL,DL + Alternate & "10" when ExchangeDH = '1' and TState = 3 else + Alternate & "01" when ExchangeDH = '1' and TState = 4 else + -- Bus A / Write + RegAddrA_r; + + RegAddrB <= + -- EX HL,DL + Alternate & "01" when ExchangeDH = '1' and TState = 3 else + -- Bus B + RegAddrB_r; + + ID16 <= signed(RegBusA) - 1 when IncDec_16(3) = '1' else + signed(RegBusA) + 1; + + process (Save_ALU_r, Auto_Wait_t1, ALU_OP_r, Read_To_Reg_r, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegWEH <= '0'; + RegWEL <= '0'; + if (TState = 1 and Save_ALU_r = '0' and Auto_Wait_t1 = '0') or + (Save_ALU_r = '1' and ALU_OP_r /= "0111") then + case Read_To_Reg_r is + when "10000" | "10001" | "10010" | "10011" | "10100" | "10101" => + RegWEH <= not Read_To_Reg_r(0); + RegWEL <= Read_To_Reg_r(0); + when others => + end case; + end if; + + if ExchangeDH = '1' and (TState = 3 or TState = 4) then + RegWEH <= '1'; + RegWEL <= '1'; + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and Wait_n = '1' and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + case IncDec_16(1 downto 0) is + when "00" | "01" | "10" => + RegWEH <= '1'; + RegWEL <= '1'; + when others => + end case; + end if; + end process; + + process (Save_Mux, RegBusB, RegBusA_r, ID16, + ExchangeDH, IncDec_16, MCycle, TState, Wait_n) + begin + RegDIH <= Save_Mux; + RegDIL <= Save_Mux; + + if ExchangeDH = '1' and TState = 3 then + RegDIH <= RegBusB(15 downto 8); + RegDIL <= RegBusB(7 downto 0); + end if; + if ExchangeDH = '1' and TState = 4 then + RegDIH <= RegBusA_r(15 downto 8); + RegDIL <= RegBusA_r(7 downto 0); + end if; + + if IncDec_16(2) = '1' and ((TState = 2 and MCycle /= "001") or (TState = 3 and MCycle = "001")) then + RegDIH <= std_logic_vector(ID16(15 downto 8)); + RegDIL <= std_logic_vector(ID16(7 downto 0)); + end if; + end process; + + Regs : work.T80_Reg + port map( + Clk => CLK_n, + CEN => ClkEn, + WEH => RegWEH, + WEL => RegWEL, + AddrA => RegAddrA, + AddrB => RegAddrB, + AddrC => RegAddrC, + DIH => RegDIH, + DIL => RegDIL, + DOAH => RegBusA(15 downto 8), + DOAL => RegBusA(7 downto 0), + DOBH => RegBusB(15 downto 8), + DOBL => RegBusB(7 downto 0), + DOCH => RegBusC(15 downto 8), + DOCL => RegBusC(7 downto 0), + DOR => DOR, + DIRSet => DIRSet, + DIR => DIR(207 downto 80)); + +--------------------------------------------------------------------------- +-- +-- Buses +-- +--------------------------------------------------------------------------- + process (CLK_n) + begin + if rising_edge(CLK_n) then + if ClkEn = '1' then + case Set_BusB_To is + when "0111" => + BusB <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusB_To(0) = '1' then + BusB <= RegBusB(7 downto 0); + else + BusB <= RegBusB(15 downto 8); + end if; + when "0110" => + BusB <= DI_Reg; + when "1000" => + BusB <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusB <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusB <= "00000001"; + when "1011" => + BusB <= F; + when "1100" => + BusB <= std_logic_vector(PC(7 downto 0)); + when "1101" => + BusB <= std_logic_vector(PC(15 downto 8)); + when "1110" => + if IR = x"71" and out0 = '1' then + BusB <= "11111111"; + else + BusB <= "00000000"; + end if; + when others => + BusB <= "--------"; + end case; + + case Set_BusA_To is + when "0111" => + BusA <= ACC; + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" => + if Set_BusA_To(0) = '1' then + BusA <= RegBusA(7 downto 0); + else + BusA <= RegBusA(15 downto 8); + end if; + when "0110" => + BusA <= DI_Reg; + when "1000" => + BusA <= std_logic_vector(SP(7 downto 0)); + when "1001" => + BusA <= std_logic_vector(SP(15 downto 8)); + when "1010" => + BusA <= "00000000"; + when others => + BusA <= "--------"; + end case; + if XYbit_undoc='1' then + BusA <= DI_Reg; + BusB <= DI_Reg; + end if; + end if; + end if; + end process; + +--------------------------------------------------------------------------- +-- +-- Generate external control signals +-- +--------------------------------------------------------------------------- + process (RESET_n,CLK_n) + begin + if RESET_n = '0' then + RFSH_n <= '1'; + elsif rising_edge(CLK_n) then + if DIRSet = '0' and CEN = '1' then + if MCycle = "001" and ((TState = 2 and Wait_n = '1') or TState = 3) then + RFSH_n <= '0'; + else + RFSH_n <= '1'; + end if; + end if; + end if; + end process; + + MC <= std_logic_vector(MCycle); + TS <= std_logic_vector(TState); + DI_Reg <= DI; + HALT_n <= not Halt_FF; + BUSAK_n <= not (BusAck and RESET_n); + IntCycle_n <= not IntCycle; + IntE <= IntE_FF1; + IORQ <= IORQ_i; + Stop <= I_DJNZ; + +------------------------------------------------------------------------- +-- +-- Main state machine +-- +------------------------------------------------------------------------- + process (RESET_n, CLK_n) + variable OldNMI_n : std_logic; + begin + if RESET_n = '0' then + MCycle <= "001"; + TState <= "000"; + Pre_XY_F_M <= "000"; + Halt_FF <= '0'; + --BusAck <= '0'; + NMICycle <= '0'; + IntCycle <= '0'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + No_BTR <= '0'; + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + M1_n <= '1'; + --BusReq_s <= '0'; + NMI_s <= '0'; + elsif rising_edge(CLK_n) then + + if DIRSet = '1' then + IntE_FF2 <= DIR(211); + IntE_FF1 <= DIR(210); + else + if NMI_n = '0' and OldNMI_n = '1' then + NMI_s <= '1'; + end if; + OldNMI_n := NMI_n; + + if CEN = '1' then + BusReq_s <= not BUSRQ_n; + Auto_Wait_t2 <= Auto_Wait_t1; + if T_Res = '1' then + Auto_Wait_t1 <= '0'; + Auto_Wait_t2 <= '0'; + else + Auto_Wait_t1 <= Auto_Wait or IORQ_i; + end if; + No_BTR <= (I_BT and (not IR(4) or not F(Flag_P))) or + (I_BC and (not IR(4) or F(Flag_Z) or not F(Flag_P))) or + (I_BTR and (not IR(4) or F(Flag_Z))); + if TState = 2 then + if SetEI = '1' then + IntE_FF1 <= '1'; + IntE_FF2 <= '1'; + end if; + if I_RETN = '1' then + IntE_FF1 <= IntE_FF2; + end if; + end if; + if TState = 3 then + if SetDI = '1' then + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + end if; + if IntCycle = '1' or NMICycle = '1' then + Halt_FF <= '0'; + end if; + if MCycle = "001" and TState = 2 and Wait_n = '1' then + M1_n <= '1'; + end if; + if BusReq_s = '1' and BusAck = '1' then + else + BusAck <= '0'; + if TState = 2 and Wait_n = '0' then + elsif T_Res = '1' then + if Halt = '1' then + Halt_FF <= '1'; + end if; + if BusReq_s = '1' then + BusAck <= '1'; + else + TState <= "001"; + if NextIs_XY_Fetch = '1' then + MCycle <= "110"; + Pre_XY_F_M <= MCycle; + if IR = "00110110" and Mode = 0 then + Pre_XY_F_M <= "010"; + end if; + elsif (MCycle = "111") or (MCycle = "110" and Mode = 1 and ISet /= "01") then + MCycle <= std_logic_vector(unsigned(Pre_XY_F_M) + 1); + elsif (MCycle = MCycles) or No_BTR = '1' or (MCycle = "010" and I_DJNZ = '1' and IncDecZ = '1') then + M1_n <= '0'; + MCycle <= "001"; + IntCycle <= '0'; + NMICycle <= '0'; + if NMI_s = '1' and Prefix = "00" then + NMI_s <= '0'; + NMICycle <= '1'; + IntE_FF1 <= '0'; + elsif IntE_FF1 = '1' and INT_n='0' and Prefix = "00" and SetEI = '0' then + IntCycle <= '1'; + IntE_FF1 <= '0'; + IntE_FF2 <= '0'; + end if; + else + MCycle <= std_logic_vector(unsigned(MCycle) + 1); + end if; + end if; + else + if (Auto_Wait = '1' and Auto_Wait_t2 = '0') nor + (IOWait = 1 and IORQ_i = '1' and Auto_Wait_t1 = '0') then + TState <= TState + 1; + end if; + end if; + end if; + if TState = 0 then + M1_n <= '0'; + end if; + end if; + end if; + end if; + end process; + + Auto_Wait <= '1' when IntCycle = '1' and MCycle = "001" else '0'; +end; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80_ALU.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80_ALU.vhd new file mode 100644 index 00000000..a9438aed --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80_ALU.vhd @@ -0,0 +1,376 @@ +-------------------------------------------------------------------------------- +-- **** +-- T80(c) core. Attempt to finish all undocumented features and provide +-- accurate timings. +-- Version 350. +-- Copyright (c) 2018 Sorgelig +-- Test passed: ZEXDOC, ZEXALL, Z80Full(*), Z80memptr +-- (*) Currently only SCF and CCF instructions aren't passed X/Y flags check as +-- correct implementation is still unclear. +-- +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- Ver 301 parity flag is just parity for 8080, also overflow for Z80, by Sean Riddle +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- Z80 compatible microprocessor core +-- +-- Version : 0247 +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- 0238 : Fixed zero flag for 16 bit SBC and ADC +-- 0240 : Added GB operations +-- 0242 : Cleanup +-- 0247 : Cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_ALU is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + WZ : in std_logic_vector(15 downto 0); + XY_State : in std_logic_vector(1 downto 0); + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); +end T80_ALU; + +architecture rtl of T80_ALU is + + procedure AddSub(A : std_logic_vector; + B : std_logic_vector; + Sub : std_logic; + Carry_In : std_logic; + signal Res : out std_logic_vector; + signal Carry : out std_logic) is + + variable B_i : unsigned(A'length - 1 downto 0); + variable Res_i : unsigned(A'length + 1 downto 0); + begin + if Sub = '1' then + B_i := not unsigned(B); + else + B_i := unsigned(B); + end if; + + Res_i := unsigned("0" & A & Carry_In) + unsigned("0" & B_i & "1"); + Carry <= Res_i(A'length + 1); + Res <= std_logic_vector(Res_i(A'length downto 1)); + end; + + -- AddSub variables (temporary signals) + signal UseCarry : std_logic; + signal Carry7_v : std_logic; + signal Overflow_v : std_logic; + signal HalfCarry_v : std_logic; + signal Carry_v : std_logic; + signal Q_v : std_logic_vector(7 downto 0); + + signal BitMask : std_logic_vector(7 downto 0); + +begin + + with IR(5 downto 3) select BitMask <= "00000001" when "000", + "00000010" when "001", + "00000100" when "010", + "00001000" when "011", + "00010000" when "100", + "00100000" when "101", + "01000000" when "110", + "10000000" when others; + + UseCarry <= not ALU_Op(2) and ALU_Op(0); + AddSub(BusA(3 downto 0), BusB(3 downto 0), ALU_Op(1), ALU_Op(1) xor (UseCarry and F_In(Flag_C)), Q_v(3 downto 0), HalfCarry_v); + AddSub(BusA(6 downto 4), BusB(6 downto 4), ALU_Op(1), HalfCarry_v, Q_v(6 downto 4), Carry7_v); + AddSub(BusA(7 downto 7), BusB(7 downto 7), ALU_Op(1), Carry7_v, Q_v(7 downto 7), Carry_v); + + -- bug fix - parity flag is just parity for 8080, also overflow for Z80 + process (Carry_v, Carry7_v, Q_v) + begin + if(Mode=2) then + OverFlow_v <= not (Q_v(0) xor Q_v(1) xor Q_v(2) xor Q_v(3) xor + Q_v(4) xor Q_v(5) xor Q_v(6) xor Q_v(7)); else + OverFlow_v <= Carry_v xor Carry7_v; + end if; + end process; + + process (Arith16, ALU_OP, F_In, BusA, BusB, IR, Q_v, Carry_v, HalfCarry_v, OverFlow_v, BitMask, ISet, Z16, WZ, XY_State) + variable Q_t : std_logic_vector(7 downto 0); + variable DAA_Q : unsigned(8 downto 0); + begin + Q_t := "--------"; + F_Out <= F_In; + DAA_Q := "---------"; + case ALU_Op is + when "0000" | "0001" | "0010" | "0011" | "0100" | "0101" | "0110" | "0111" => + F_Out(Flag_N) <= '0'; + F_Out(Flag_C) <= '0'; + case ALU_OP(2 downto 0) is + when "000" | "001" => -- ADD, ADC + Q_t := Q_v; + F_Out(Flag_C) <= Carry_v; + F_Out(Flag_H) <= HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "010" | "011" | "111" => -- SUB, SBC, CP + Q_t := Q_v; + F_Out(Flag_N) <= '1'; + F_Out(Flag_C) <= not Carry_v; + F_Out(Flag_H) <= not HalfCarry_v; + F_Out(Flag_P) <= OverFlow_v; + when "100" => -- AND + Q_t(7 downto 0) := BusA and BusB; + F_Out(Flag_H) <= '1'; + when "101" => -- XOR + Q_t(7 downto 0) := BusA xor BusB; + F_Out(Flag_H) <= '0'; + when others => -- OR "110" + Q_t(7 downto 0) := BusA or BusB; + F_Out(Flag_H) <= '0'; + end case; + if ALU_Op(2 downto 0) = "111" then -- CP + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + else + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + end if; + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + if Z16 = '1' then + F_Out(Flag_Z) <= F_In(Flag_Z); -- 16 bit ADC,SBC + end if; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + case ALU_Op(2 downto 0) is + when "000" | "001" | "010" | "011" | "111" => -- ADD, ADC, SUB, SBC, CP + when others => + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + end case; + if Arith16 = '1' then + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + F_Out(Flag_P) <= F_In(Flag_P); + end if; + when "1100" => + -- DAA + F_Out(Flag_H) <= F_In(Flag_H); + F_Out(Flag_C) <= F_In(Flag_C); + DAA_Q(7 downto 0) := unsigned(BusA); + DAA_Q(8) := '0'; + if F_In(Flag_N) = '0' then + -- After addition + -- Alow > 9 or H = 1 + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if (DAA_Q(3 downto 0) > 9) then + F_Out(Flag_H) <= '1'; + else + F_Out(Flag_H) <= '0'; + end if; + DAA_Q := DAA_Q + 6; + end if; + -- new Ahigh > 9 or C = 1 + if DAA_Q(8 downto 4) > 9 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q + 96; -- 0x60 + end if; + else + -- After subtraction + if DAA_Q(3 downto 0) > 9 or F_In(Flag_H) = '1' then + if DAA_Q(3 downto 0) > 5 then + F_Out(Flag_H) <= '0'; + end if; + DAA_Q(7 downto 0) := DAA_Q(7 downto 0) - 6; + end if; + if unsigned(BusA) > 153 or F_In(Flag_C) = '1' then + DAA_Q := DAA_Q - 352; -- 0x160 + end if; + end if; + F_Out(Flag_X) <= DAA_Q(3); + F_Out(Flag_Y) <= DAA_Q(5); + F_Out(Flag_C) <= F_In(Flag_C) or DAA_Q(8); + Q_t := std_logic_vector(DAA_Q(7 downto 0)); + if DAA_Q(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= DAA_Q(7); + F_Out(Flag_P) <= not (DAA_Q(0) xor DAA_Q(1) xor DAA_Q(2) xor DAA_Q(3) xor + DAA_Q(4) xor DAA_Q(5) xor DAA_Q(6) xor DAA_Q(7)); + when "1101" | "1110" => + -- RLD, RRD + Q_t(7 downto 4) := BusA(7 downto 4); + if ALU_Op(0) = '1' then + Q_t(3 downto 0) := BusB(7 downto 4); + else + Q_t(3 downto 0) := BusB(3 downto 0); + end if; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_S) <= Q_t(7); + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + when "1001" => + -- BIT + Q_t(7 downto 0) := BusB and BitMask; + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + F_Out(Flag_P) <= '1'; + else + F_Out(Flag_Z) <= '0'; + F_Out(Flag_P) <= '0'; + end if; + F_Out(Flag_H) <= '1'; + F_Out(Flag_N) <= '0'; + if IR(2 downto 0) = "110" or XY_State /= "00" then + F_Out(Flag_X) <= WZ(11); + F_Out(Flag_Y) <= WZ(13); + else + F_Out(Flag_X) <= BusB(3); + F_Out(Flag_Y) <= BusB(5); + end if; + when "1010" => + -- SET + Q_t(7 downto 0) := BusB or BitMask; + when "1011" => + -- RES + Q_t(7 downto 0) := BusB and not BitMask; + when "1000" => + -- ROT + case IR(5 downto 3) is + when "000" => -- RLC + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := BusA(7); + F_Out(Flag_C) <= BusA(7); + when "010" => -- RL + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(7); + when "001" => -- RRC + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(0); + F_Out(Flag_C) <= BusA(0); + when "011" => -- RR + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := F_In(Flag_C); + F_Out(Flag_C) <= BusA(0); + when "100" => -- SLA + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '0'; + F_Out(Flag_C) <= BusA(7); + when "110" => -- SLL (Undocumented) / SWAP + if Mode = 3 then + Q_t(7 downto 4) := BusA(3 downto 0); + Q_t(3 downto 0) := BusA(7 downto 4); + F_Out(Flag_C) <= '0'; + else + Q_t(7 downto 1) := BusA(6 downto 0); + Q_t(0) := '1'; + F_Out(Flag_C) <= BusA(7); + end if; + when "101" => -- SRA + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := BusA(7); + F_Out(Flag_C) <= BusA(0); + when others => -- SRL + Q_t(6 downto 0) := BusA(7 downto 1); + Q_t(7) := '0'; + F_Out(Flag_C) <= BusA(0); + end case; + F_Out(Flag_H) <= '0'; + F_Out(Flag_N) <= '0'; + F_Out(Flag_X) <= Q_t(3); + F_Out(Flag_Y) <= Q_t(5); + F_Out(Flag_S) <= Q_t(7); + if Q_t(7 downto 0) = "00000000" then + F_Out(Flag_Z) <= '1'; + else + F_Out(Flag_Z) <= '0'; + end if; + F_Out(Flag_P) <= not (Q_t(0) xor Q_t(1) xor Q_t(2) xor Q_t(3) xor + Q_t(4) xor Q_t(5) xor Q_t(6) xor Q_t(7)); + if ISet = "00" then + F_Out(Flag_P) <= F_In(Flag_P); + F_Out(Flag_S) <= F_In(Flag_S); + F_Out(Flag_Z) <= F_In(Flag_Z); + end if; + when others => + null; + end case; + Q <= Q_t; + end process; +end; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80_MCode.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80_MCode.vhd new file mode 100644 index 00000000..f5312bd6 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80_MCode.vhd @@ -0,0 +1,2035 @@ +-------------------------------------------------------------------------------- +-- **** +-- T80(c) core. Attempt to finish all undocumented features and provide +-- accurate timings. +-- Version 350. +-- Copyright (c) 2018 Sorgelig +-- Test passed: ZEXDOC, ZEXALL, Z80Full(*), Z80memptr +-- (*) Currently only SCF and CCF instructions aren't passed X/Y flags check as +-- correct implementation is still unclear. +-- +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- 0211 : Fixed IM 1 +-- 0214 : Fixed mostly flags, only the block instructions now fail the zex regression test +-- 0235 : Added IM 2 fix by Mike Johnson +-- 0238 : Added NoRead signal +-- 0238b: Fixed instruction timing for POP and DJNZ +-- 0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes +-- 0240mj1 fix for HL inc/dec for INI, IND, INIR, INDR, OUTI, OUTD, OTIR, OTDR +-- 0242 : Fixed I/O instruction timing, cleanup +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_MCode is + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,CB,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetWZ : out std_logic_vector(1 downto 0); + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); +end T80_MCode; + +architecture rtl of T80_MCode is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + function is_cc_true( + F : std_logic_vector(7 downto 0); + cc : bit_vector(2 downto 0) + ) return boolean is + begin + if Mode = 3 then + case cc is + when "000" => return F(Flag_S) = '0'; -- NZ + when "001" => return F(Flag_S) = '1'; -- Z + when "010" => return F(Flag_H) = '0'; -- NC + when "011" => return F(Flag_H) = '1'; -- C + when "100" => return false; + when "101" => return false; + when "110" => return false; + when "111" => return false; + end case; + else + case cc is + when "000" => return F(Flag_Z) = '0'; -- NZ + when "001" => return F(Flag_Z) = '1'; -- Z + when "010" => return F(Flag_C) = '0'; -- NC + when "011" => return F(Flag_C) = '1'; -- C + when "100" => return F(Flag_P) = '0'; -- PO + when "101" => return F(Flag_P) = '1'; -- PE + when "110" => return F(Flag_S) = '0'; -- P + when "111" => return F(Flag_S) = '1'; -- M + end case; + end if; + end; + +begin + + process (IR, ISet, MCycle, F, NMICycle, IntCycle, XY_State) + variable DDD : std_logic_vector(2 downto 0); + variable SSS : std_logic_vector(2 downto 0); + variable DPair : std_logic_vector(1 downto 0); + variable IRB : bit_vector(7 downto 0); + begin + DDD := IR(5 downto 3); + SSS := IR(2 downto 0); + DPair := IR(5 downto 4); + IRB := to_bitvector(IR); + + MCycles <= "001"; + if MCycle = "001" then + TStates <= "100"; + else + TStates <= "011"; + end if; + Prefix <= "00"; + Inc_PC <= '0'; + Inc_WZ <= '0'; + IncDec_16 <= "0000"; + Read_To_Acc <= '0'; + Read_To_Reg <= '0'; + Set_BusB_To <= "0000"; + Set_BusA_To <= "0000"; + ALU_Op <= "0" & IR(5 downto 3); + Save_ALU <= '0'; + PreserveC <= '0'; + Arith16 <= '0'; + IORQ <= '0'; + Set_Addr_To <= aNone; + Jump <= '0'; + JumpE <= '0'; + JumpXY <= '0'; + Call <= '0'; + RstP <= '0'; + LDZ <= '0'; + LDW <= '0'; + LDSPHL <= '0'; + Special_LD <= "000"; + ExchangeDH <= '0'; + ExchangeRp <= '0'; + ExchangeAF <= '0'; + ExchangeRS <= '0'; + I_DJNZ <= '0'; + I_CPL <= '0'; + I_CCF <= '0'; + I_SCF <= '0'; + I_RETN <= '0'; + I_BT <= '0'; + I_BC <= '0'; + I_BTR <= '0'; + I_RLD <= '0'; + I_RRD <= '0'; + I_INRC <= '0'; + SetDI <= '0'; + SetEI <= '0'; + IMode <= "11"; + Halt <= '0'; + NoRead <= '0'; + Write <= '0'; + XYbit_undoc <= '0'; + SetWZ <= "00"; + + case ISet is + when "00" => + +------------------------------------------------------------------------------ +-- +-- Unprefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is +-- 8 BIT LOAD GROUP + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- LD r,r' + Set_BusB_To(2 downto 0) <= SSS; + ExchangeRp <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" => + -- LD r,n + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" => + -- LD r,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + when others => null; + end case; + when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" => + -- LD (HL),r + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110110" => + -- LD (HL),n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aXY; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00001010" => + -- LD A,(BC) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00011010" => + -- LD A,(DE) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + when 2 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "00111010" => + if Mode = 3 then + -- LDD A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end if; + when "00000010" => + -- LD (BC),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + SetWZ <= "10"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00010010" => + -- LD (DE),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aDE; + Set_BusB_To <= "0111"; + SetWZ <= "10"; + when 2 => + Write <= '1'; + when others => null; + end case; + when "00110010" => + if Mode = 3 then + -- LDD (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "1110"; + when others => null; + end case; + else + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + SetWZ <= "10"; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + end if; + +-- 16 BIT LOAD GROUP + when "00000001"|"00010001"|"00100001"|"00110001" => + -- LD dd,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1000"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + Inc_PC <= '1'; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1001"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "00101010" => + if Mode = 3 then + -- LDI A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Acc <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD HL,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end if; + when "00100010" => + if Mode = 3 then + -- LDI (HL),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IncDec_16 <= "0110"; + when others => null; + end case; + else + -- LD (nn),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "0101"; -- L + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "0100"; -- H + when 5 => + Write <= '1'; + when others => null; + end case; + end if; + when "11111001" => + -- LD SP,HL + TStates <= "110"; + LDSPHL <= '1'; + when "11000101"|"11010101"|"11100101"|"11110101" => + -- PUSH qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "0111"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 2 => + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + if DPAIR = "11" then + Set_BusB_To <= "1011"; + else + Set_BusB_To(2 downto 1) <= DPAIR; + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + Write <= '1'; + when 3 => + Write <= '1'; + when others => null; + end case; + when "11000001"|"11010001"|"11100001"|"11110001" => + -- POP qq + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "1011"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '1'; + end if; + when 3 => + IncDec_16 <= "0111"; + Read_To_Reg <= '1'; + if DPAIR = "11" then + Set_BusA_To(3 downto 0) <= "0111"; + else + Set_BusA_To(2 downto 1) <= DPAIR; + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + +-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP + when "11101011" => + if Mode /= 3 then + -- EX DE,HL + ExchangeDH <= '1'; + end if; + when "00001000" => + if Mode = 3 then + -- LD (nn),SP + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + Set_BusB_To <= "1000"; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + Set_BusB_To <= "1001"; + when 5 => + Write <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EX AF,AF' + ExchangeAF <= '1'; + end if; + when "11011001" => + if Mode = 3 then + -- RETI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + I_RETN <= '1'; + SetEI <= '1'; + when others => null; + end case; + elsif Mode < 2 then + -- EXX + ExchangeRS <= '1'; + end if; + when "11100011" => + if Mode /= 3 then + -- EX (SP),HL + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aSP; + when 2 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0101"; + Set_BusB_To <= "0101"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + TStates <= "100"; + Write <= '1'; + when 4 => + Read_To_Reg <= '1'; + Set_BusA_To <= "0100"; + Set_BusB_To <= "0100"; + Set_Addr_To <= aSP; + LDW <= '1'; + when 5 => + IncDec_16 <= "1111"; + TStates <= "101"; + Write <= '1'; + when others => null; + end case; + end if; + +-- 8 BIT ARITHMETIC AND LOGICAL GROUP + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- ADD A,r + -- ADC A,r + -- SUB A,r + -- SBC A,r + -- AND A,r + -- OR A,r + -- XOR A,r + -- CP A,r + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- ADD A,(HL) + -- ADC A,(HL) + -- SUB A,(HL) + -- SBC A,(HL) + -- AND A,(HL) + -- OR A,(HL) + -- XOR A,(HL) + -- CP A,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + when others => null; + end case; + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- ADD A,n + -- ADC A,n + -- SUB A,n + -- SBC A,n + -- AND A,n + -- OR A,n + -- XOR A,n + -- CP A,n + MCycles <= "010"; + if MCycle = "010" then + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusA_To(2 downto 0) <= "111"; + end if; + when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => + -- INC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + when "00110100" => + -- INC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0000"; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => + -- DEC r + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + ALU_Op <= "0010"; + when "00110101" => + -- DEC (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + TStates <= "100"; + Set_Addr_To <= aXY; + ALU_Op <= "0010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + PreserveC <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= DDD; + when 3 => + Write <= '1'; + when others => null; + end case; + +-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS + when "00100111" => + -- DAA + Set_BusA_To(2 downto 0) <= "111"; + Read_To_Reg <= '1'; + ALU_Op <= "1100"; + Save_ALU <= '1'; + when "00101111" => + -- CPL + I_CPL <= '1'; + when "00111111" => + -- CCF + I_CCF <= '1'; + when "00110111" => + -- SCF + I_SCF <= '1'; + when "00000000" => + if NMICycle = '1' then + -- NMI + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + when others => null; + end case; + elsif IntCycle = '1' then + -- INT (IM 2) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 1 => + LDZ <= '1'; + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + --TStates <= "100"; + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + --TStates <= "100"; + Write <= '1'; + when 4 => + Inc_PC <= '1'; + LDZ <= '1'; + when 5 => + Jump <= '1'; + when others => null; + end case; + else + -- NOP + end if; + when "01110110" => + -- HALT + Halt <= '1'; + when "11110011" => + -- DI + SetDI <= '1'; + when "11111011" => + -- EI + SetEI <= '1'; + +-- 16 BIT ARITHMETIC GROUP + when "00001001"|"00011001"|"00101001"|"00111001" => + -- ADD HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + Arith16 <= '1'; + SetWZ <= "11"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + Arith16 <= '1'; + when others => + end case; + when "00000011"|"00010011"|"00100011"|"00110011" => + -- INC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "01"; + IncDec_16(1 downto 0) <= DPair; + when "00001011"|"00011011"|"00101011"|"00111011" => + -- DEC ss + TStates <= "110"; + IncDec_16(3 downto 2) <= "11"; + IncDec_16(1 downto 0) <= DPair; + +-- ROTATE AND SHIFT GROUP + when "00000111" + -- RLCA + |"00010111" + -- RLA + |"00001111" + -- RRCA + |"00011111" => + -- RRA + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + +-- JUMP GROUP + when "11000011" => + -- JP nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + Jump <= '1'; + LDW <= '1'; + when others => null; + end case; + when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+C),A + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + Set_BusB_To <= "0111"; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "01" => + -- LD (nn),A + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + Set_BusB_To <= "0111"; + when 4 => + Write <= '1'; + when others => null; + end case; + when "10" => + -- LD A,($FF00+C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + when 2 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => + end case; + when "11" => + -- LD A,(nn) + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + when 4 => + Read_To_Acc <= '1'; + when others => null; + end case; + end case; + else + -- JP cc,nn + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + LDW <= '1'; + Inc_PC <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Jump <= '1'; + end if; + when others => null; + end case; + end if; + when "00011000" => + if Mode /= 2 then + -- JR e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00111000" => + if Mode /= 2 then + -- JR C,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00110000" => + if Mode /= 2 then + -- JR NC,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_C) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00101000" => + if Mode /= 2 then + -- JR Z,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '0' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "00100000" => + if Mode /= 2 then + -- JR NZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + if F(Flag_Z) = '1' then + MCycles <= "010"; + end if; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + when "11101001" => + -- JP (HL) + JumpXY <= '1'; + when "00010000" => + if Mode = 3 then + I_DJNZ <= '1'; + elsif Mode < 2 then + -- DJNZ,e + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + I_DJNZ <= '1'; + Set_BusB_To <= "1010"; + Set_BusA_To(2 downto 0) <= "000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + I_DJNZ <= '1'; + Inc_PC <= '1'; + when 3 => + NoRead <= '1'; + JumpE <= '1'; + TStates <= "101"; + when others => null; + end case; + end if; + +-- CALL AND RETURN GROUP + when "11001101" => + -- CALL nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + IncDec_16 <= "1111"; + Inc_PC <= '1'; + TStates <= "100"; + Set_Addr_To <= aSP; + LDW <= '1'; + Set_BusB_To <= "1101"; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => + if IR(5) = '0' or Mode /= 3 then + -- CALL cc,nn + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Inc_PC <= '1'; + LDW <= '1'; + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + IncDec_16 <= "1111"; + Set_Addr_TO <= aSP; + TStates <= "100"; + Set_BusB_To <= "1101"; + else + MCycles <= "011"; + end if; + when 4 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 5 => + Write <= '1'; + Call <= '1'; + when others => null; + end case; + end if; + when "11001001" => + -- RET + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + --TStates <= "101"; + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => + if IR(5) = '1' and Mode = 3 then + case IRB(4 downto 3) is + when "00" => + -- LD ($FF00+nn),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "01" => + -- ADD SP,n + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + ALU_Op <= "0000"; + Inc_PC <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To <= "1000"; + Set_BusB_To <= "0110"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To <= "1001"; + Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! + when others => + end case; + when "10" => + -- LD A,($FF00+nn) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + when others => null; + end case; + when "11" => + -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Set_BusA_To(2 downto 0) <= "101"; -- L + Read_To_Reg <= '1'; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Set_BusA_To(2 downto 0) <= "100"; -- H + Read_To_Reg <= '1'; + when others => null; + end case; + end case; + else + -- RET cc + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + if is_cc_true(F, to_bitvector(IR(5 downto 3))) then + Set_Addr_TO <= aSP; + else + MCycles <= "001"; + end if; + TStates <= "101"; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + when others => null; + end case; + end if; + when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => + -- RST p + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1101"; + when 2 => + Write <= '1'; + IncDec_16 <= "1111"; + Set_Addr_To <= aSP; + Set_BusB_To <= "1100"; + when 3 => + Write <= '1'; + RstP <= '1'; + when others => null; + end case; + +-- INPUT AND OUTPUT GROUP + when "11011011" => + if Mode /= 3 then + -- IN A,(n) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + when 3 => + Read_To_Acc <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + when "11010011" => + if Mode /= 3 then + -- OUT (n),A + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + Set_Addr_To <= aIOA; + Set_BusB_To <= "0111"; + when 3 => + Write <= '1'; + IORQ <= '1'; + when others => null; + end case; + end if; + +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- MULTIBYTE INSTRUCTIONS +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + when "11001011" => + if Mode /= 2 then + Prefix <= "01"; + end if; + + when "11101101" => + if Mode < 2 then + Prefix <= "10"; + end if; + + when "11011101"|"11111101" => + if Mode < 2 then + Prefix <= "11"; + end if; + + end case; + + when "01" => + +------------------------------------------------------------------------------ +-- +-- CB prefixed instructions +-- +------------------------------------------------------------------------------ + + Set_BusA_To(2 downto 0) <= IR(2 downto 0); + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => + -- RLC r + -- RL r + -- RRC r + -- RR r + -- SLA r + -- SRA r + -- SRL r + -- SLL r (Undocumented) / SWAP r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- R/S (IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => + -- RLC (HL) + -- RL (HL) + -- RRC (HL) + -- RR (HL) + -- SRA (HL) + -- SRL (HL) + -- SLA (HL) + -- SLL (HL) (Undocumented) / SWAP (HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => + end case; + when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" + |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" + |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" + |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" + |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" + |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" + |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" + |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => + -- BIT b,r + if XY_State="00" then + if MCycle = "001" then + Set_BusB_To(2 downto 0) <= IR(2 downto 0); + ALU_Op <= "1001"; + end if; + else + -- BIT b,(IX+d), undocumented + MCycles <= "010"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + end if; + + when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => + -- BIT b,(HL) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1001"; + TStates <= "100"; + when others => null; + end case; + when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => + -- SET b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- SET b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => + -- SET b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1010"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" + |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" + |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" + |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" + |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => + -- RES b,r + if XY_State="00" then + if MCycle = "001" then + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + end if; + else + -- RES b,(IX+d),Reg, undocumented + MCycles <= "011"; + XYbit_undoc <= '1'; + case to_integer(unsigned(MCycle)) is + when 1 | 7=> + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end if; + + when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => + -- RES b,(HL) + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 | 7 => + Set_Addr_To <= aXY; + when 2 => + ALU_Op <= "1011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_Addr_To <= aXY; + TStates <= "100"; + when 3 => + Write <= '1'; + when others => null; + end case; + end case; + + when others => + +------------------------------------------------------------------------------ +-- +-- ED prefixed instructions +-- +------------------------------------------------------------------------------ + + case IRB is + when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" + |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" + |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" + |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" + |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" + |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" + |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" + |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" + + + |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" + |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" + |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" + |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" + | "10100100"|"10100101"|"10100110"|"10100111" + | "10101100"|"10101101"|"10101110"|"10101111" + | "10110100"|"10110101"|"10110110"|"10110111" + | "10111100"|"10111101"|"10111110"|"10111111" + |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" + |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" + |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" + |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" + |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" + |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" + |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" + |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => + null; -- NOP, undocumented + when "01111110"|"01111111" => + -- NOP, undocumented + null; +-- 8 BIT LOAD GROUP + when "01010111" => + -- LD A,I + Special_LD <= "100"; + TStates <= "101"; + when "01011111" => + -- LD A,R + Special_LD <= "101"; + TStates <= "101"; + when "01000111" => + -- LD I,A + Special_LD <= "110"; + TStates <= "101"; + when "01001111" => + -- LD R,A + Special_LD <= "111"; + TStates <= "101"; +-- 16 BIT LOAD GROUP + when "01001011"|"01011011"|"01101011"|"01111011" => + -- LD dd,(nn) + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + when 4 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1000"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '1'; + end if; + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + when 5 => + Read_To_Reg <= '1'; + if IR(5 downto 4) = "11" then + Set_BusA_To <= "1001"; + else + Set_BusA_To(2 downto 1) <= IR(5 downto 4); + Set_BusA_To(0) <= '0'; + end if; + when others => null; + end case; + when "01000011"|"01010011"|"01100011"|"01110011" => + -- LD (nn),dd + MCycles <= "101"; + case to_integer(unsigned(MCycle)) is + when 2 => + Inc_PC <= '1'; + LDZ <= '1'; + when 3 => + Set_Addr_To <= aZI; + Inc_PC <= '1'; + LDW <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1000"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + Set_BusB_To(3) <= '0'; + end if; + when 4 => + Inc_WZ <= '1'; + Set_Addr_To <= aZI; + Write <= '1'; + if IR(5 downto 4) = "11" then + Set_BusB_To <= "1001"; + else + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + Set_BusB_To(3) <= '0'; + end if; + when 5 => + Write <= '1'; + when others => null; + end case; + when "10100000" | "10101000" | "10110000" | "10111000" => + -- LDI, LDD, LDIR, LDDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0000"; + Set_Addr_To <= aDE; + if IR(3) = '0' then + IncDec_16 <= "0110"; -- IX + else + IncDec_16 <= "1110"; + end if; + when 3 => + I_BT <= '1'; + TStates <= "101"; + Write <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0101"; -- DE + else + IncDec_16 <= "1101"; + end if; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100001" | "10101001" | "10110001" | "10111001" => + -- CPI, CPD, CPIR, CPDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + IncDec_16 <= "1100"; -- BC + when 2 => + Set_BusB_To <= "0110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "0111"; + Save_ALU <= '1'; + PreserveC <= '1'; + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + when 3 => + NoRead <= '1'; + I_BC <= '1'; + TStates <= "101"; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => + -- NEG + Alu_OP <= "0010"; + Set_BusB_To <= "0111"; + Set_BusA_To <= "1010"; + Read_To_Acc <= '1'; + Save_ALU <= '1'; + when "01000110"|"01001110"|"01100110"|"01101110" => + -- IM 0 + IMode <= "00"; + when "01010110"|"01110110" => + -- IM 1 + IMode <= "01"; + when "01011110"|"01110111" => + -- IM 2 + IMode <= "10"; +-- 16 bit arithmetic + when "01001010"|"01011010"|"01101010"|"01111010" => + -- ADC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0001"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + SetWZ <= "11"; + when 3 => + NoRead <= '1'; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0001"; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '0'; + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01000010"|"01010010"|"01100010"|"01110010" => + -- SBC HL,ss + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 2 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "101"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + Set_BusB_To(0) <= '1'; + when others => + Set_BusB_To <= "1000"; + end case; + TStates <= "100"; + SetWZ <= "11"; + when 3 => + NoRead <= '1'; + ALU_Op <= "0011"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + Set_BusA_To(2 downto 0) <= "100"; + case to_integer(unsigned(IR(5 downto 4))) is + when 0|1|2 => + Set_BusB_To(2 downto 1) <= IR(5 downto 4); + when others => + Set_BusB_To <= "1001"; + end case; + when others => + end case; + when "01101111" => + -- RLD -- Read in M2, not M3! fixed by Sorgelig + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1101"; + Save_ALU <= '1'; + when 3 => + TStates <= "100"; + I_RLD <= '1'; + NoRead <= '1'; + Set_Addr_To <= aXY; + when 4 => + Write <= '1'; + when others => + end case; + when "01100111" => + -- RRD -- Read in M2, not M3! fixed by Sorgelig + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aXY; + when 2 => + Read_To_Reg <= '1'; + Set_BusB_To(2 downto 0) <= "110"; + Set_BusA_To(2 downto 0) <= "111"; + ALU_Op <= "1110"; + Save_ALU <= '1'; + when 3 => + TStates <= "100"; + I_RRD <= '1'; + NoRead <= '1'; + Set_Addr_To <= aXY; + when 4 => + Write <= '1'; + when others => + end case; + when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => + -- RETI/RETN + MCycles <= "011"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_TO <= aSP; + when 2 => + IncDec_16 <= "0111"; + Set_Addr_To <= aSP; + LDZ <= '1'; + when 3 => + Jump <= '1'; + IncDec_16 <= "0111"; + LDW <= '1'; + I_RETN <= '1'; + when others => null; + end case; + when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => + -- IN r,(C) + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + SetWZ <= "01"; + when 2 => + IORQ <= '1'; + if IR(5 downto 3) /= "110" then + Read_To_Reg <= '1'; + Set_BusA_To(2 downto 0) <= IR(5 downto 3); + end if; + I_INRC <= '1'; + when others => + end case; + when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => + -- OUT (C),r + -- OUT (C),0 + MCycles <= "010"; + case to_integer(unsigned(MCycle)) is + when 1 => + Set_Addr_To <= aBC; + SetWZ <= "01"; + Set_BusB_To(2 downto 0) <= IR(5 downto 3); + if IR(5 downto 3) = "110" then + Set_BusB_To(3) <= '1'; + end if; + when 2 => + Write <= '1'; + IORQ <= '1'; + when others => + end case; + when "10100010" | "10101010" | "10110010" | "10111010" => + -- INI, IND, INIR, INDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aBC; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + SetWZ <= "11"; + IncDec_16(3) <= IR(3); + when 2 => + IORQ <= '1'; + Set_BusB_To <= "0110"; + Set_Addr_To <= aXY; + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + when "10100011" | "10101011" | "10110011" | "10111011" => + -- OUTI, OUTD, OTIR, OTDR + MCycles <= "100"; + case to_integer(unsigned(MCycle)) is + when 1 => + TStates <= "101"; + Set_Addr_To <= aXY; + Set_BusB_To <= "1010"; + Set_BusA_To <= "0000"; + Read_To_Reg <= '1'; + Save_ALU <= '1'; + ALU_Op <= "0010"; + when 2 => + Set_BusB_To <= "0110"; + Set_Addr_To <= aBC; + SetWZ <= "11"; + IncDec_16(3) <= IR(3); + when 3 => + if IR(3) = '0' then + IncDec_16 <= "0110"; + else + IncDec_16 <= "1110"; + end if; + IORQ <= '1'; + Write <= '1'; + I_BTR <= '1'; + when 4 => + NoRead <= '1'; + TStates <= "101"; + when others => null; + end case; + end case; + + end case; + + if Mode = 1 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "011"; + end if; + end if; + + if Mode = 3 then + if MCycle = "001" then +-- TStates <= "100"; + else + TStates <= "100"; + end if; + end if; + + if Mode < 2 then + if MCycle = "110" then + Inc_PC <= '1'; + if Mode = 1 then + Set_Addr_To <= aXY; + TStates <= "100"; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + end if; + if IRB = "00110110" or IRB = "11001011" then + Set_Addr_To <= aNone; + end if; + end if; + if MCycle = "111" then + if Mode = 0 then + TStates <= "101"; + end if; + if ISet /= "01" then + Set_Addr_To <= aXY; + end if; + Set_BusB_To(2 downto 0) <= SSS; + Set_BusB_To(3) <= '0'; + if IRB = "00110110" or ISet = "01" then + -- LD (HL),n + Inc_PC <= '1'; + else + NoRead <= '1'; + end if; + end if; + end if; + + end process; + +end; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80_Pack.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80_Pack.vhd new file mode 100644 index 00000000..907db408 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80_Pack.vhd @@ -0,0 +1,228 @@ +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 303 add undocumented DDCB and FDCB opcodes by TobiFlex 20.04.2010 +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- Z80 compatible microprocessor core +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- + +library IEEE; +use IEEE.std_logic_1164.all; + +package T80_Pack is + + constant aNone : std_logic_vector(2 downto 0) := "111"; + constant aBC : std_logic_vector(2 downto 0) := "000"; + constant aDE : std_logic_vector(2 downto 0) := "001"; + constant aXY : std_logic_vector(2 downto 0) := "010"; + constant aIOA : std_logic_vector(2 downto 0) := "100"; + constant aSP : std_logic_vector(2 downto 0) := "101"; + constant aZI : std_logic_vector(2 downto 0) := "110"; + + component T80 + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + IOWait : integer := 0; -- 1 => Single cycle I/O, 1 => Std I/O cycle + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + RESET_n : in std_logic; + CLK_n : in std_logic; + CEN : in std_logic; + WAIT_n : in std_logic; + INT_n : in std_logic; + NMI_n : in std_logic; + BUSRQ_n : in std_logic; + M1_n : out std_logic; + IORQ : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + A : out std_logic_vector(15 downto 0); + DInst : in std_logic_vector(7 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0); + MC : out std_logic_vector(2 downto 0); + TS : out std_logic_vector(2 downto 0); + IntCycle_n : out std_logic; + IntE : out std_logic; + Stop : out std_logic + ); + end component; + + component T80_Reg + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0) + ); + end component; + + component T80_MCode + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + IR : in std_logic_vector(7 downto 0); + ISet : in std_logic_vector(1 downto 0); + MCycle : in std_logic_vector(2 downto 0); + F : in std_logic_vector(7 downto 0); + NMICycle : in std_logic; + IntCycle : in std_logic; + XY_State : in std_logic_vector(1 downto 0); + MCycles : out std_logic_vector(2 downto 0); + TStates : out std_logic_vector(2 downto 0); + Prefix : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD + Inc_PC : out std_logic; + Inc_WZ : out std_logic; + IncDec_16 : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP 0 is inc + Read_To_Reg : out std_logic; + Read_To_Acc : out std_logic; + Set_BusA_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F + Set_BusB_To : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0 + ALU_Op : out std_logic_vector(3 downto 0); + -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None + Save_ALU : out std_logic; + PreserveC : out std_logic; + Arith16 : out std_logic; + Set_Addr_To : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI + IORQ : out std_logic; + Jump : out std_logic; + JumpE : out std_logic; + JumpXY : out std_logic; + Call : out std_logic; + RstP : out std_logic; + LDZ : out std_logic; + LDW : out std_logic; + LDSPHL : out std_logic; + Special_LD : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None + ExchangeDH : out std_logic; + ExchangeRp : out std_logic; + ExchangeAF : out std_logic; + ExchangeRS : out std_logic; + I_DJNZ : out std_logic; + I_CPL : out std_logic; + I_CCF : out std_logic; + I_SCF : out std_logic; + I_RETN : out std_logic; + I_BT : out std_logic; + I_BC : out std_logic; + I_BTR : out std_logic; + I_RLD : out std_logic; + I_RRD : out std_logic; + I_INRC : out std_logic; + SetDI : out std_logic; + SetEI : out std_logic; + IMode : out std_logic_vector(1 downto 0); + Halt : out std_logic; + NoRead : out std_logic; + Write : out std_logic; + XYbit_undoc : out std_logic + ); + end component; + + component T80_ALU + generic( + Mode : integer := 0; + Flag_C : integer := 0; + Flag_N : integer := 1; + Flag_P : integer := 2; + Flag_X : integer := 3; + Flag_H : integer := 4; + Flag_Y : integer := 5; + Flag_Z : integer := 6; + Flag_S : integer := 7 + ); + port( + Arith16 : in std_logic; + Z16 : in std_logic; + ALU_Op : in std_logic_vector(3 downto 0); + IR : in std_logic_vector(5 downto 0); + ISet : in std_logic_vector(1 downto 0); + BusA : in std_logic_vector(7 downto 0); + BusB : in std_logic_vector(7 downto 0); + F_In : in std_logic_vector(7 downto 0); + Q : out std_logic_vector(7 downto 0); + F_Out : out std_logic_vector(7 downto 0) + ); + end component; + +end; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80_Reg.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80_Reg.vhd new file mode 100644 index 00000000..e7e86454 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80_Reg.vhd @@ -0,0 +1,152 @@ +-------------------------------------------------------------------------------- +-- **** +-- T80(c) core. Attempt to finish all undocumented features and provide +-- accurate timings. +-- Version 350. +-- Copyright (c) 2018 Sorgelig +-- Test passed: ZEXDOC, ZEXALL, Z80Full(*), Z80memptr +-- (*) Currently only SCF and CCF instructions aren't passed X/Y flags check as +-- correct implementation is still unclear. +-- +-- **** +-- T80(b) core. In an effort to merge and maintain bug fixes .... +-- +-- +-- Ver 300 started tidyup +-- MikeJ March 2005 +-- Latest version from www.fpgaarcade.com (original www.opencores.org) +-- +-- **** +-- +-- T80 Registers, technology independent +-- +-- Version : 0244 +-- +-- Copyright (c) 2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t51/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0242 : Initial release +-- +-- 0244 : Changed to single register file +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity T80_Reg is + port( + Clk : in std_logic; + CEN : in std_logic; + WEH : in std_logic; + WEL : in std_logic; + AddrA : in std_logic_vector(2 downto 0); + AddrB : in std_logic_vector(2 downto 0); + AddrC : in std_logic_vector(2 downto 0); + DIH : in std_logic_vector(7 downto 0); + DIL : in std_logic_vector(7 downto 0); + DOAH : out std_logic_vector(7 downto 0); + DOAL : out std_logic_vector(7 downto 0); + DOBH : out std_logic_vector(7 downto 0); + DOBL : out std_logic_vector(7 downto 0); + DOCH : out std_logic_vector(7 downto 0); + DOCL : out std_logic_vector(7 downto 0); + DOR : out std_logic_vector(127 downto 0); + DIRSet : in std_logic; + DIR : in std_logic_vector(127 downto 0) + ); +end T80_Reg; + +architecture rtl of T80_Reg is + + type Register_Image is array (natural range <>) of std_logic_vector(7 downto 0); + signal RegsH : Register_Image(0 to 7); + signal RegsL : Register_Image(0 to 7); + +begin + + process (Clk) + begin + if rising_edge(Clk) then + if DIRSet = '1' then + RegsL(0) <= DIR( 7 downto 0); + RegsH(0) <= DIR( 15 downto 8); + + RegsL(1) <= DIR( 23 downto 16); + RegsH(1) <= DIR( 31 downto 24); + + RegsL(2) <= DIR( 39 downto 32); + RegsH(2) <= DIR( 47 downto 40); + + RegsL(3) <= DIR( 55 downto 48); + RegsH(3) <= DIR( 63 downto 56); + + RegsL(4) <= DIR( 71 downto 64); + RegsH(4) <= DIR( 79 downto 72); + + RegsL(5) <= DIR( 87 downto 80); + RegsH(5) <= DIR( 95 downto 88); + + RegsL(6) <= DIR(103 downto 96); + RegsH(6) <= DIR(111 downto 104); + + RegsL(7) <= DIR(119 downto 112); + RegsH(7) <= DIR(127 downto 120); + elsif CEN = '1' then + if WEH = '1' then + RegsH(to_integer(unsigned(AddrA))) <= DIH; + end if; + if WEL = '1' then + RegsL(to_integer(unsigned(AddrA))) <= DIL; + end if; + end if; + end if; + end process; + + DOAH <= RegsH(to_integer(unsigned(AddrA))); + DOAL <= RegsL(to_integer(unsigned(AddrA))); + DOBH <= RegsH(to_integer(unsigned(AddrB))); + DOBL <= RegsL(to_integer(unsigned(AddrB))); + DOCH <= RegsH(to_integer(unsigned(AddrC))); + DOCL <= RegsL(to_integer(unsigned(AddrC))); + DOR <= RegsH(7) & RegsL(7) & RegsH(6) & RegsL(6) & RegsH(5) & RegsL(5) & RegsH(4) & RegsL(4) & RegsH(3) & RegsL(3) & RegsH(2) & RegsL(2) & RegsH(1) & RegsL(1) & RegsH(0) & RegsL(0); + +end; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80se.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80se.vhd new file mode 100644 index 00000000..4fc90530 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/rtl_T80/T80se.vhd @@ -0,0 +1,192 @@ +-- +-- Z80 compatible microprocessor core, synchronous top level with clock enable +-- Different timing than the original z80 +-- Inputs needs to be synchronous and outputs may glitch +-- +-- Version : 0242 +-- +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t80/ +-- +-- Limitations : +-- +-- File history : +-- +-- 0208 : First complete release +-- +-- 0210 : Fixed read with wait +-- +-- 0211 : Fixed interrupt cycle +-- +-- 0235 : Updated for T80 interface change +-- +-- 0236 : Added T2Write generic +-- +-- 0237 : Fixed T2Write with wait state +-- +-- 0238 : Updated for T80 interface change +-- +-- 0240 : Updated for T80 interface change +-- +-- 0242 : Updated for T80 interface change +-- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +use IEEE.STD_LOGIC_UNSIGNED.all; + +entity T80se is + generic( + Mode : integer := 0; -- 0 => Z80, 1 => Fast Z80, 2 => 8080, 3 => GB + T2Write : integer := 1; -- 0 => WR_n active in T3, /=0 => WR_n active in T2 + IOWait : integer := 1 -- 0 => Single cycle I/O, 1 => Std I/O cycle + ); + port( + RESET_n : in std_logic; + CLK : in std_logic; + CEN : in std_logic := '1'; + WAIT_n : in std_logic := '1'; + INT_n : in std_logic := '1'; + NMI_n : in std_logic := '1'; + BUSRQ_n : in std_logic := '1'; + M1_n : out std_logic; + MREQ_n : out std_logic; + IORQ_n : out std_logic; + RD_n : out std_logic; + WR_n : out std_logic; + RFSH_n : out std_logic; + HALT_n : out std_logic; + BUSAK_n : out std_logic; + OUT0 : in std_logic := '0'; -- 0 => OUT(C),0, 1 => OUT(C),255 + A : out std_logic_vector(15 downto 0); + DI : in std_logic_vector(7 downto 0); + DO : out std_logic_vector(7 downto 0) + ); +end T80se; + +architecture rtl of T80se is + + signal IntCycle_n : std_logic; + signal NoRead : std_logic; + signal Write : std_logic; + signal IORQ : std_logic; + signal DI_Reg : std_logic_vector(7 downto 0); + signal MCycle : std_logic_vector(2 downto 0); + signal TState : std_logic_vector(2 downto 0); + +begin + + u0 : work.T80 + generic map( + Mode => Mode, + IOWait => IOWait) + port map( + CEN => CEN, + M1_n => M1_n, + IORQ => IORQ, + NoRead => NoRead, + Write => Write, + RFSH_n => RFSH_n, + HALT_n => HALT_n, + WAIT_n => Wait_n, + INT_n => INT_n, + NMI_n => NMI_n, + RESET_n => RESET_n, + BUSRQ_n => BUSRQ_n, + BUSAK_n => BUSAK_n, + CLK_n => CLK, + A => A, + DInst => DI, + DI => DI_Reg, + DO => DO, + MC => MCycle, + TS => TState, + OUT0 => OUT0, + IntCycle_n => IntCycle_n + ); + + process (RESET_n, CLK) + begin + if RESET_n = '0' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + DI_Reg <= "00000000"; + elsif rising_edge(CLK) then + if CEN = '1' then + RD_n <= '1'; + WR_n <= '1'; + IORQ_n <= '1'; + MREQ_n <= '1'; + if MCycle = 1 then + if TState = 1 or (TState = 2 and Wait_n = '0') then + RD_n <= not IntCycle_n; + MREQ_n <= not IntCycle_n; + IORQ_n <= IntCycle_n; + end if; + if TState = 3 then + MREQ_n <= '0'; + end if; + else + if (TState = 1 or (TState = 2 and Wait_n = '0')) and NoRead = '0' and Write = '0' then + RD_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + if T2Write = 0 then + if TState = 2 and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + else + if (TState = 1 or (TState = 2 and Wait_n = '0')) and Write = '1' then + WR_n <= '0'; + IORQ_n <= not IORQ; + MREQ_n <= IORQ; + end if; + end if; + end if; + if TState = 2 and Wait_n = '1' then + DI_Reg <= DI; + end if; + end if; + end if; + end process; +end; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/sdram.sv b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/sdram.sv new file mode 100644 index 00000000..8f927d05 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/sdram.sv @@ -0,0 +1,254 @@ +// +// sdram.v +// +// Static RAM controller implementation using SDRAM MT48LC16M16A2 +// +// Copyright (c) 2015,2016 Sorgelig +// +// Some parts of SDRAM code used from project: +// http://hamsterworks.co.nz/mediawiki/index.php/Simple_SDRAM_Controller +// +// This source file is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This source file is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// ------------------------------------------ +// +// v2.1 - Add universal 8/16 bit mode. +// + +module sdram +( + input init, // reset to initialize RAM + input clk, // clock ~100MHz + // + // SDRAM_* - signals to the MT48LC16M16 chip + inout reg [15:0] SDRAM_DQ, // 16 bit bidirectional data bus + output reg [12:0] SDRAM_A, // 13 bit multiplexed address bus + output reg SDRAM_DQML, // two byte masks + output reg SDRAM_DQMH, // + output reg [1:0] SDRAM_BA, // two banks + output SDRAM_nCS, // a single chip select + output SDRAM_nWE, // write enable + output SDRAM_nRAS, // row address select + output SDRAM_nCAS, // columns address select + output SDRAM_CKE, // clock enable + // + input [1:0] wtbt, // 16bit mode: bit1 - write high byte, bit0 - write low byte, + // 8bit mode: 2'b00 - use addr[0] to decide which byte to write + // Ignored while reading. + // + input [24:0] addr, // 25 bit address for 8bit mode. addr[0] = 0 for 16bit mode for correct operations. + output [15:0] dout, // data output to cpu + input [15:0] din, // data input from cpu + input we, // cpu requests write + input rd, // cpu requests read + output reg ready // dout is valid. Ready to accept new read/write. +); + +assign SDRAM_nCS = command[3]; +assign SDRAM_nRAS = command[2]; +assign SDRAM_nCAS = command[1]; +assign SDRAM_nWE = command[0]; +assign SDRAM_CKE = cke; + +// no burst configured +localparam BURST_LENGTH = 3'b000; // 000=1, 001=2, 010=4, 011=8 +localparam ACCESS_TYPE = 1'b0; // 0=sequential, 1=interleaved +localparam CAS_LATENCY = 3'd2; // 2 for < 100MHz, 3 for >100MHz +localparam OP_MODE = 2'b00; // only 00 (standard operation) allowed +localparam NO_WRITE_BURST = 1'b1; // 0= write burst enabled, 1=only single access write +localparam MODE = {3'b000, NO_WRITE_BURST, OP_MODE, CAS_LATENCY, ACCESS_TYPE, BURST_LENGTH}; + +localparam sdram_startup_cycles= 14'd12100;// 100us, plus a little more, @ 100MHz +localparam cycles_per_refresh = 14'd186; // (64000*36)/8192-1 Calc'd as (64ms @ 36MHz)/8192 rose +localparam startup_refresh_max = 14'b11111111111111; + +// SDRAM commands +localparam CMD_INHIBIT = 4'b1111; +localparam CMD_NOP = 4'b0111; +localparam CMD_ACTIVE = 4'b0011; +localparam CMD_READ = 4'b0101; +localparam CMD_WRITE = 4'b0100; +localparam CMD_BURST_TERMINATE = 4'b0110; +localparam CMD_PRECHARGE = 4'b0010; +localparam CMD_AUTO_REFRESH = 4'b0001; +localparam CMD_LOAD_MODE = 4'b0000; + +reg [13:0] refresh_count = startup_refresh_max - sdram_startup_cycles; +reg [3:0] command = CMD_INHIBIT; +reg cke = 0; +reg [24:0] save_addr; +reg [15:0] data; + +assign dout = save_addr[0] ? {data[7:0], data[15:8]} : {data[15:8], data[7:0]}; +typedef enum +{ + STATE_STARTUP, + STATE_OPEN_1, + STATE_WRITE, + STATE_READ, + STATE_IDLE, STATE_IDLE_1, STATE_IDLE_2, STATE_IDLE_3, + STATE_IDLE_4, STATE_IDLE_5, STATE_IDLE_6, STATE_IDLE_7 +} state_t; + +state_t state = STATE_STARTUP; + +always @(posedge clk) begin + reg old_we, old_rd; + reg [CAS_LATENCY:0] data_ready_delay; + + reg [15:0] new_data; + reg [1:0] new_wtbt; + reg new_we; + reg new_rd; + reg save_we = 1; + + + command <= CMD_NOP; + refresh_count <= refresh_count+1'b1; + + data_ready_delay <= {1'b0, data_ready_delay[CAS_LATENCY:1]}; + + if(data_ready_delay[0]) data <= SDRAM_DQ; + + case(state) + STATE_STARTUP: begin + //------------------------------------------------------------------------ + //-- This is the initial startup state, where we wait for at least 100us + //-- before starting the start sequence + //-- + //-- The initialisation is sequence is + //-- * de-assert SDRAM_CKE + //-- * 100us wait, + //-- * assert SDRAM_CKE + //-- * wait at least one cycle, + //-- * PRECHARGE + //-- * wait 2 cycles + //-- * REFRESH, + //-- * tREF wait + //-- * REFRESH, + //-- * tREF wait + //-- * LOAD_MODE_REG + //-- * 2 cycles wait + //------------------------------------------------------------------------ + cke <= 1; + SDRAM_DQ <= 16'bZZZZZZZZZZZZZZZZ; + SDRAM_DQML <= 1; + SDRAM_DQMH <= 1; + SDRAM_A <= 0; + SDRAM_BA <= 0; + + // All the commands during the startup are NOPS, except these + if(refresh_count == startup_refresh_max-31) begin + // ensure all rows are closed + command <= CMD_PRECHARGE; + SDRAM_A[10] <= 1; // all banks + SDRAM_BA <= 2'b00; + end else if (refresh_count == startup_refresh_max-23) begin + // these refreshes need to be at least tREF (66ns) apart + command <= CMD_AUTO_REFRESH; + end else if (refresh_count == startup_refresh_max-15) + command <= CMD_AUTO_REFRESH; + else if (refresh_count == startup_refresh_max-7) begin + // Now load the mode register + command <= CMD_LOAD_MODE; + SDRAM_A <= MODE; + end + + //------------------------------------------------------ + //-- if startup is complete then go into idle mode, + //-- get prepared to accept a new command, and schedule + //-- the first refresh cycle + //------------------------------------------------------ + if(!refresh_count) begin + state <= STATE_IDLE; + ready <= 1; + refresh_count <= 0; + end + end + + STATE_IDLE_7: state <= STATE_IDLE_6; + STATE_IDLE_6: state <= STATE_IDLE_5; + STATE_IDLE_5: state <= STATE_IDLE_4; + STATE_IDLE_4: state <= STATE_IDLE_3; + STATE_IDLE_3: state <= STATE_IDLE_2; + STATE_IDLE_2: state <= STATE_IDLE_1; + STATE_IDLE_1: begin + SDRAM_DQ <= 16'bZZZZZZZZZZZZZZZZ; + state <= STATE_IDLE; + // mask possible refresh to reduce colliding. + if(refresh_count > cycles_per_refresh) begin + //------------------------------------------------------------------------ + //-- Start the refresh cycle. + //-- This tasks tRFC (66ns), so 2 idle cycles are needed @ 36MHz + //------------------------------------------------------------------------ + state <= STATE_IDLE_2; + command <= CMD_AUTO_REFRESH; + refresh_count <= refresh_count - cycles_per_refresh + 1'd1; + end + end + + STATE_IDLE: begin + // Priority is to issue a refresh if one is outstanding + if(refresh_count > (cycles_per_refresh<<1)) state <= STATE_IDLE_1; + else if(new_rd | new_we) begin + new_we <= 0; + new_rd <= 0; + save_addr<= addr; + save_we <= new_we; + state <= STATE_OPEN_1; + command <= CMD_ACTIVE; + SDRAM_A <= addr[13:1]; + SDRAM_BA <= addr[24:23]; + end + end + + // ACTIVE-to-READ or WRITE delay >20ns (1 cycle @ 36 MHz)(-75) + STATE_OPEN_1: begin + SDRAM_A <= {4'b0010, save_addr[22:14]}; + SDRAM_DQML <= save_we & (new_wtbt ? ~new_wtbt[0] : save_addr[0]); + SDRAM_DQMH <= save_we & (new_wtbt ? ~new_wtbt[1] : ~save_addr[0]); + state <= save_we ? STATE_WRITE : STATE_READ; + end + + STATE_READ: begin + state <= STATE_IDLE_5; + command <= CMD_READ; + SDRAM_DQ <= 16'bZZZZZZZZZZZZZZZZ; + + // Schedule reading the data values off the bus + data_ready_delay[CAS_LATENCY] <= 1; + end + + STATE_WRITE: begin + state <= STATE_IDLE_5; + command <= CMD_WRITE; + SDRAM_DQ <= new_wtbt ? new_data : {new_data[7:0], new_data[7:0]}; + ready <= 1; + end + endcase + + if(init) begin + state <= STATE_STARTUP; + refresh_count <= startup_refresh_max - sdram_startup_cycles; + end + + old_we <= we; + old_rd <= rd; + if(we & ~old_we) {ready, new_we, new_data, new_wtbt} <= {1'b0, 1'b1, din, wtbt}; + else + if((rd & ~old_rd) || (rd & old_rd & (save_addr != addr))) {ready, new_rd} <= {1'b0, 1'b1}; + +end + +endmodule diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/traverse_usa.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/traverse_usa.vhd new file mode 100644 index 00000000..2c0908ed --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/traverse_usa.vhd @@ -0,0 +1,895 @@ +--------------------------------------------------------------------------------- +-- Traverse USA by Dar (darfpga@aol.fr) (16/03/2019) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- gen_ram.vhd & io_ps2_keyboard +-------------------------------- +-- Copyright 2005-2008 by Peter Wendrich (pwsoft@syntiac.com) +-- http://www.syntiac.com/fpga64.html +--------------------------------------------------------------------------------- +-- T80/T80se - Version : 0247 +----------------------------- +-- Z80 compatible microprocessor core +-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org) +--------------------------------------------------------------------------------- +-- cpu68 - Version 9th Jan 2004 0.8 +-- 6800/01 compatible CPU core +-- GNU public license - December 2002 : John E. Kent +--------------------------------------------------------------------------------- +-- YM2149 (AY-3-8910) +-- Copyright (c) MikeJ - Jan 2005 +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- + +-- Features : +-- Video : TV 15KHz mode only (atm) +-- Coctail mode : OK +-- Sound : OK + +-- Use with MAME roms from travusa.zip +-- +-- Use make_travusa_proms.bat to build vhd file from binaries +-- (CRC list included) + +-- Traverse USA (irem M52) Hardware caracteristics : +-- +-- VIDEO : 1xZ80@3MHz CPU accessing its program rom, working ram, +-- sprite data ram, I/O, sound board register and trigger. +-- 32Kx8bits program rom +-- +-- One char tile map 64x32 with H scrolling (32x32 visible) +-- 8Kx24bits graphics rom 3bits/pixel +-- 8colors per tile / 16 color sets +-- rbg palette 128 colors 8bits : 2red 3green 3blue +-- +-- 72 sprites / line, 16x16 with flip H/V +-- (schematics seems too allow only 24 sprites / line with bank switch +-- at mid screen. This doesn't allow showing all needed sprite) +-- +-- 8Kx24bits graphics rom 3bits/pixel +-- 8colors per sprite / 32 color sets among 16 colors; +-- rbg palette 16 colors 8bits : 2red 3green 3blue +-- +-- Working ram : 4Kx8bits +-- Sprites data ram : 256x8bits +-- Sprites line buffer rams : 1 scan line delay flip/flop 2x256x4bits +-- +-- SOUND : 1x6803@3.58MHz CPU accessing its program rom, working ram, 2x-AY3-8910, 1xMSM5205 +-- 4Kx8bits program rom +-- 128x8bits working ram +-- +-- 1xAY-3-8910 +-- I/O to MSM5205 and command/trigger from video board. +-- 3 sound channels +-- +-- 1xAY-3-8910 +-- 3 sound channels +-- +--------------------------------------------------------------------------------- +-- Schematics remarks : +-- +-- Frame is 384 x 282 (H x V) which is too much lines for standard TV set (262.5 lines) +-- This create a display artefact near end of frame since already entering composite +-- sync egalisation pulses. Line number cannot be reduced since CPU need enough fly back +-- time to update every sprites position. (Reducing line count will result in missing sprites) +-- May be this can be achieved by increasing CPU clock speed (web site and MAME report 4Mhz) +-- My M52-A schematic clearly shows 18.432/6. +-- +-- => I give more CPU time to access sprite ram data by allowing CPU access as soon as video +-- scanner V is outside the sprite zone i.e. outside the scroling part of screen (which +-- depends on the flip screen state). +-- +-- Moreover M52-B schematic doesn't show to allow seeking more than 24 sprites data per +-- line from : +-- - C820 to C87F for half upper screen (vertical) +-- - C8A0 to C8FF for half lower screen (vertical) +-- +-- But, at beginning of the game, during starting count downto, 5 cars are diplayed + +-- moto + count down numbers. At least some sprite cars data comes not only from +-- C820-C87F but also from C920 to C97F. Which involves at least 2 sprite data regions +-- for the same half part of the screen (see cars numbered 0 and 3). +-- +-- => I modify the sprite data address scanner to allow 3 regions to be scanned at each line +-- (C820-C87F, C8A0-C8FF and C920-C97F). My first design was with a 12MHz master clock to +-- allow 1 read and 1 write access to sprite line buffer ram at each pixel (6Mhz). This +-- permit only one sprite data region to be scanned at each line. The master clock was +-- increased from 12Mhz to 36Mhz and desing modified to allow 3 sprite data regions to be +-- scanned at each line. +-- +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +entity traverse_usa is +port( + clock_36 : in std_logic; + clock_0p895 : in std_logic; + reset : in std_logic; +-- tv15Khz_mode : in std_logic; + video_r : out std_logic_vector(1 downto 0); + video_g : out std_logic_vector(2 downto 0); + video_b : out std_logic_vector(2 downto 0); + video_clk : out std_logic; + video_csync : out std_logic; + video_blankn : out std_logic; + video_hs : out std_logic; + video_vs : out std_logic; + audio_out : out std_logic_vector(10 downto 0); + + cpu_rom_addr : out std_logic_vector(14 downto 0); + cpu_rom_do : in std_logic_vector( 7 downto 0); + cpu_rom_rd : out std_logic; + + dip_switch_1 : in std_logic_vector(7 downto 0); -- Coinage_B(7-4) / Cont. play(3) / Fuel consumption(2) / Fuel lost when collision (1-0) + dip_switch_2 : in std_logic_vector(7 downto 0); -- Diag(7) / Demo(6) / Zippy(5) / Freeze (4) / M-Km(3) / Coin mode (2) / Cocktail(1) / Flip(0) + + start2 : in std_logic; + start1 : in std_logic; + coin1 : in std_logic; + + right1 : in std_logic; + left1 : in std_logic; + accel1 : in std_logic; + brake1 : in std_logic; + + right2 : in std_logic; + left2 : in std_logic; + accel2 : in std_logic; + brake2 : in std_logic; + + dbg_cpu_addr : out std_logic_vector(15 downto 0) + ); +end traverse_usa; + +architecture struct of traverse_usa is + + signal reset_n: std_logic; + signal clock_36n : std_logic; + signal clock_cnt : std_logic_vector(3 downto 0) := "0000"; + + signal hcnt : std_logic_vector(8 downto 0) := '0'&x"00"; -- horizontal counter + signal vcnt : std_logic_vector(8 downto 0) := '0'&x"00"; -- vertical counter + + signal hcnt_flip : std_logic_vector(8 downto 0); + signal vcnt_flip : std_logic_vector(8 downto 0); + signal hcnt_scrolled : std_logic_vector(8 downto 0); + signal hcnt_scrolled_flip : std_logic_vector(2 downto 0); + + signal pix_ena : std_logic; + + signal csync : std_logic; + signal hsync0 : std_logic; + signal hsync1 : std_logic; + signal hsync2 : std_logic; + + signal hblank : std_logic; + signal vblank : std_logic; + + signal cpu_ena : std_logic; + + signal cpu_addr : std_logic_vector(15 downto 0); + signal cpu_di : std_logic_vector( 7 downto 0); + signal cpu_do : std_logic_vector( 7 downto 0); + signal cpu_wr_n : std_logic; + signal cpu_mreq_n : std_logic; + signal cpu_ioreq_n : std_logic; + signal cpu_irq_n : std_logic; + signal cpu_m1_n : std_logic; + +-- signal cpu_rom_do : std_logic_vector( 7 downto 0); + + signal wram_we : std_logic; + signal wram_do : std_logic_vector( 7 downto 0); + + signal flip : std_logic; + signal flip_int : std_logic; + + signal chrram_addr: std_logic_vector(11 downto 0); + signal chrram_we : std_logic; + signal chrram_do : std_logic_vector(7 downto 0); + signal chrram_do_to_cpu : std_logic_vector( 7 downto 0); + + signal scroll_x : std_logic_vector(8 downto 0) := (others=>'0'); + signal apply_scroll : std_logic; + + signal chr_code: std_logic_vector( 7 downto 0); + signal chr_attr: std_logic_vector( 7 downto 0); + signal chr_code_line : std_logic_vector(12 downto 0); + signal chr_flip_h : std_logic; + + signal chr_graphx1_do : std_logic_vector(7 downto 0); + signal chr_graphx2_do : std_logic_vector(7 downto 0); + signal chr_graphx3_do : std_logic_vector(7 downto 0); + signal chr_color : std_logic_vector(3 downto 0); + signal chr_palette_addr : std_logic_vector(8 downto 0); + signal chr_palette_do : std_logic_vector(7 downto 0); + + signal sprram_addr : std_logic_vector(9 downto 0); + signal sprram_we : std_logic; + signal sprram_do : std_logic_vector(7 downto 0); + + signal cpu_has_spr_ram : std_logic; + + signal spr_pix_ena : std_logic; + signal spr_hcnt : std_logic_vector(10 downto 0); + signal spr_posv, spr_posv_r : std_logic_vector( 7 downto 0); + signal spr_attr, spr_attr_r : std_logic_vector( 7 downto 0); + signal spr_code, spr_code_r : std_logic_vector( 7 downto 0); + signal spr_posh : std_logic_vector( 7 downto 0); + + signal spr_vcnt : std_logic_vector( 7 downto 0); + signal spr_on_line : std_logic; + signal spr_on_line_r : std_logic; + signal spr_code_line : std_logic_vector(12 downto 0); + signal spr_line_cnt : std_logic_vector( 4 downto 0); + signal spr_graphx1_do : std_logic_vector( 7 downto 0); + signal spr_graphx2_do : std_logic_vector( 7 downto 0); + signal spr_graphx3_do : std_logic_vector( 7 downto 0); + signal spr_palette_addr : std_logic_vector( 7 downto 0); + signal spr_palette_do : std_logic_vector( 7 downto 0); + signal spr_pixels : std_logic_vector( 4 downto 0); + signal spr_rgb_lut_addr : std_logic_vector( 4 downto 0); + signal spr_rgb_lut_do : std_logic_vector( 7 downto 0); + + signal spr_input_line_addr : std_logic_vector(7 downto 0); + signal spr_input_line_di : std_logic_vector(3 downto 0); + signal spr_input_line_do : std_logic_vector(3 downto 0); + signal spr_input_line_we : std_logic; + + signal spr_output_line_addr : std_logic_vector(7 downto 0); + signal spr_output_line_di : std_logic_vector(3 downto 0); + signal spr_output_line_do : std_logic_vector(3 downto 0); + signal spr_output_line_we : std_logic; + signal spr_buffer_ram1_addr : std_logic_vector(7 downto 0); + signal spr_buffer_ram1_we : std_logic; + signal spr_buffer_ram1_di : std_logic_vector(3 downto 0); + signal spr_buffer_ram1_do : std_logic_vector(3 downto 0); + signal spr_buffer_ram2_addr : std_logic_vector(7 downto 0); + signal spr_buffer_ram2_we : std_logic; + signal spr_buffer_ram2_di : std_logic_vector(3 downto 0); + signal spr_buffer_ram2_do : std_logic_vector(3 downto 0); + + signal sound_cmd : std_logic_vector( 7 downto 0); + signal audio : std_logic_vector(11 downto 0); + + signal input_0 : std_logic_vector(7 downto 0); + signal input_1 : std_logic_vector(7 downto 0); + signal input_2 : std_logic_vector(7 downto 0); + +begin + +clock_36n <= not clock_36; +reset_n <= not reset; + +-- debug +process (reset, clock_36) +begin + if rising_edge(clock_36) and cpu_ena ='1' and cpu_mreq_n ='0' then + dbg_cpu_addr <= cpu_addr; + end if; +end process; + +-- make enables clock from 36MHz +process (clock_36, reset) +begin + if reset='1' then + clock_cnt <= "0000"; + else + if rising_edge(clock_36) then + if clock_cnt = "1011" then + clock_cnt <= "0000"; + else + clock_cnt <= clock_cnt + 1; + end if; + end if; + end if; +end process; + +pix_ena <= '1' when clock_cnt = "0101" or clock_cnt = "1011" else '0'; -- (6MHz) +cpu_ena <= '1' when clock_cnt = "1011" else '0'; -- (3MHz) + +------------------- +-- Video scanner -- +------------------- +-- hcnt [x080..x0FF-x100..x1FF] => 128+256 = 384 pixels, 384/6.144Mhz => 1 line is 62.5us (16.000KHz) +-- vcnt [x0E6..x0FF-x100..x1FF] => 26+256 = 282 lines, 1 frame is 260 x 62.5us = 17.625ms (56.74Hz) + +process (reset, clock_36) +begin + if reset='1' then + hcnt <= (others=>'0'); + vcnt <= '0'&X"FC"; + else + if rising_edge(clock_36) and pix_ena = '1'then + hcnt <= hcnt + 1; + if hcnt = '1'&x"FF" then + hcnt <= '0'&x"80"; + vcnt <= vcnt + 1; + if vcnt = '1'&x"FF" then + vcnt <= '0'&x"E6"; -- from M52 schematics + end if; + end if; + end if; + end if; +end process; + +flip <= flip_int xor dip_switch_2(0); +hcnt_flip <= '0'&hcnt(7 downto 0) when flip ='1' else '0' & not hcnt(7 downto 0); +vcnt_flip <= vcnt when flip ='1' else not vcnt; + +-------------------- +-- players inputs -- +-------------------- +input_0 <= "1111" & not coin1 & '1' & not start2 & not start1; +input_1 <= not brake1 & '1' & not accel1 & "111" & not left1 & not right1; +input_2 <= not brake2 & '1' & not accel2 & "111" & not left2 & not right2; + +------------------------------------------ +-- cpu data input with address decoding -- +------------------------------------------ +cpu_di <= cpu_rom_do when cpu_addr(15 downto 12) < X"8" else -- 0000-7FFF + chrram_do_to_cpu when cpu_addr(15 downto 12) = X"8" else -- 8000-8FFF + wram_do when cpu_addr(15 downto 12) = X"E" else -- E000-EFFF + input_0 when cpu_addr(15 downto 0) = X"D000" else -- D000 + input_1 when cpu_addr(15 downto 0) = X"D001" else -- D001 + input_2 when cpu_addr(15 downto 0) = X"D002" else -- D002 + dip_switch_1 when cpu_addr(15 downto 0) = X"D003" else -- D003 + dip_switch_2 when cpu_addr(15 downto 0) = X"D004" else -- D004 + X"FF"; + +------------------------------------------------------------------------ +-- Misc registers : interrupt, scroll, cocktail flip, sound trigger +------------------------------------------------------------------------ +process (clock_36, reset) +begin + if reset = '1' then + sound_cmd <= x"00"; + elsif rising_edge(clock_36) then + + if cpu_m1_n = '0' and cpu_ioreq_n = '0' then + cpu_irq_n <= '1'; + else -- lauch irq and end of frame + if ((vcnt = 230 and flip = '0') or (vcnt = 448 and flip = '1')) and (hcnt = '0'&X"80") then + cpu_irq_n <= '0'; + end if; + end if; + + if cpu_wr_n = '0' and cpu_addr(15 downto 12) = X"9" then scroll_x(7 downto 0) <= cpu_do; end if; + if cpu_wr_n = '0' and cpu_addr(15 downto 12) = X"A" then scroll_x(8) <= cpu_do(0); end if; + + if cpu_wr_n = '0' and cpu_addr(15 downto 0) = X"D000" then sound_cmd <= cpu_do; end if; + if cpu_wr_n = '0' and cpu_addr(15 downto 0) = X"D001" then flip_int <= cpu_do(0); end if; + + end if; +end process; + +------------------------------------------ +-- write enable to working ram from CPU -- +------------------------------------------ +wram_we <= '1' when cpu_wr_n = '0' and cpu_addr(15 downto 12) = X"E" else '0'; + +---------------------- +--- sprite machine --- +---------------------- +-- 3 regions sprite data scanner +-- 080-1FF => C820-C87F +-- 180-2FF => C8A0-C8FF +-- 280-3FF => C920-C97F +process (clock_36) +begin + if rising_edge(clock_36) then + spr_pix_ena <= not spr_pix_ena; -- (18MHz) + + if hcnt = '1'&x"FF" and pix_ena = '1' then -- synched with hcnt + spr_hcnt <= "000"&x"80"; + spr_pix_ena <= '0'; + else + if spr_pix_ena = '1' then + if spr_hcnt( 8 downto 0) = "1"&x"FF" then + spr_hcnt( 8 downto 0) <= '0'&x"80"; + spr_hcnt(10 downto 9) <= spr_hcnt(10 downto 9) + '1'; + else + spr_hcnt <= spr_hcnt + '1'; + end if; + end if; + end if; + end if; +end process; + +-- CPU allowed to access sprite data ram outside scrolling zone +-- from x080 to x13F when not flipped (scrolling zone from x140 to x1FF) +-- from x080 to x0FF and from x1C0 to x1FF when not flipped (scrolling zone from x100 to x1BF) +-- within scrolling zone sprite data ram is accessed by sprite data scanner (spr_hcnt) + +cpu_has_spr_ram <= '1' when ( vcnt < '1'&x"3F" and flip = '0') or + ((vcnt > '1'&x"C0" or vcnt < '0'&x"FF") and flip = '1') else '0'; + +sprram_we <= '1' when cpu_wr_n = '0' and cpu_addr(15 downto 11) = X"C"&"1" and cpu_has_spr_ram = '1' else '0'; + +sprram_addr <= '0' & spr_hcnt(10 downto 4) & spr_hcnt(2 downto 1) when cpu_has_spr_ram = '0' else + cpu_addr(9 downto 0); + + +-- latch current sprite data with respect to pixel and hcnt in relation with sprite data ram addressing +process (clock_36) +begin + if rising_edge(clock_36) then + if spr_pix_ena = '1' then + if spr_hcnt(2 downto 0) = "001" then spr_posv <= sprram_do ;end if; + if spr_hcnt(2 downto 0) = "011" then spr_attr <= sprram_do ;end if; + if spr_hcnt(2 downto 0) = "101" then spr_code <= sprram_do ;end if; + if spr_hcnt(2 downto 0) = "111" then + spr_posh <= sprram_do ; + spr_posv_r <= spr_posv; + spr_attr_r <= spr_attr; + spr_code_r <= spr_code; + end if; + end if; + end if; +end process; + +-- compute sprite presence and graphics rom address w.r.t vertical position and v_flip (attr(7)) +-- sprite is also inhibited when outside scrolling zone (cpu_has_spr_ram) +spr_vcnt <= vcnt_flip(7 downto 0) + spr_posv_r - 1 ; +spr_on_line <= '1' when spr_vcnt(7 downto 4) = x"F" and cpu_has_spr_ram = '0' else '0'; +spr_line_cnt <= spr_vcnt(4 downto 0) xor (spr_attr_r(7) & spr_attr_r(7) & spr_attr_r(7) & spr_attr_r(7) & spr_attr_r(7)); +spr_code_line <= spr_code_r & (spr_attr_r(6) xor not spr_hcnt(3)) & spr_line_cnt(3 downto 0); + +-- get and serialise sprite graphics data and w.r.t enable (attr(5)) and h_flip (attr(6)) +-- and compute palette address from graphics bits and color set# +with spr_attr_r(6 downto 5) select +spr_palette_addr(0) <= spr_graphx1_do(to_integer(unsigned(not(spr_hcnt(2 downto 0))))) when "00", + spr_graphx1_do(to_integer(unsigned( (spr_hcnt(2 downto 0))))) when "10", + '0' when others; + +with spr_attr_r(6 downto 5) select +spr_palette_addr(1) <= spr_graphx2_do(to_integer(unsigned(not(spr_hcnt(2 downto 0))))) when "00", + spr_graphx2_do(to_integer(unsigned( (spr_hcnt(2 downto 0))))) when "10", + '0' when others; + +with spr_attr_r(6 downto 5) select +spr_palette_addr(2) <= spr_graphx3_do(to_integer(unsigned(not(spr_hcnt(2 downto 0))))) when "00", + spr_graphx3_do(to_integer(unsigned( (spr_hcnt(2 downto 0))))) when "10", + '0' when others; + +spr_palette_addr(7 downto 3) <= spr_attr_r(4 downto 0); -- color set# + +---------------------------------------------------- +-- manage read/write flip-flop sprite line buffer -- +---------------------------------------------------- + +-- input buffer work at 36Mhz (read previous data before write) +-- sprite data is written to input buffer when not already written (previous data differ from 0000) + +-- buffer data is written back to 0000 (cleared) after read from output buffer +-- output buffer work at normal pixel speed (12Mhz since read previous data before clear) + +-- input/output buffers are swapped (fkip-flop) each other line + +process (clock_36) +begin + if rising_edge(clock_36) then + if spr_pix_ena = '1' then + + spr_on_line_r <= spr_on_line; + + spr_pixels(3 downto 0) <= spr_palette_do(3 downto 0); + spr_pixels(4) <= spr_attr_r(4); -- not used ! + + -- write input buffer at the right place + if spr_hcnt(3 downto 0) = "1000" then + spr_input_line_addr <= spr_posh; + else + spr_input_line_addr <= spr_input_line_addr+1; + end if; + + end if; + + -- read output buffer w.r.t. flip screen (normal/reverse) + if pix_ena = '1' then + if hcnt < '1'&x"09" then + spr_output_line_addr <= X"00"; + else + if flip = '0' then + spr_output_line_addr <= spr_output_line_addr+1; + else + spr_output_line_addr <= spr_output_line_addr-1; + end if; + end if; + + end if; + + -- demux output buffer (flip-flop) + if pix_ena = '0' then + if vcnt(0) = '1'then + spr_output_line_do <= spr_buffer_ram1_do; + else + spr_output_line_do <= spr_buffer_ram2_do; + end if; + end if; + + end if; +end process; + +-- read previous data from input buffer w.r.t. flip-flop +spr_input_line_do <= spr_buffer_ram1_do when vcnt(0) = '0' else spr_buffer_ram2_do; + +-- feed input buffer +spr_input_line_di <= spr_pixels(3 downto 0); +-- keep write data if input buffer is clear +spr_input_line_we <= '1' when spr_on_line_r = '1' and spr_pix_ena = '1' and spr_input_line_do = "0000" else '0'; + +-- feed output buufer (clear) +spr_output_line_di <= "0000"; +-- always clear just after read +spr_output_line_we <= pix_ena; + +-- flip-flop input/output buffers +spr_buffer_ram1_addr <= not(spr_input_line_addr) when vcnt(0) = '0' else spr_output_line_addr; +spr_buffer_ram1_di <= spr_input_line_di when vcnt(0) = '0' else spr_output_line_di; +spr_buffer_ram1_we <= spr_input_line_we when vcnt(0) = '0' else spr_output_line_we; + +spr_buffer_ram2_addr <= not(spr_input_line_addr) when vcnt(0) = '1' else spr_output_line_addr; +spr_buffer_ram2_di <= spr_input_line_di when vcnt(0) = '1' else spr_output_line_di; +spr_buffer_ram2_we <= spr_input_line_we when vcnt(0) = '1' else spr_output_line_we; + +-- feed sprite color lut with sprite output buffer +spr_rgb_lut_addr <= '0' & spr_output_line_do; + +-------------------- +--- char machine --- +-------------------- +-- compute scrolling zone and apply to horizontal scanner +apply_scroll <= not(vcnt_flip(6) and vcnt_flip(7)); +hcnt_scrolled <= hcnt_flip + scroll_x when apply_scroll = '1' else hcnt_flip; +hcnt_scrolled_flip <= hcnt_scrolled(2 downto 0) when flip = '1' else not (hcnt_scrolled(2 downto 0)); + +-- compute ram tile address w.r.t horizontal scanner +-- address char attr at pixel # 0 +-- address char code at pixel # 4 +-- give access to CPU for all other pixels +with hcnt_scrolled_flip(2 downto 0) select +chrram_addr <= vcnt_flip(7 downto 3) & hcnt_scrolled(8 downto 3) & '1' when "000", + vcnt_flip(7 downto 3) & hcnt_scrolled(8 downto 3) & '0' when "100", + cpu_addr(11 downto 0) when others; + +-- write enable to char tile ram from CPU +chrram_we <= '1' when cpu_wr_n = '0' and cpu_addr(15 downto 12) = X"8" and hcnt_scrolled_flip(1 downto 0) /= "00" else '0'; + +-- read char tile ram and manage char graphics +process (clock_36) +begin + if rising_edge(clock_36) then + -- latch ram tile output w.r.t to addressing scheme (attr/code/CPU) + if hcnt_scrolled_flip(2 downto 0) = "000" then + chr_attr <= chrram_do; + end if; + if hcnt_scrolled_flip(1 downto 0) /= "00" then + chrram_do_to_cpu <= chrram_do; + end if; + if hcnt_scrolled_flip(2 downto 0) = "100" then + chr_code <= chrram_do; + end if; + + -- compute graphics rom address and delay char flip and color + if hcnt_scrolled_flip(2 downto 0) = "111" and pix_ena = '1' then + chr_code_line( 2 downto 0) <= vcnt_flip(2 downto 0) xor (chr_attr(4) & chr_attr(4) & chr_attr(4)); + chr_code_line(10 downto 3) <= chr_code; + chr_code_line(12 downto 11) <= chr_attr(7) & chr_attr(6); + chr_flip_h <= chr_attr(5); + chr_color <= chr_attr(3 downto 0); + end if; + + -- get and serialise char graphics data and w.r.t char flip + -- and compute palette address from graphics bits and color set# + if pix_ena = '1' then + chr_palette_addr(6 downto 3) <= chr_color; + chr_palette_addr(7) <= '0'; + chr_palette_addr(8) <= '0'; + if chr_flip_h = '0' then + chr_palette_addr(0) <= chr_graphx1_do(to_integer(unsigned(not(hcnt_scrolled(2 downto 0))))); + chr_palette_addr(1) <= chr_graphx2_do(to_integer(unsigned(not(hcnt_scrolled(2 downto 0))))); + chr_palette_addr(2) <= chr_graphx3_do(to_integer(unsigned(not(hcnt_scrolled(2 downto 0))))); + else + chr_palette_addr(0) <= chr_graphx1_do(to_integer(unsigned(hcnt_scrolled(2 downto 0)))); + chr_palette_addr(1) <= chr_graphx2_do(to_integer(unsigned(hcnt_scrolled(2 downto 0)))); + chr_palette_addr(2) <= chr_graphx3_do(to_integer(unsigned(hcnt_scrolled(2 downto 0)))); + end if; + + end if; + end if; +end process; + +--------------------------- +-- mux char/sprite video -- +--------------------------- +process (clock_36) +begin + if rising_edge(clock_36) then + + if pix_ena = '1' then + -- always give priority to sprite when not 0000 + -- except for char color #6 and #7 of color set#15 + if spr_output_line_do /= "0000" and + (chr_palette_addr(6 downto 0) < "1111110") then + video_r <= spr_rgb_lut_do(7 downto 6); + video_g <= spr_rgb_lut_do(5 downto 3); + video_b <= spr_rgb_lut_do(2 downto 0); + else + video_r <= chr_palette_do(7 downto 6); + video_g <= chr_palette_do(5 downto 3); + video_b <= chr_palette_do(2 downto 0); + end if; + end if; + + end if; +end process; + +--------------------------------------------------------- +-- Sound board is same as Moon patrol (except CPU rom) -- +--------------------------------------------------------- +moon_patrol_sound_board : entity work.moon_patrol_sound_board +port map( + clock_E => clock_0p895, + areset => reset, + + select_sound => sound_cmd, -- not(key(1)) & sw(6 downto 0), + audio_out => audio, + + dbg_cpu_addr => open --dbg_cpu_addr +); + + +audio_out <= audio(11 downto 1); + +---------------------------- +-- video syncs and blanks -- +---------------------------- + +video_csync <= csync; + +process(clock_36) + constant hcnt_base : integer := 180; + variable hsync_cnt : std_logic_vector(8 downto 0); + variable vsync_cnt : std_logic_vector(3 downto 0); +begin + +if rising_edge(clock_36) and pix_ena = '1' then + + if hcnt = hcnt_base then + hsync_cnt := (others=>'0'); + else + hsync_cnt := hsync_cnt + 1; + end if; + + if hsync_cnt = 0 then hsync0 <= '0'; + elsif hsync_cnt = 24 then hsync0 <= '1'; + end if; + + if hsync_cnt = 0 then hsync1 <= '0'; + elsif hsync_cnt = 0+8 then hsync1 <= '1'; + elsif hsync_cnt = 192 then hsync1 <= '0'; + elsif hsync_cnt = 192+8 then hsync1 <= '1'; + end if; + + if hsync_cnt = 0 then hsync2 <= '0'; + elsif hsync_cnt = 192-8 then hsync2 <= '1'; + elsif hsync_cnt = 192 then hsync2 <= '0'; + elsif hsync_cnt = 384-8 then hsync2 <= '1'; + end if; + + if hcnt = hcnt_base then + if vcnt = 238 then + vsync_cnt := X"0"; + else + if vsync_cnt < X"F" then vsync_cnt := vsync_cnt + 1; end if; + end if; + end if; + + if vsync_cnt = 0 then csync <= hsync1; + elsif vsync_cnt = 1 then csync <= hsync1; + elsif vsync_cnt = 2 then csync <= hsync1; + elsif vsync_cnt = 3 then csync <= hsync2; + elsif vsync_cnt = 4 then csync <= hsync2; + elsif vsync_cnt = 5 then csync <= hsync2; + elsif vsync_cnt = 6 then csync <= hsync1; + elsif vsync_cnt = 7 then csync <= hsync1; + elsif vsync_cnt = 8 then csync <= hsync1; + else csync <= hsync0; + end if; + + -- hcnt : [128-511] 384 pixels + if hcnt = 128 then hblank <= '1'; + elsif hcnt = 272 then hblank <= '0'; + end if; + + -- vcnt : [230-511] 282 lines + if vcnt = 230 then vblank <= '1'; + elsif vcnt = 256 then vblank <= '0'; + end if; + + -- external sync and blank outputs + video_blankn <= not (hblank or vblank); +-- + video_hs <= hsync0; +-- + if vsync_cnt = 0 then video_vs <= '0'; + elsif vsync_cnt = 2 then video_vs <= '1'; + end if; +-- +end if; +end process; + +------------------------------ +-- components & sound board -- +------------------------------ + +-- microprocessor Z80 +cpu : entity work.T80se +generic map(Mode => 0, T2Write => 1, IOWait => 1) +port map( + RESET_n => reset_n, + CLK => clock_36, + CEN => cpu_ena, + WAIT_n => '1', + INT_n => cpu_irq_n, + NMI_n => '1', --cpu_nmi_n, + BUSRQ_n => '1', + M1_n => cpu_m1_n, + MREQ_n => cpu_mreq_n, + IORQ_n => cpu_ioreq_n, + RD_n => open, + WR_n => cpu_wr_n, + RFSH_n => open, + HALT_n => open, + BUSAK_n => open, + A => cpu_addr, + DI => cpu_di, + DO => cpu_do +); + +-- cpu program ROM 0x0000-0x7FFF +--rom_cpu : entity work.travusa_cpu +--port map( +-- clk => clock_36n, +-- addr => cpu_addr(14 downto 0), +-- data => cpu_rom_do +--); +cpu_rom_addr <= cpu_addr(14 downto 0); +cpu_rom_rd <= '1' when cpu_mreq_n = '0' and cpu_addr(15) = '0'; + +-- working RAM 0xE000-0xEFFF +wram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 12) +port map( + clk => clock_36n, + we => wram_we, + addr => cpu_addr(11 downto 0), + d => cpu_do, + q => wram_do +); + +-- char RAM 0x8000-0x8FFF +chrram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 12) +port map( + clk => clock_36n, + we => chrram_we, + addr => chrram_addr, + d => cpu_do, + q => chrram_do +); + +-- sprite RAM 0xC800-0xCBFF +sprite_ram : entity work.gen_ram +generic map( dWidth => 8, aWidth => 10) +port map( + clk => clock_36n, + we => sprram_we, + addr => sprram_addr, + d => cpu_do, + q => sprram_do +); + +-- sprite line buffer 1 +sprlinebuf1 : entity work.gen_ram +generic map( dWidth => 4, aWidth => 8) +port map( + clk => clock_36n, + we => spr_buffer_ram1_we, + addr => spr_buffer_ram1_addr, + d => spr_buffer_ram1_di, + q => spr_buffer_ram1_do +); + +-- sprite line buffer 2 +sprlinebuf2 : entity work.gen_ram +generic map( dWidth => 4, aWidth => 8) +port map( + clk => clock_36n, + we => spr_buffer_ram2_we, + addr => spr_buffer_ram2_addr, + d => spr_buffer_ram2_di, + q => spr_buffer_ram2_do +); + +-- char graphics ROM 3E +char_graphics_1 : entity work.travusa_chr_bit1 +port map( + clk => clock_36n, + addr => chr_code_line, + data => chr_graphx1_do +); + +-- char graphics ROM 3E +char_graphics_2 : entity work.travusa_chr_bit2 +port map( + clk => clock_36n, + addr => chr_code_line, + data => chr_graphx2_do +); + +-- char graphics ROM 3E +char_graphics_3 : entity work.travusa_chr_bit3 +port map( + clk => clock_36n, + addr => chr_code_line, + data => chr_graphx3_do +); + +--char palette ROM +char_palette : entity work.travusa_chr_palette +port map( + clk => clock_36n, + addr => chr_palette_addr, + data => chr_palette_do +); + +-- sprite graphics ROM 3N +sprite_graphics_1 : entity work.travusa_spr_bit1 +port map( + clk => clock_36n, + addr => spr_code_line, + data => spr_graphx1_do +); + +-- sprite graphics ROM 3L or 3M +sprite_graphics_2 : entity work.travusa_spr_bit2 +port map( + clk => clock_36n, + addr => spr_code_line, + data => spr_graphx2_do +); + +-- sprite graphics ROM 3K +sprite_graphics3 : entity work.travusa_spr_bit3 +port map( + clk => clock_36n, + addr => spr_code_line, + data => spr_graphx3_do +); + +-- sprite palette ROM 2H +spr_palette: entity work.travusa_spr_palette +port map( + clk => clock_36n, + addr => spr_palette_addr, + data => spr_palette_do +); + +-- sprite rgb lut ROM 1F +spr_rgb_lut: entity work.travusa_spr_rgb_lut +port map( + clk => clock_36n, + addr => spr_rgb_lut_addr, + data => spr_rgb_lut_do +); + +end struct; \ No newline at end of file diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/traverse_usa_de10_lite.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/traverse_usa_de10_lite.vhd new file mode 100644 index 00000000..471a19d8 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/traverse_usa_de10_lite.vhd @@ -0,0 +1,363 @@ +--------------------------------------------------------------------------------- +-- DE10_lite Top level for Traverse USA by Dar (darfpga@aol.fr) (16/03/2019) +-- http://darfpga.blogspot.fr +--------------------------------------------------------------------------------- +-- Educational use only +-- Do not redistribute synthetized file with roms +-- Do not redistribute roms whatever the form +-- Use at your own risk +--------------------------------------------------------------------------------- +-- Use traverse_usa_de10_lite.sdc to compile (Timequest constraints) +-- /!\ +-- Don't forget to set device configuration mode with memory initialization +-- (Assignments/Device/Pin options/Configuration mode) +--------------------------------------------------------------------------------- +-- +-- Main features : +-- PS2 keyboard input @gpio pins 35/34 (beware voltage translation/protection) +-- Audio pwm output @gpio pins 1/3 (beware voltage translation/protection) +-- +-- Video : 15Khz only atm +-- Cocktail mode : OK +-- Sound : OK +-- +-- For hardware schematic see my other project : NES. +-- +-- Uses 1 pll for 36MHz and 3.58MHz generation from 50MHz +-- +-- +-- Board key : +-- 0 : reset game +-- +-- Keyboard players inputs : +-- +-- F3 : Add coin +-- F2 : Start 2 players +-- F1 : Start 1 player +-- SPACE : Fire +-- RIGHT arrow : turn right +-- LEFT arrow : turn left +-- UP arrow : speed up +-- DOWN arrow : speed down +-- +-- Other details : see traverse_usa.vhd +-- For USB inputs and SGT5000 audio output see my other project: xevious_de10_lite +--------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_unsigned.all; +use ieee.numeric_std.all; + +library work; +--use work.usb_report_pkg.all; + +entity traverse_usa_de10_lite is +port( + max10_clk1_50 : in std_logic; +-- max10_clk2_50 : in std_logic; +-- adc_clk_10 : in std_logic; + ledr : out std_logic_vector(9 downto 0); + key : in std_logic_vector(1 downto 0); + sw : in std_logic_vector(9 downto 0); + +-- dram_ba : out std_logic_vector(1 downto 0); +-- dram_ldqm : out std_logic; +-- dram_udqm : out std_logic; +-- dram_ras_n : out std_logic; +-- dram_cas_n : out std_logic; +-- dram_cke : out std_logic; +-- dram_clk : out std_logic; +-- dram_we_n : out std_logic; +-- dram_cs_n : out std_logic; +-- dram_dq : inout std_logic_vector(15 downto 0); +-- dram_addr : out std_logic_vector(12 downto 0); + + hex0 : out std_logic_vector(7 downto 0); + hex1 : out std_logic_vector(7 downto 0); + hex2 : out std_logic_vector(7 downto 0); + hex3 : out std_logic_vector(7 downto 0); +-- hex4 : out std_logic_vector(7 downto 0); +-- hex5 : out std_logic_vector(7 downto 0); + + vga_r : out std_logic_vector(3 downto 0); + vga_g : out std_logic_vector(3 downto 0); + vga_b : out std_logic_vector(3 downto 0); + vga_hs : out std_logic; + vga_vs : out std_logic; + +-- gsensor_cs_n : out std_logic; +-- gsensor_int : in std_logic_vector(2 downto 0); +-- gsensor_sdi : inout std_logic; +-- gsensor_sdo : inout std_logic; +-- gsensor_sclk : out std_logic; + +-- arduino_io : inout std_logic_vector(15 downto 0); +-- arduino_reset_n : inout std_logic; + + gpio : inout std_logic_vector(35 downto 0) +); +end traverse_usa_de10_lite; + +architecture struct of traverse_usa_de10_lite is + + signal clock_36 : std_logic; + signal clock_6 : std_logic; + signal clock_3p58: std_logic; + signal reset : std_logic; + + signal clock_div : std_logic_vector(2 downto 0); + +-- signal max3421e_clk : std_logic; + + signal r : std_logic_vector(1 downto 0); + signal g : std_logic_vector(2 downto 0); + signal b : std_logic_vector(2 downto 0); + signal csync : std_logic; + signal blankn : std_logic; + + signal audio : std_logic_vector(10 downto 0); + signal pwm_accumulator : std_logic_vector(12 downto 0); + + alias reset_n : std_logic is key(0); + alias ps2_clk : std_logic is gpio(35); --gpio(0); + alias ps2_dat : std_logic is gpio(34); --gpio(1); + alias pwm_audio_out_l : std_logic is gpio(1); --gpio(2); + alias pwm_audio_out_r : std_logic is gpio(3); --gpio(3); + + signal kbd_intr : std_logic; + signal kbd_scancode : std_logic_vector(7 downto 0); + signal joyPCFRLDU : std_logic_vector(7 downto 0); +-- signal keys_HUA : std_logic_vector(2 downto 0); + +-- signal start : std_logic := '0'; +-- signal usb_report : usb_report_t; +-- signal new_usb_report : std_logic := '0'; + +signal dbg_cpu_addr : std_logic_vector(15 downto 0); + +begin + +reset <= not reset_n; + +-- tv15Khz_mode <= sw(); + +--arduino_io not used pins +--arduino_io(7) <= '1'; -- to usb host shield max3421e RESET +--arduino_io(8) <= 'Z'; -- from usb host shield max3421e GPX +--arduino_io(9) <= 'Z'; -- from usb host shield max3421e INT +--arduino_io(13) <= 'Z'; -- not used +--arduino_io(14) <= 'Z'; -- not used + +-- Clock 36MHz for traverse_usa core, 3.58MHz for sound_board +clocks : entity work.max10_pll_36p86M_3p58M +port map( + inclk0 => max10_clk1_50, + c0 => clock_36, + c1 => clock_3p58, + locked => open --pll_locked +); + +-- Traverse_usa +traverse_usa : entity work.traverse_usa +port map( + clock_36 => clock_36, + clock_3p58 => clock_3p58, + reset => reset, + +-- tv15Khz_mode => tv15Khz_mode, + video_r => r, + video_g => g, + video_b => b, + video_csync => csync, + video_blankn => blankn, + video_hs => open, --hsync, -- not tested + video_vs => open, --vsync, -- not tested + audio_out => audio, + + dip_switch_1 => x"FF", -- Coinage_B(7-4) / Cont. play(3) / Fuel consumption(2) / Fuel lost when collision (1-0) + dip_switch_2 => x"FE", -- Diag(7) / Demo(6) / Zippy(5) / Freeze (4) / M-Km(3) / Coin mode (2) / Cocktail(1) / Flip(0) + + start2 => joyPCFRLDU(7), + start1 => joyPCFRLDU(6), + coin1 => joyPCFRLDU(5), + +-- fire1 => joyPCFRLDU(4), + right1 => joyPCFRLDU(3), + left1 => joyPCFRLDU(2), + brake1 => joyPCFRLDU(1), + accel1 => joyPCFRLDU(0), + +-- fire2 => joyPCFRLDU(4), + right2 => joyPCFRLDU(3), + left2 => joyPCFRLDU(2), + brake2 => joyPCFRLDU(1), + accel2 => joyPCFRLDU(0), + + dbg_cpu_addr => dbg_cpu_addr +); + +-- adapt video to 4bits/color only +vga_r <= r&"00" when blankn = '1' else "0000"; +vga_g <= g&'0' when blankn = '1' else "0000"; +vga_b <= b&'0' when blankn = '1' else "0000"; + +-- synchro composite/ synchro horizontale +vga_hs <= csync; +-- vga_hs <= csync when tv15Khz_mode = '1' else hsync; +-- commutation rapide / synchro verticale +vga_vs <= '1'; +-- vga_vs <= '1' when tv15Khz_mode = '1' else vsync; + +--sound_string <= "00" & audio & "000" & "00" & audio & "000"; + +-- get scancode from keyboard +process (reset, clock_36) +begin + if reset='1' then + clock_div <= "000"; + clock_6 <= '0'; + else + if rising_edge(clock_36) then + if clock_div = "101" then + clock_div <= "000"; + clock_6 <= not clock_6; + else + clock_div <= clock_div + '1'; + end if; + end if; + end if; +end process; + +keyboard : entity work.io_ps2_keyboard +port map ( + clk => clock_6, -- synchrounous clock with core + kbd_clk => ps2_clk, + kbd_dat => ps2_dat, + interrupt => kbd_intr, + scancode => kbd_scancode +); + +-- translate scancode to joystick +joystick : entity work.kbd_joystick +port map ( + clk => clock_6, -- synchrounous clock with core + kbdint => kbd_intr, + kbdscancode => std_logic_vector(kbd_scancode), + joyPCFRLDU => joyPCFRLDU +); + +-- usb host for max3421e arduino shield (modified) + +--max3421e_clk <= clock_11; +--usb_host : entity work.usb_host_max3421e +--port map( +-- clk => max3421e_clk, +-- reset => reset, +-- start => start, +-- +-- usb_report => usb_report, +-- new_usb_report => new_usb_report, +-- +-- spi_cs_n => arduino_io(10), +-- spi_clk => arduino_io(13), +-- spi_mosi => arduino_io(11), +-- spi_miso => arduino_io(12) +--); + +-- usb keyboard report decoder + +--keyboard_decoder : entity work.usb_keyboard_decoder +--port map( +-- clk => max3421e_clk, +-- +-- usb_report => usb_report, +-- new_usb_report => new_usb_report, +-- +-- joyBCPPFRLDU => joyBCPPFRLDU +--); + +-- usb joystick decoder (konix drakkar wireless) + +--joystick_decoder : entity work.usb_joystick_decoder +--port map( +-- clk => max3421e_clk, +-- +-- usb_report => usb_report, +-- new_usb_report => new_usb_report, +-- +-- joyBCPPFRLDU => open --joyBCPPFRLDU +--); + +-- debug display + +--ledr(8 downto 0) <= joyBCPPFRLDU; +-- +h0 : entity work.decodeur_7_seg port map(dbg_cpu_addr( 3 downto 0),hex0); +h1 : entity work.decodeur_7_seg port map(dbg_cpu_addr( 7 downto 4),hex1); +h2 : entity work.decodeur_7_seg port map(dbg_cpu_addr(11 downto 8),hex2); +h3 : entity work.decodeur_7_seg port map(dbg_cpu_addr(15 downto 12),hex3); +--h4 : entity work.decodeur_7_seg port map(usb_report(to_integer(unsigned(sw))+0)(3 downto 0),hex4); +--h5 : entity work.decodeur_7_seg port map(usb_report(to_integer(unsigned(sw))+0)(7 downto 4),hex5); + +-- audio for sgtl5000 + +--sample_data <= "00" & audio & "000" & "00" & audio & "000"; + +-- Clock 1us for ym_8910 + +--p_clk_1us_p : process(max10_clk1_50) +--begin +-- if rising_edge(max10_clk1_50) then +-- if cnt_1us = 0 then +-- cnt_1us <= 49; +-- clk_1us <= '1'; +-- else +-- cnt_1us <= cnt_1us - 1; +-- clk_1us <= '0'; +-- end if; +-- end if; +--end process; + +-- sgtl5000 (teensy audio shield on top of usb host shield) + +--e_sgtl5000 : entity work.sgtl5000_dac +--port map( +-- clock_18 => clock_18, +-- reset => reset, +-- i2c_clock => clk_1us, +-- +-- sample_data => sample_data, +-- +-- i2c_sda => arduino_io(0), -- i2c_sda, +-- i2c_scl => arduino_io(1), -- i2c_scl, +-- +-- tx_data => arduino_io(2), -- sgtl5000 tx +-- mclk => arduino_io(4), -- sgtl5000 mclk +-- +-- lrclk => arduino_io(3), -- sgtl5000 lrclk +-- bclk => arduino_io(6), -- sgtl5000 bclk +-- +-- -- debug +-- hex0_di => open, -- hex0_di, +-- hex1_di => open, -- hex1_di, +-- hex2_di => open, -- hex2_di, +-- hex3_di => open, -- hex3_di, +-- +-- sw => sw(7 downto 0) +--); + +-- pwm sound output + +process(clock_3p58) -- use same clock as pooyan_sound_board +begin + if rising_edge(clock_3p58) then + pwm_accumulator <= std_logic_vector(unsigned('0' & pwm_accumulator(11 downto 0)) + unsigned(audio & "00")); + end if; +end process; + +pwm_audio_out_l <= pwm_accumulator(12); +pwm_audio_out_r <= pwm_accumulator(12); + + +end struct; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/ym_2149_linmix.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/ym_2149_linmix.vhd new file mode 100644 index 00000000..b0573a80 --- /dev/null +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/ym_2149_linmix.vhd @@ -0,0 +1,645 @@ +-- +-- A simulation model of YM2149 (AY-3-8910 with bells on) + +-- Copyright (c) MikeJ - Jan 2005 +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS CODE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- You are responsible for any legal issues arising from your use of this code. +-- +-- The latest version of this file can be found at: www.fpgaarcade.com +-- +-- Email support@fpgaarcade.com +-- +-- Revision list +-- +-- version 001 initial release +-- +-- Clues from MAME sound driver and Kazuhiro TSUJIKAWA +-- +-- These are the measured outputs from a real chip for a single Isolated channel into a 1K load (V) +-- vol 15 .. 0 +-- 3.27 2.995 2.741 2.588 2.452 2.372 2.301 2.258 2.220 2.198 2.178 2.166 2.155 2.148 2.141 2.132 +-- As the envelope volume is 5 bit, I have fitted a curve to the not quite log shape in order +-- to produced all the required values. +-- (The first part of the curve is a bit steeper and the last bit is more linear than expected) +-- +-- NOTE, this component uses LINEAR mixing of the three analogue channels, and is only +-- accurate for designs where the outputs are buffered and not simply wired together. +-- The ouput level is more complex in that case and requires a larger table. + +library ieee; + use ieee.std_logic_1164.all; + use ieee.std_logic_arith.all; + use ieee.std_logic_unsigned.all; + +entity YM2149 is + port ( + -- data bus + I_DA : in std_logic_vector(7 downto 0); + O_DA : out std_logic_vector(7 downto 0); + O_DA_OE_L : out std_logic; + -- control + I_A9_L : in std_logic; + I_A8 : in std_logic; + I_BDIR : in std_logic; + I_BC2 : in std_logic; + I_BC1 : in std_logic; + I_SEL_L : in std_logic; + + O_AUDIO : out std_logic_vector(7 downto 0); + -- port a + I_IOA : in std_logic_vector(7 downto 0); + O_IOA : out std_logic_vector(7 downto 0); + O_IOA_OE_L : out std_logic; + -- port b + I_IOB : in std_logic_vector(7 downto 0); + O_IOB : out std_logic_vector(7 downto 0); + O_IOB_OE_L : out std_logic; + + ENA : in std_logic; -- clock enable for higher speed operation + RESET_L : in std_logic; + CLK : in std_logic -- note 6 Mhz + ); +end; + +architecture RTL of YM2149 is + type array_16x8 is array (0 to 15) of std_logic_vector(7 downto 0); + type array_3x12 is array (1 to 3) of std_logic_vector(11 downto 0); + + signal cnt_div : std_logic_vector(3 downto 0) := (others => '0'); + signal noise_div : std_logic := '0'; + signal ena_div : std_logic; + signal ena_div_noise : std_logic; + signal poly17 : std_logic_vector(16 downto 0) := (others => '0'); + + -- registers + signal addr : std_logic_vector(7 downto 0); + signal busctrl_addr : std_logic; + signal busctrl_we : std_logic; + signal busctrl_re : std_logic; + + signal reg : array_16x8 ; --:= ( +-- "00000000", -- R0 Period Tone A 8bits lsb +-- "00000100", -- R1 Period Tone A 4bits msb +-- "00000000", -- R2 Period Tone B 8bits lsb +-- "00000010", -- R3 Period Tone B 4bits msb +-- "00000000", -- R4 Period Tone C 8bits lsb +-- "00000001", -- R5 Period Tone C 4bits msb +-- "00001000", -- R6 Period Noise 5bits +-- "00111000", -- R7 Mixer Noise CBA 3bits, Tone CBA 3bits +-- "00000111", -- R8 Amplitude A Mode 1bit, Level 4bits +-- "00000111", -- R9 Amplitude B Mode 1bit, Level 4bits +-- "00000111", -- R10 Amplitude C Mode 1bit, Level 4bits +-- "00000000", -- R11 Period Enveloppe 8bits lsb +-- "00000000", -- R12 Period Enveloppe 8bits msb +-- "00000000", -- R13 Shape Enveloppe 4bits +-- "00000000", -- R14 Port A +-- "00000000" -- R15 Port B +-- ); + + signal env_reset : std_logic; + signal ioa_inreg : std_logic_vector(7 downto 0); + signal iob_inreg : std_logic_vector(7 downto 0); + + signal noise_gen_cnt : std_logic_vector(4 downto 0); + signal noise_gen_op : std_logic; + signal tone_gen_cnt : array_3x12 := (others => (others => '0')); + signal tone_gen_op : std_logic_vector(3 downto 1) := "000"; + + signal env_gen_cnt : std_logic_vector(15 downto 0); + signal env_ena : std_logic; + signal env_hold : std_logic; + signal env_inc : std_logic; + signal env_vol : std_logic_vector(4 downto 0); + + signal tone_ena_l : std_logic; + signal tone_src : std_logic; + signal noise_ena_l : std_logic; + signal chan_vol : std_logic_vector(4 downto 0); + + signal dac_amp : std_logic_vector(7 downto 0); + signal audio_mix : std_logic_vector(9 downto 0); + signal audio_final : std_logic_vector(9 downto 0); +begin + -- cpu i/f + p_busdecode : process(I_BDIR, I_BC2, I_BC1, addr, I_A9_L, I_A8) + variable cs : std_logic; + variable sel : std_logic_vector(2 downto 0); + begin + -- BDIR BC2 BC1 MODE + -- 0 0 0 inactive + -- 0 0 1 address + -- 0 1 0 inactive + -- 0 1 1 read + -- 1 0 0 address + -- 1 0 1 inactive + -- 1 1 0 write + -- 1 1 1 read + busctrl_addr <= '0'; + busctrl_we <= '0'; + busctrl_re <= '0'; + + cs := '0'; + if (I_A9_L = '0') and (I_A8 = '1') and (addr(7 downto 4) = "0000") then + cs := '1'; + end if; + + sel := (I_BDIR & I_BC2 & I_BC1); + case sel is + when "000" => null; + when "001" => busctrl_addr <= '1'; + when "010" => null; + when "011" => busctrl_re <= cs; + when "100" => busctrl_addr <= '1'; + when "101" => null; + when "110" => busctrl_we <= cs; + when "111" => busctrl_addr <= '1'; + when others => null; + end case; + end process; + + p_oe : process(busctrl_re) + begin + -- if we are emulating a real chip, maybe clock this to fake up the tristate typ delay of 100ns + O_DA_OE_L <= not (busctrl_re); + end process; + + -- + -- CLOCKED + -- + p_waddr : process + begin + ---- looks like registers are latches in real chip, but the address is caught at the end of the address state. + wait until rising_edge(CLK); + + if (RESET_L = '0') then + addr <= (others => '0'); + else + if (busctrl_addr = '1') then + addr <= I_DA; + end if; + end if; + end process; + + p_wdata : process + begin + ---- looks like registers are latches in real chip, but the address is caught at the end of the address state. + wait until rising_edge(CLK); + env_reset <= '0'; + + if (RESET_L = '0') then + reg <= (others => (others => '0')); + env_reset <= '1'; + else + env_reset <= '0'; + if (busctrl_we = '1') then + case addr(3 downto 0) is + when x"0" => reg(0) <= I_DA; + when x"1" => reg(1) <= I_DA; + when x"2" => reg(2) <= I_DA; + when x"3" => reg(3) <= I_DA; + when x"4" => reg(4) <= I_DA; + when x"5" => reg(5) <= I_DA; + when x"6" => reg(6) <= I_DA; + when x"7" => reg(7) <= I_DA; + when x"8" => reg(8) <= I_DA; + when x"9" => reg(9) <= I_DA; + when x"A" => reg(10) <= I_DA; + when x"B" => reg(11) <= I_DA; + when x"C" => reg(12) <= I_DA; + when x"D" => reg(13) <= I_DA; env_reset <= '1'; + when x"E" => reg(14) <= I_DA; + when x"F" => reg(15) <= I_DA; + when others => null; + end case; + end if; + end if; + end process; + + -- + -- LATCHED, useful when emulating a real chip in circuit. Nasty as gated clock. + -- +-- p_waddr : process(reset_l, busctrl_addr) +-- begin +-- -- looks like registers are latches in real chip, but the address is caught at the end of the address state. +-- if (RESET_L = '0') then +-- addr <= (others => '0'); +-- elsif falling_edge(busctrl_addr) then -- yuk +-- addr <= I_DA; +-- end if; +-- end process; +-- +-- p_wdata : process(reset_l, busctrl_we, addr) +-- begin +-- if (RESET_L = '0') then +-- reg <= (others => (others => '0')); +-- elsif falling_edge(busctrl_we) then +-- case addr(3 downto 0) is +-- when x"0" => reg(0) <= I_DA; +-- when x"1" => reg(1) <= I_DA; +-- when x"2" => reg(2) <= I_DA; +-- when x"3" => reg(3) <= I_DA; +-- when x"4" => reg(4) <= I_DA; +-- when x"5" => reg(5) <= I_DA; +-- when x"6" => reg(6) <= I_DA; +-- when x"7" => reg(7) <= I_DA; +-- when x"8" => reg(8) <= I_DA; +-- when x"9" => reg(9) <= I_DA; +-- when x"A" => reg(10) <= I_DA; +-- when x"B" => reg(11) <= I_DA; +-- when x"C" => reg(12) <= I_DA; +-- when x"D" => reg(13) <= I_DA; +-- when x"E" => reg(14) <= I_DA; +-- when x"F" => reg(15) <= I_DA; +-- when others => null; +-- end case; +-- end if; +-- +-- env_reset <= '0'; +-- if (busctrl_we = '1') and (addr(3 downto 0) = x"D") then +-- env_reset <= '1'; +-- end if; +-- end process; + + -- + -- END LATCHED + -- + + p_rdata : process(busctrl_re, addr, reg) + begin + O_DA <= (others => '0'); -- 'X' + if (busctrl_re = '1') then -- not necessary, but useful for putting 'X's in the simulator + case addr(3 downto 0) is + when x"0" => O_DA <= reg(0) ; + when x"1" => O_DA <= "0000" & reg(1)(3 downto 0) ; + when x"2" => O_DA <= reg(2) ; + when x"3" => O_DA <= "0000" & reg(3)(3 downto 0) ; + when x"4" => O_DA <= reg(4) ; + when x"5" => O_DA <= "0000" & reg(5)(3 downto 0) ; + when x"6" => O_DA <= "000" & reg(6)(4 downto 0) ; + when x"7" => O_DA <= reg(7) ; + when x"8" => O_DA <= "000" & reg(8)(4 downto 0) ; + when x"9" => O_DA <= "000" & reg(9)(4 downto 0) ; + when x"A" => O_DA <= "000" & reg(10)(4 downto 0) ; + when x"B" => O_DA <= reg(11); + when x"C" => O_DA <= reg(12); + when x"D" => O_DA <= "0000" & reg(13)(3 downto 0); + when x"E" => if (reg(7)(6) = '0') then -- input + O_DA <= ioa_inreg; + else + O_DA <= reg(14); -- read output reg + end if; + when x"F" => if (Reg(7)(7) = '0') then + O_DA <= iob_inreg; + else + O_DA <= reg(15); + end if; + when others => null; + end case; + end if; + end process; + -- + p_divider : process + begin + wait until rising_edge(CLK); + -- / 8 when SEL is high and /16 when SEL is low + if (ENA = '1') then + ena_div <= '0'; + ena_div_noise <= '0'; + if (cnt_div = "0000") then + cnt_div <= (not I_SEL_L) & "111"; + ena_div <= '1'; + + noise_div <= not noise_div; + if (noise_div = '1') then + ena_div_noise <= '1'; + end if; + else + cnt_div <= cnt_div - "1"; + end if; + end if; + end process; + + p_noise_gen : process + variable noise_gen_comp : std_logic_vector(4 downto 0); + variable poly17_zero : std_logic; + begin + wait until rising_edge(CLK); + + if (reg(6)(4 downto 0) = "00000") then + noise_gen_comp := "00000"; + else + noise_gen_comp := (reg(6)(4 downto 0) - "1"); + end if; + + poly17_zero := '0'; + if (poly17 = "00000000000000000") then poly17_zero := '1'; end if; + + if (ENA = '1') then + + if (ena_div_noise = '1') then -- divider ena + + if (noise_gen_cnt >= noise_gen_comp) then + noise_gen_cnt <= "00000"; + poly17 <= (poly17(0) xor poly17(2) xor poly17_zero) & poly17(16 downto 1); + else + noise_gen_cnt <= (noise_gen_cnt + "1"); + end if; + end if; + end if; + end process; + noise_gen_op <= poly17(0); + + p_tone_gens : process + variable tone_gen_freq : array_3x12; + variable tone_gen_comp : array_3x12; + begin + wait until rising_edge(CLK); + + -- looks like real chips count up - we need to get the Exact behaviour .. + tone_gen_freq(1) := reg(1)(3 downto 0) & reg(0); + tone_gen_freq(2) := reg(3)(3 downto 0) & reg(2); + tone_gen_freq(3) := reg(5)(3 downto 0) & reg(4); + -- period 0 = period 1 + for i in 1 to 3 loop + if (tone_gen_freq(i) = x"000") then + tone_gen_comp(i) := x"000"; + else + tone_gen_comp(i) := (tone_gen_freq(i) - "1"); + end if; + end loop; + + if (ENA = '1') then + for i in 1 to 3 loop + if (ena_div = '1') then -- divider ena + + if (tone_gen_cnt(i) >= tone_gen_comp(i)) then + tone_gen_cnt(i) <= x"000"; + tone_gen_op(i) <= not tone_gen_op(i); + else + tone_gen_cnt(i) <= (tone_gen_cnt(i) + "1"); + end if; + end if; + end loop; + end if; + end process; + + p_envelope_freq : process + variable env_gen_freq : std_logic_vector(15 downto 0); + variable env_gen_comp : std_logic_vector(15 downto 0); + begin + wait until rising_edge(CLK); + env_gen_freq := reg(12) & reg(11); + -- envelope freqs 1 and 0 are the same. + if (env_gen_freq = x"0000") then + env_gen_comp := x"0000"; + else + env_gen_comp := (env_gen_freq - "1"); + end if; + + if (ENA = '1') then + env_ena <= '0'; + if (ena_div = '1') then -- divider ena + if (env_gen_cnt >= env_gen_comp) then + env_gen_cnt <= x"0000"; + env_ena <= '1'; + else + env_gen_cnt <= (env_gen_cnt + "1"); + end if; + end if; + end if; + end process; + + p_envelope_shape : process(env_reset, CLK) + variable is_bot : boolean; + variable is_bot_p1 : boolean; + variable is_top_m1 : boolean; + variable is_top : boolean; + begin + -- envelope shapes + -- C AtAlH + -- 0 0 x x \___ + -- + -- 0 1 x x /___ + -- + -- 1 0 0 0 \\\\ + -- + -- 1 0 0 1 \___ + -- + -- 1 0 1 0 \/\/ + -- ___ + -- 1 0 1 1 \ + -- + -- 1 1 0 0 //// + -- ___ + -- 1 1 0 1 / + -- + -- 1 1 1 0 /\/\ + -- + -- 1 1 1 1 /___ + if (env_reset = '1') then + -- load initial state + if (reg(13)(2) = '0') then -- attack + env_vol <= "11111"; + env_inc <= '0'; -- -1 + else + env_vol <= "00000"; + env_inc <= '1'; -- +1 + end if; + env_hold <= '0'; + + elsif rising_edge(CLK) then + is_bot := (env_vol = "00000"); + is_bot_p1 := (env_vol = "00001"); + is_top_m1 := (env_vol = "11110"); + is_top := (env_vol = "11111"); + + if (ENA = '1') then + if (env_ena = '1') then + if (env_hold = '0') then + if (env_inc = '1') then + env_vol <= (env_vol + "00001"); + else + env_vol <= (env_vol + "11111"); + end if; + end if; + + -- envelope shape control. + if (reg(13)(3) = '0') then + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + else + if is_top then env_hold <= '1'; end if; + end if; + else + if (reg(13)(0) = '1') then -- hold = 1 + if (env_inc = '0') then -- down + if (reg(13)(1) = '1') then -- alt + if is_bot then env_hold <= '1'; end if; + else + if is_bot_p1 then env_hold <= '1'; end if; + end if; + else + if (reg(13)(1) = '1') then -- alt + if is_top then env_hold <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + end if; + end if; + + elsif (reg(13)(1) = '1') then -- alternate + if (env_inc = '0') then -- down + if is_bot_p1 then env_hold <= '1'; end if; + if is_bot then env_hold <= '0'; env_inc <= '1'; end if; + else + if is_top_m1 then env_hold <= '1'; end if; + if is_top then env_hold <= '0'; env_inc <= '0'; end if; + end if; + end if; + + end if; + end if; + end if; + end if; + end process; + + p_chan_mixer : process(cnt_div, reg, tone_gen_op) + begin + tone_ena_l <= '1'; tone_src <= '1'; + noise_ena_l <= '1'; chan_vol <= "00000"; + case cnt_div(1 downto 0) is + when "00" => + tone_ena_l <= reg(7)(0); tone_src <= tone_gen_op(1); chan_vol <= reg(8)(4 downto 0); + noise_ena_l <= reg(7)(3); + when "01" => + tone_ena_l <= reg(7)(1); tone_src <= tone_gen_op(2); chan_vol <= reg(9)(4 downto 0); + noise_ena_l <= reg(7)(4); + when "10" => + tone_ena_l <= reg(7)(2); tone_src <= tone_gen_op(3); chan_vol <= reg(10)(4 downto 0); + noise_ena_l <= reg(7)(5); + when "11" => null; -- tone gen outputs become valid on this clock + when others => null; + end case; + end process; + + p_op_mixer : process + variable chan_mixed : std_logic; + variable chan_amp : std_logic_vector(4 downto 0); + begin + wait until rising_edge(CLK); + if (ENA = '1') then + + chan_mixed := (tone_ena_l or tone_src) and (noise_ena_l or noise_gen_op); + + chan_amp := (others => '0'); + if (chan_mixed = '1') then + if (chan_vol(4) = '0') then + if (chan_vol(3 downto 0) = "0000") then -- nothing is easy ! make sure quiet is quiet + chan_amp := "00000"; + else + chan_amp := chan_vol(3 downto 0) & '1'; -- make sure level 31 (env) = level 15 (tone) + end if; + else + chan_amp := env_vol(4 downto 0); + end if; + end if; + + dac_amp <= x"00"; + case chan_amp is + when "11111" => dac_amp <= x"FF"; + when "11110" => dac_amp <= x"D9"; + when "11101" => dac_amp <= x"BA"; + when "11100" => dac_amp <= x"9F"; + when "11011" => dac_amp <= x"88"; + when "11010" => dac_amp <= x"74"; + when "11001" => dac_amp <= x"63"; + when "11000" => dac_amp <= x"54"; + when "10111" => dac_amp <= x"48"; + when "10110" => dac_amp <= x"3D"; + when "10101" => dac_amp <= x"34"; + when "10100" => dac_amp <= x"2C"; + when "10011" => dac_amp <= x"25"; + when "10010" => dac_amp <= x"1F"; + when "10001" => dac_amp <= x"1A"; + when "10000" => dac_amp <= x"16"; + when "01111" => dac_amp <= x"13"; + when "01110" => dac_amp <= x"10"; + when "01101" => dac_amp <= x"0D"; + when "01100" => dac_amp <= x"0B"; + when "01011" => dac_amp <= x"09"; + when "01010" => dac_amp <= x"08"; + when "01001" => dac_amp <= x"07"; + when "01000" => dac_amp <= x"06"; + when "00111" => dac_amp <= x"05"; + when "00110" => dac_amp <= x"04"; + when "00101" => dac_amp <= x"03"; + when "00100" => dac_amp <= x"03"; + when "00011" => dac_amp <= x"02"; + when "00010" => dac_amp <= x"02"; + when "00001" => dac_amp <= x"01"; + when "00000" => dac_amp <= x"00"; + when others => null; + end case; + + if (cnt_div(1 downto 0) = "10") then + audio_mix <= (others => '0'); + audio_final <= audio_mix; + else + audio_mix <= audio_mix + ("00" & dac_amp); + end if; + + if (RESET_L = '0') then + O_AUDIO(7 downto 0) <= "00000000"; + else + if (audio_final(9) = '0') then + O_AUDIO(7 downto 0) <= audio_final(8 downto 1); + else -- clip + O_AUDIO(7 downto 0) <= x"FF"; + end if; + end if; + end if; + end process; + + p_io_ports : process(reg) + begin + O_IOA <= reg(14); + + O_IOA_OE_L <= not reg(7)(6); + O_IOB <= reg(15); + O_IOB_OE_L <= not reg(7)(7); + end process; + + p_io_ports_inreg : process + begin + wait until rising_edge(CLK); + ioa_inreg <= I_IOA; + iob_inreg <= I_IOB; + end process; +end architecture RTL; From 69e90317177dfadf4108b40b00b1b066b2fd0472 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Wed, 5 Jun 2019 22:44:11 +0200 Subject: [PATCH 4/5] Moon Patrol: sync sound board with Traverse USA --- .../src/moon_patrol_sound_board.vhd | 56 +++++++++++-------- .../MoonPatrol_MIST/src/mpatrol.vhd | 2 +- .../MoonPatrol_MIST/src/platform.vhd | 2 +- 3 files changed, 34 insertions(+), 26 deletions(-) diff --git a/Arcade_MiST/IremM52 Hardware/MoonPatrol_MIST/src/moon_patrol_sound_board.vhd b/Arcade_MiST/IremM52 Hardware/MoonPatrol_MIST/src/moon_patrol_sound_board.vhd index ab5a870f..976a5194 100644 --- a/Arcade_MiST/IremM52 Hardware/MoonPatrol_MIST/src/moon_patrol_sound_board.vhd +++ b/Arcade_MiST/IremM52 Hardware/MoonPatrol_MIST/src/moon_patrol_sound_board.vhd @@ -27,11 +27,11 @@ use ieee.numeric_std.all; entity moon_patrol_sound_board is port( clock_E : in std_logic; -- 3.58 Mhz/4 - reset : in std_logic; - + areset : in std_logic; + select_sound : in std_logic_vector(7 downto 0); audio_out : out std_logic_vector(11 downto 0); - + dbg_cpu_addr : out std_logic_vector(15 downto 0) ); end moon_patrol_sound_board; @@ -65,6 +65,9 @@ architecture struct of moon_patrol_sound_board is ); end component; + signal reset : std_logic := '1'; + signal reset_cnt : integer range 0 to 1000000 := 1000000; + signal cpu_addr : std_logic_vector(15 downto 0); signal cpu_di : std_logic_vector( 7 downto 0); signal cpu_do : std_logic_vector( 7 downto 0); @@ -112,10 +115,10 @@ architecture struct of moon_patrol_sound_board is signal adpcm_we : std_logic; signal adpcm_0_di : std_logic_vector(3 downto 0); - signal select_sound_7r : std_logic; + signal select_sound_r : std_logic_vector(7 downto 0); signal audio : std_logic_vector(12 downto 0); - + type t_step_size is array(0 to 48) of integer range 0 to 1552; constant step_size : t_step_size := ( 16, 17, 19, 21, 23, 25, 28, 31, @@ -175,14 +178,29 @@ cpu_di <= port2_in when ports_cs = '1' and cpu_addr(3 downto 0) = X"3" else rom_do when rom_cs = '1' else X"55"; +process (clock_E) +begin + if rising_edge(clock_E) then + reset <= '0'; + if reset_cnt /= 0 then + reset_cnt <= reset_cnt - 1; + reset <= '1'; + end if; + if areset = '1' then + reset_cnt <= 1000000; + end if; + end if; +end process; + -- irq to cpu process (reset, clock_E) begin if reset='1' then cpu_irq <= '0'; + select_sound_r(7) <= '1'; elsif rising_edge(clock_E) then - select_sound_7r <= select_sound(7); - if select_sound_7r = '0' then + select_sound_r <= select_sound; + if select_sound_r(7) = '0' then cpu_irq <= '1'; end if; if irqraz_we = '1' then @@ -334,27 +352,17 @@ port map( data => rom_do ); +-- cpu wram cpu_ram : entity work.spram generic map( widthad_a => 7) port map( - clock => clock_E, - address => cpu_addr(6 downto 0), - data => cpu_do, - wren => wram_we, - q => wram_do + clock => clock_E, + wren => wram_we, + address => cpu_addr(6 downto 0), + data => cpu_do, + q => wram_do ); --- cpu wram ---cpu_ram : entity work.gen_ram ---generic map( width_a => 8, aWidth => 7) ---port map( --- clk => clock_div(0), -- 3p58/2 --- we => wram_we, --- addr => cpu_addr(6 downto 0), --- d => cpu_do, --- q => wram_do ---); - ay83910_inst1: YM2149 port map ( CLK => clock_E, @@ -375,7 +383,7 @@ port map( ACTIVE => open, - IOA_in => select_sound, + IOA_in => select_sound_r, IOA_out => open, IOB_in => (others => '0'), diff --git a/Arcade_MiST/IremM52 Hardware/MoonPatrol_MIST/src/mpatrol.vhd b/Arcade_MiST/IremM52 Hardware/MoonPatrol_MIST/src/mpatrol.vhd index a6806a4e..a412e2e4 100644 --- a/Arcade_MiST/IremM52 Hardware/MoonPatrol_MIST/src/mpatrol.vhd +++ b/Arcade_MiST/IremM52 Hardware/MoonPatrol_MIST/src/mpatrol.vhd @@ -226,7 +226,7 @@ u_keyboard : keyboard moon_patrol_sound_board : entity work.moon_patrol_sound_board port map( clock_E => clk_aud, - reset => rst_aud, + areset => rst_aud, select_sound => sound_data, audio_out => audio_out, dbg_cpu_addr => open diff --git a/Arcade_MiST/IremM52 Hardware/MoonPatrol_MIST/src/platform.vhd b/Arcade_MiST/IremM52 Hardware/MoonPatrol_MIST/src/platform.vhd index 2c39dcd4..0a548789 100644 --- a/Arcade_MiST/IremM52 Hardware/MoonPatrol_MIST/src/platform.vhd +++ b/Arcade_MiST/IremM52 Hardware/MoonPatrol_MIST/src/platform.vhd @@ -157,7 +157,7 @@ begin process (clk_sys, rst_sys) begin if rst_sys = '1' then - sound_data_o <= X"FF"; + sound_data_o <= X"00"; elsif rising_edge(clk_sys) then if cpu_clk_en = '1' and cpu_mem_wr = '1' and snd_cs = '1' then sound_data_o <= cpu_d_o; From c3a0663e750094377f3d0bb18dbe72960cfe5d1b Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Thu, 6 Jun 2019 10:18:10 +0200 Subject: [PATCH 5/5] TraverseUSA: remove leftofver files --- .../TraverseUSA_MiST/TraverseUSA_MiST.qsf | 5 +- .../rtl/YM2149_linmix_sep.vhd | 574 -- .../TraverseUSA_MiST/rtl/cpu09l_128.vhd | 5906 ----------------- .../TraverseUSA_MiST/rtl/ym_2149_linmix.vhd | 645 -- 4 files changed, 2 insertions(+), 7128 deletions(-) delete mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/YM2149_linmix_sep.vhd delete mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/cpu09l_128.vhd delete mode 100644 Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/ym_2149_linmix.vhd diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/TraverseUSA_MiST.qsf b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/TraverseUSA_MiST.qsf index 66fc4b2b..c3fc9843 100644 --- a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/TraverseUSA_MiST.qsf +++ b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/TraverseUSA_MiST.qsf @@ -149,6 +149,7 @@ set_global_assignment -name GENERATE_RBF_FILE ON set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "USE AS REGULAR IO" set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top set_global_assignment -name QIP_FILE rtl/pll_mist.qip set_global_assignment -name SYSTEMVERILOG_FILE rtl/YM2149.sv set_global_assignment -name VERILOG_FILE rtl/data_io.v @@ -175,7 +176,5 @@ set_global_assignment -name VHDL_FILE rtl/moon_patrol_sound_board.vhd set_global_assignment -name VHDL_FILE rtl/gen_ram.vhd set_global_assignment -name VHDL_FILE rtl/dac.vhd set_global_assignment -name VHDL_FILE rtl/cpu68.vhd -set_global_assignment -name VHDL_FILE rtl/cpu09l_128.vhd set_global_assignment -name VERILOG_FILE rtl/build_id.v -set_global_assignment -name QIP_FILE ../../../common/mist/mist.qip -set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file +set_global_assignment -name QIP_FILE ../../../common/mist/mist.qip \ No newline at end of file diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/YM2149_linmix_sep.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/YM2149_linmix_sep.vhd deleted file mode 100644 index 6ed2498a..00000000 --- a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/YM2149_linmix_sep.vhd +++ /dev/null @@ -1,574 +0,0 @@ --- changes for seperate audio outputs and enable now enables cpu access as well --- --- A simulation model of YM2149 (AY-3-8910 with bells on) - --- Copyright (c) MikeJ - Jan 2005 --- --- All rights reserved --- --- Redistribution and use in source and synthezised forms, with or without --- modification, are permitted provided that the following conditions are met: --- --- Redistributions of source code must retain the above copyright notice, --- this list of conditions and the following disclaimer. --- --- Redistributions in synthesized form must reproduce the above copyright --- notice, this list of conditions and the following disclaimer in the --- documentation and/or other materials provided with the distribution. --- --- Neither the name of the author nor the names of other contributors may --- be used to endorse or promote products derived from this software without --- specific prior written permission. --- --- THIS CODE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" --- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, --- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR --- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE --- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR --- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF --- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS --- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN --- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) --- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE --- POSSIBILITY OF SUCH DAMAGE. --- --- You are responsible for any legal issues arising from your use of this code. --- --- The latest version of this file can be found at: www.fpgaarcade.com --- --- Email support@fpgaarcade.com --- --- Revision list --- --- version 001 initial release --- --- Clues from MAME sound driver and Kazuhiro TSUJIKAWA --- --- These are the measured outputs from a real chip for a single Isolated channel into a 1K load (V) --- vol 15 .. 0 --- 3.27 2.995 2.741 2.588 2.452 2.372 2.301 2.258 2.220 2.198 2.178 2.166 2.155 2.148 2.141 2.132 --- As the envelope volume is 5 bit, I have fitted a curve to the not quite log shape in order --- to produced all the required values. --- (The first part of the curve is a bit steeper and the last bit is more linear than expected) --- --- NOTE, this component uses LINEAR mixing of the three analogue channels, and is only --- accurate for designs where the outputs are buffered and not simply wired together. --- The ouput level is more complex in that case and requires a larger table. - -library ieee; - use ieee.std_logic_1164.all; - use ieee.std_logic_arith.all; - use ieee.std_logic_unsigned.all; - -entity YM2149 is - port ( - -- data bus - I_DA : in std_logic_vector(7 downto 0); - O_DA : out std_logic_vector(7 downto 0); - O_DA_OE_L : out std_logic; - -- control - I_A9_L : in std_logic; - I_A8 : in std_logic; - I_BDIR : in std_logic; - I_BC2 : in std_logic; - I_BC1 : in std_logic; - I_SEL_L : in std_logic; - - O_AUDIO : out std_logic_vector(7 downto 0); - O_CHAN : out std_logic_vector(1 downto 0); - -- port a - I_IOA : in std_logic_vector(7 downto 0); - O_IOA : out std_logic_vector(7 downto 0); - O_IOA_OE_L : out std_logic; - -- port b - I_IOB : in std_logic_vector(7 downto 0); - O_IOB : out std_logic_vector(7 downto 0); - O_IOB_OE_L : out std_logic; - - ENA : in std_logic; -- clock enable for higher speed operation - RESET_L : in std_logic; - CLK : in std_logic -- note 6 Mhz - ); -end; - -architecture RTL of YM2149 is - type array_16x8 is array (0 to 15) of std_logic_vector( 7 downto 0); - type array_3x12 is array (1 to 3) of std_logic_vector(11 downto 0); - - signal cnt_div : std_logic_vector(3 downto 0) := (others => '0'); - signal cnt_div_t1 : std_logic_vector(3 downto 0); - signal noise_div : std_logic := '0'; - signal ena_div : std_logic; - signal ena_div_noise : std_logic; - signal poly17 : std_logic_vector(16 downto 0) := (others => '0'); - - -- registers - signal addr : std_logic_vector(7 downto 0); - signal busctrl_addr : std_logic; - signal busctrl_we : std_logic; - signal busctrl_re : std_logic; - - signal reg : array_16x8; - signal env_reset : std_logic; - signal ioa_inreg : std_logic_vector(7 downto 0); - signal iob_inreg : std_logic_vector(7 downto 0); - - signal noise_gen_cnt : std_logic_vector(4 downto 0); - signal noise_gen_op : std_logic; - signal tone_gen_cnt : array_3x12 := (others => (others => '0')); - signal tone_gen_op : std_logic_vector(3 downto 1) := "000"; - - signal env_gen_cnt : std_logic_vector(15 downto 0); - signal env_ena : std_logic; - signal env_hold : std_logic; - signal env_inc : std_logic; - signal env_vol : std_logic_vector(4 downto 0); - - signal tone_ena_l : std_logic; - signal tone_src : std_logic; - signal noise_ena_l : std_logic; - signal chan_vol : std_logic_vector(4 downto 0); - - signal dac_amp : std_logic_vector(7 downto 0); -begin - -- cpu i/f - p_busdecode : process(I_BDIR, I_BC2, I_BC1, addr, I_A9_L, I_A8) - variable cs : std_logic; - variable sel : std_logic_vector(2 downto 0); - begin - -- BDIR BC2 BC1 MODE - -- 0 0 0 inactive - -- 0 0 1 address - -- 0 1 0 inactive - -- 0 1 1 read - -- 1 0 0 address - -- 1 0 1 inactive - -- 1 1 0 write - -- 1 1 1 read - busctrl_addr <= '0'; - busctrl_we <= '0'; - busctrl_re <= '0'; - - cs := '0'; - if (I_A9_L = '0') and (I_A8 = '1') and (addr(7 downto 4) = "0000") then - cs := '1'; - end if; - - sel := (I_BDIR & I_BC2 & I_BC1); - case sel is - when "000" => null; - when "001" => busctrl_addr <= '1'; - when "010" => null; - when "011" => busctrl_re <= cs; - when "100" => busctrl_addr <= '1'; - when "101" => null; - when "110" => busctrl_we <= cs; - when "111" => busctrl_addr <= '1'; - when others => null; - end case; - end process; - - p_oe : process(busctrl_re) - begin - -- if we are emulating a real chip, maybe clock this to fake up the tristate typ delay of 100ns - O_DA_OE_L <= not (busctrl_re); - end process; - - -- - -- CLOCKED - -- - p_waddr : process(RESET_L, CLK) - begin - -- looks like registers are latches in real chip, but the address is caught at the end of the address state. - if (RESET_L = '0') then - addr <= (others => '0'); - elsif rising_edge(CLK) then - if (ENA = '1') then - if (busctrl_addr = '1') then - addr <= I_DA; - end if; - end if; - end if; - end process; - - p_wdata : process(RESET_L, CLK) - begin - if (RESET_L = '0') then - reg <= (others => (others => '0')); - env_reset <= '1'; - elsif rising_edge(CLK) then - if (ENA = '1') then - env_reset <= '0'; - if (busctrl_we = '1') then - case addr(3 downto 0) is - when x"0" => reg(0) <= I_DA; - when x"1" => reg(1) <= I_DA; - when x"2" => reg(2) <= I_DA; - when x"3" => reg(3) <= I_DA; - when x"4" => reg(4) <= I_DA; - when x"5" => reg(5) <= I_DA; - when x"6" => reg(6) <= I_DA; - when x"7" => reg(7) <= I_DA; - when x"8" => reg(8) <= I_DA; - when x"9" => reg(9) <= I_DA; - when x"A" => reg(10) <= I_DA; - when x"B" => reg(11) <= I_DA; - when x"C" => reg(12) <= I_DA; - when x"D" => reg(13) <= I_DA; env_reset <= '1'; - when x"E" => reg(14) <= I_DA; - when x"F" => reg(15) <= I_DA; - when others => null; - end case; - end if; - end if; - end if; - end process; - - p_rdata : process(busctrl_re, addr, reg, ioa_inreg, iob_inreg) - begin - O_DA <= (others => '0'); -- 'X' - if (busctrl_re = '1') then -- not necessary, but useful for putting 'X's in the simulator - case addr(3 downto 0) is - when x"0" => O_DA <= reg(0) ; - when x"1" => O_DA <= "0000" & reg(1)(3 downto 0) ; - when x"2" => O_DA <= reg(2) ; - when x"3" => O_DA <= "0000" & reg(3)(3 downto 0) ; - when x"4" => O_DA <= reg(4) ; - when x"5" => O_DA <= "0000" & reg(5)(3 downto 0) ; - when x"6" => O_DA <= "000" & reg(6)(4 downto 0) ; - when x"7" => O_DA <= reg(7) ; - when x"8" => O_DA <= "000" & reg(8)(4 downto 0) ; - when x"9" => O_DA <= "000" & reg(9)(4 downto 0) ; - when x"A" => O_DA <= "000" & reg(10)(4 downto 0) ; - when x"B" => O_DA <= reg(11); - when x"C" => O_DA <= reg(12); - when x"D" => O_DA <= "0000" & reg(13)(3 downto 0); - when x"E" => if (reg(7)(6) = '0') then -- input - O_DA <= ioa_inreg; - else - O_DA <= reg(14); -- read output reg - end if; - when x"F" => if (Reg(7)(7) = '0') then - O_DA <= iob_inreg; - else - O_DA <= reg(15); - end if; - when others => null; - end case; - end if; - end process; - -- - p_divider : process - begin - wait until rising_edge(CLK); - -- / 8 when SEL is high and /16 when SEL is low - if (ENA = '1') then - ena_div <= '0'; - ena_div_noise <= '0'; - if (cnt_div = "0000") then - cnt_div <= (not I_SEL_L) & "111"; - ena_div <= '1'; - - noise_div <= not noise_div; - if (noise_div = '1') then - ena_div_noise <= '1'; - end if; - else - cnt_div <= cnt_div - "1"; - end if; - end if; - end process; - - p_noise_gen : process - variable noise_gen_comp : std_logic_vector(4 downto 0); - variable poly17_zero : std_logic; - begin - wait until rising_edge(CLK); - if (reg(6)(4 downto 0) = "00000") then - noise_gen_comp := "00000"; - else - noise_gen_comp := (reg(6)(4 downto 0) - "1"); - end if; - - poly17_zero := '0'; - if (poly17 = "00000000000000000") then poly17_zero := '1'; end if; - - if (ENA = '1') then - if (ena_div_noise = '1') then -- divider ena - - if (noise_gen_cnt >= noise_gen_comp) then - noise_gen_cnt <= "00000"; - poly17 <= (poly17(0) xor poly17(2) xor poly17_zero) & poly17(16 downto 1); - else - noise_gen_cnt <= (noise_gen_cnt + "1"); - end if; - end if; - end if; - end process; - noise_gen_op <= poly17(0); - - p_tone_gens : process - variable tone_gen_freq : array_3x12; - variable tone_gen_comp : array_3x12; - begin - wait until rising_edge(CLK); - -- looks like real chips count up - we need to get the Exact behaviour .. - tone_gen_freq(1) := reg(1)(3 downto 0) & reg(0); - tone_gen_freq(2) := reg(3)(3 downto 0) & reg(2); - tone_gen_freq(3) := reg(5)(3 downto 0) & reg(4); - -- period 0 = period 1 - for i in 1 to 3 loop - if (tone_gen_freq(i) = x"000") then - tone_gen_comp(i) := x"000"; - else - tone_gen_comp(i) := (tone_gen_freq(i) - "1"); - end if; - end loop; - - if (ENA = '1') then - for i in 1 to 3 loop - if (ena_div = '1') then -- divider ena - - if (tone_gen_cnt(i) >= tone_gen_comp(i)) then - tone_gen_cnt(i) <= x"000"; - tone_gen_op(i) <= not tone_gen_op(i); - else - tone_gen_cnt(i) <= (tone_gen_cnt(i) + "1"); - end if; - end if; - end loop; - end if; - end process; - - p_envelope_freq : process - variable env_gen_freq : std_logic_vector(15 downto 0); - variable env_gen_comp : std_logic_vector(15 downto 0); - begin - wait until rising_edge(CLK); - env_gen_freq := reg(12) & reg(11); - -- envelope freqs 1 and 0 are the same. - if (env_gen_freq = x"0000") then - env_gen_comp := x"0000"; - else - env_gen_comp := (env_gen_freq - "1"); - end if; - - if (ENA = '1') then - env_ena <= '0'; - if (ena_div = '1') then -- divider ena - if (env_gen_cnt >= env_gen_comp) then - env_gen_cnt <= x"0000"; - env_ena <= '1'; - else - env_gen_cnt <= (env_gen_cnt + "1"); - end if; - end if; - end if; - end process; - - p_envelope_shape : process(env_reset, reg, CLK) - variable is_bot : boolean; - variable is_bot_p1 : boolean; - variable is_top_m1 : boolean; - variable is_top : boolean; - begin - -- envelope shapes - -- C AtAlH - -- 0 0 x x \___ - -- - -- 0 1 x x /___ - -- - -- 1 0 0 0 \\\\ - -- - -- 1 0 0 1 \___ - -- - -- 1 0 1 0 \/\/ - -- ___ - -- 1 0 1 1 \ - -- - -- 1 1 0 0 //// - -- ___ - -- 1 1 0 1 / - -- - -- 1 1 1 0 /\/\ - -- - -- 1 1 1 1 /___ - if (env_reset = '1') then - -- load initial state - if (reg(13)(2) = '0') then -- attack - env_vol <= "11111"; - env_inc <= '0'; -- -1 - else - env_vol <= "00000"; - env_inc <= '1'; -- +1 - end if; - env_hold <= '0'; - - elsif rising_edge(CLK) then - is_bot := (env_vol = "00000"); - is_bot_p1 := (env_vol = "00001"); - is_top_m1 := (env_vol = "11110"); - is_top := (env_vol = "11111"); - - if (ENA = '1') then - if (env_ena = '1') then - if (env_hold = '0') then - if (env_inc = '1') then - env_vol <= (env_vol + "00001"); - else - env_vol <= (env_vol + "11111"); - end if; - end if; - - -- envelope shape control. - if (reg(13)(3) = '0') then - if (env_inc = '0') then -- down - if is_bot_p1 then env_hold <= '1'; end if; - else - if is_top then env_hold <= '1'; end if; - end if; - else - if (reg(13)(0) = '1') then -- hold = 1 - if (env_inc = '0') then -- down - if (reg(13)(1) = '1') then -- alt - if is_bot then env_hold <= '1'; end if; - else - if is_bot_p1 then env_hold <= '1'; end if; - end if; - else - if (reg(13)(1) = '1') then -- alt - if is_top then env_hold <= '1'; end if; - else - if is_top_m1 then env_hold <= '1'; end if; - end if; - end if; - - elsif (reg(13)(1) = '1') then -- alternate - if (env_inc = '0') then -- down - if is_bot_p1 then env_hold <= '1'; end if; - if is_bot then env_hold <= '0'; env_inc <= '1'; end if; - else - if is_top_m1 then env_hold <= '1'; end if; - if is_top then env_hold <= '0'; env_inc <= '0'; end if; - end if; - end if; - - end if; - end if; - end if; - end if; - end process; - - p_chan_mixer : process(cnt_div, reg, tone_gen_op) - begin - tone_ena_l <= '1'; tone_src <= '1'; - noise_ena_l <= '1'; chan_vol <= "00000"; - case cnt_div(1 downto 0) is - when "00" => - tone_ena_l <= reg(7)(0); tone_src <= tone_gen_op(1); chan_vol <= reg(8)(4 downto 0); - noise_ena_l <= reg(7)(3); - when "01" => - tone_ena_l <= reg(7)(1); tone_src <= tone_gen_op(2); chan_vol <= reg(9)(4 downto 0); - noise_ena_l <= reg(7)(4); - when "10" => - tone_ena_l <= reg(7)(2); tone_src <= tone_gen_op(3); chan_vol <= reg(10)(4 downto 0); - noise_ena_l <= reg(7)(5); - when "11" => null; -- tone gen outputs become valid on this clock - when others => null; - end case; - end process; - - p_op_mixer : process - variable chan_mixed : std_logic; - variable chan_amp : std_logic_vector(4 downto 0); - begin - wait until rising_edge(CLK); - if (ENA = '1') then - - chan_mixed := (tone_ena_l or tone_src) and (noise_ena_l or noise_gen_op); - - chan_amp := (others => '0'); - if (chan_mixed = '1') then - if (chan_vol(4) = '0') then - if (chan_vol(3 downto 0) = "0000") then -- nothing is easy ! make sure quiet is quiet - chan_amp := "00000"; - else - chan_amp := chan_vol(3 downto 0) & '1'; -- make sure level 31 (env) = level 15 (tone) - end if; - else - chan_amp := env_vol(4 downto 0); - end if; - end if; - - dac_amp <= x"00"; - case chan_amp is - when "11111" => dac_amp <= x"FF"; - when "11110" => dac_amp <= x"D9"; - when "11101" => dac_amp <= x"BA"; - when "11100" => dac_amp <= x"9F"; - when "11011" => dac_amp <= x"88"; - when "11010" => dac_amp <= x"74"; - when "11001" => dac_amp <= x"63"; - when "11000" => dac_amp <= x"54"; - when "10111" => dac_amp <= x"48"; - when "10110" => dac_amp <= x"3D"; - when "10101" => dac_amp <= x"34"; - when "10100" => dac_amp <= x"2C"; - when "10011" => dac_amp <= x"25"; - when "10010" => dac_amp <= x"1F"; - when "10001" => dac_amp <= x"1A"; - when "10000" => dac_amp <= x"16"; - when "01111" => dac_amp <= x"13"; - when "01110" => dac_amp <= x"10"; - when "01101" => dac_amp <= x"0D"; - when "01100" => dac_amp <= x"0B"; - when "01011" => dac_amp <= x"09"; - when "01010" => dac_amp <= x"08"; - when "01001" => dac_amp <= x"07"; - when "01000" => dac_amp <= x"06"; - when "00111" => dac_amp <= x"05"; - when "00110" => dac_amp <= x"04"; - when "00101" => dac_amp <= x"03"; - when "00100" => dac_amp <= x"03"; - when "00011" => dac_amp <= x"02"; - when "00010" => dac_amp <= x"02"; - when "00001" => dac_amp <= x"01"; - when "00000" => dac_amp <= x"00"; - when others => null; - end case; - - cnt_div_t1 <= cnt_div; - end if; - end process; - - p_audio_output : process(RESET_L, CLK) - begin - if (RESET_L = '0') then - O_AUDIO <= (others => '0'); - O_CHAN <= (others => '0'); - elsif rising_edge(CLK) then - - if (ENA = '1') then - O_AUDIO <= dac_amp(7 downto 0); - O_CHAN <= cnt_div_t1(1 downto 0); - end if; - end if; - end process; - - p_io_ports : process(reg) - begin - O_IOA <= reg(14); - O_IOA_OE_L <= not reg(7)(6); - O_IOB <= reg(15); - O_IOB_OE_L <= not reg(7)(7); - end process; - - p_io_ports_inreg : process - begin - wait until rising_edge(CLK); - if (ENA = '1') then -- resync - ioa_inreg <= I_IOA; - iob_inreg <= I_IOB; - end if; - end process; -end architecture RTL; diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/cpu09l_128.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/cpu09l_128.vhd deleted file mode 100644 index 12039bde..00000000 --- a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/cpu09l_128.vhd +++ /dev/null @@ -1,5906 +0,0 @@ ---===========================================================================-- --- -- --- Synthesizable 6809 instruction compatible VHDL CPU core -- --- -- ---===========================================================================-- --- --- File name : cpu09l.vhd --- --- Entity name : cpu09 --- --- Purpose : 6809 instruction compatible CPU core written in VHDL --- with Last Instruction Cycle, bus available, bus status, --- and instruction fetch signals. --- Not cycle compatible with the original 6809 CPU --- --- Dependencies : ieee.std_logic_1164 --- ieee.std_logic_unsigned --- --- Author : John E. Kent --- --- Email : dilbert57@opencores.org --- --- Web : http://opencores.org/project,system09 --- --- Description : VMA (valid memory address) is hight whenever a valid memory --- access is made by an instruction fetch, interrupt vector fetch --- or a data read or write otherwise it is low indicating an idle --- bus cycle. --- IFETCH (instruction fetch output) is high whenever an --- instruction byte is read i.e. the program counter is applied --- to the address bus. --- LIC (last instruction cycle output) is normally low --- but goes high on the last cycle of an instruction. --- BA (bus available output) is normally low but goes high while --- waiting in a Sync instruction state or the CPU is halted --- i.e. a DMA grant. --- BS (bus status output) is normally low but goes high during an --- interrupt or reset vector fetch or the processor is halted --- i.e. a DMA grant. --- --- Copyright (C) 2003 - 2010 John Kent --- --- This program is free software: you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation, either version 3 of the License, or --- (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program. If not, see . --- ---===========================================================================-- --- -- --- Revision History -- --- -- ---===========================================================================-- --- --- Version 0.1 - 26 June 2003 - John Kent --- Added extra level in state stack --- fixed some calls to the extended addressing state --- --- Version 0.2 - 5 Sept 2003 - John Kent --- Fixed 16 bit indexed offset (was doing read rather than fetch) --- Added/Fixed STY and STS instructions. --- ORCC_STATE ANDed CC state rather than ORed it - Now fixed --- CMPX Loaded ACCA and ACCB - Now fixed --- --- Version 1.0 - 6 Sep 2003 - John Kent --- Initial release to Open Cores --- reversed clock edge --- --- Version 1.1 - 29 November 2003 John kent --- ACCA and ACCB indexed offsets are 2's complement. --- ALU Right Mux now sign extends ACCA & ACCB offsets --- Absolute Indirect addressing performed a read on the --- second byte of the address rather than a fetch --- so it formed an incorrect address. Now fixed. --- --- Version 1.2 - 29 November 2003 John Kent --- LEAX and LEAY affect the Z bit only --- LEAS and LEAU do not affect any condition codes --- added an extra ALU control for LEA. --- --- Version 1.3 - 12 December 2003 John Kent --- CWAI did not work, was missed a PUSH_ST on calling --- the ANDCC_STATE. Thanks go to Ghassan Kraidy for --- finding this fault. --- --- Version 1.4 - 12 December 2003 John Kent --- Missing cc_ctrl assignment in otherwise case of --- lea_state resulted in cc_ctrl being latched in --- that state. --- The otherwise statement should never be reached, --- and has been fixed simply to resolve synthesis warnings. --- --- Version 1.5 - 17 january 2004 John kent --- The clear instruction used "alu_ld8" to control the ALU --- rather than "alu_clr". This mean the Carry was not being --- cleared correctly. --- --- Version 1.6 - 24 January 2004 John Kent --- Fixed problems in PSHU instruction --- --- Version 1.7 - 25 January 2004 John Kent --- removed redundant "alu_inx" and "alu_dex' --- Removed "test_alu" and "test_cc" --- STD instruction did not set condition codes --- JMP direct was not decoded properly --- CLR direct performed an unwanted read cycle --- Bogus "latch_md" in Page2 indexed addressing --- --- Version 1.8 - 27 January 2004 John Kent --- CWAI in decode1_state should increment the PC. --- ABX is supposed to be an unsigned addition. --- Added extra ALU function --- ASR8 slightly changed in the ALU. --- --- Version 1.9 - 20 August 2005 --- LSR8 is now handled in ASR8 and ROR8 case in the ALU, --- rather than LSR16. There was a problem with single --- operand instructions using the MD register which is --- sign extended on the first 8 bit fetch. --- --- Version 1.10 - 13 September 2005 --- TFR & EXG instructions did not work for the Condition Code Register --- An extra case has been added to the ALU for the alu_tfr control --- to assign the left ALU input (alu_left) to the condition code --- outputs (cc_out). --- --- Version 1.11 - 16 September 2005 --- JSR ,X should not predecrement S before calculating the jump address. --- The reason is that JSR [0,S] needs S to point to the top of the stack --- to fetch a valid vector address. The solution is to have the addressing --- mode microcode called before decrementing S and then decrementing S in --- JSR_STATE. JSR_STATE in turn calls PUSH_RETURN_LO_STATE rather than --- PUSH_RETURN_HI_STATE so that both the High & Low halves of the PC are --- pushed on the stack. This adds one extra bus cycle, but resolves the --- addressing conflict. I've also removed the pre-decement S in --- JSR EXTENDED as it also calls JSR_STATE. --- --- Version 1.12 - 6th June 2006 --- 6809 Programming reference manual says V is not affected by ASR, LSR and ROR --- This is different to the 6800. CLR should reset the V bit. --- --- Version 1.13 - 7th July 2006 --- Disable NMI on reset until S Stack pointer has been loaded. --- Added nmi_enable signal in sp_reg process and nmi_handler process. --- --- Version 1.14 - 11th July 2006 --- 1. Added new state to RTI called rti_entire_state. --- This state tests the CC register after it has been loaded --- from the stack. Previously the current CC was tested which --- was incorrect. The Entire Flag should be set before the --- interrupt stacks the CC. --- 2. On bogus Interrupts, int_cc_state went to rti_state, --- which was an enumerated state, but not defined anywhere. --- rti_state has been changed to rti_cc_state so that bogus interrupt --- will perform an RTI after entering that state. --- 3. Sync should generate an interrupt if the interrupt masks --- are cleared. If the interrupt masks are set, then an interrupt --- will cause the the PC to advance to the next instruction. --- Note that I don't wait for an interrupt to be asserted for --- three clock cycles. --- 4. Added new ALU control state "alu_mul". "alu_mul" is used in --- the Multiply instruction replacing "alu_add16". This is similar --- to "alu_add16" except it sets the Carry bit to B7 of the result --- in ACCB, sets the Zero bit if the 16 bit result is zero, but --- does not affect The Half carry (H), Negative (N) or Overflow (V) --- flags. The logic was re-arranged so that it adds md or zero so --- that the Carry condition code is set on zero multiplicands. --- 5. DAA (Decimal Adjust Accumulator) should set the Negative (N) --- and Zero Flags. It will also affect the Overflow (V) flag although --- the operation is undefined. It's anyones guess what DAA does to V. --- --- Version 1.15 - 25th Feb 2007 - John Kent --- line 9672 changed "if Halt <= '1' then" to "if Halt = '1' then" --- Changed sensitivity lists. --- --- Version 1.16 - 5th February 2008 - John Kent --- FIRQ interrupts should take priority over IRQ Interrupts. --- This presumably means they should be tested for before IRQ --- when they happen concurrently. --- --- Version 1.17 - 18th February 2008 - John Kent --- NMI in CWAI should mask IRQ and FIRQ interrupts --- --- Version 1.18 - 21st February 2008 - John Kent --- Removed default register settings in each case statement --- and placed them at the beginning of the state sequencer. --- Modified the SYNC instruction so that the interrupt vector(iv) --- is not set unless an unmasked FIRQ or IRQ is received. --- --- Version 1.19 - 25th February 2008 - John Kent --- Enumerated separate states for FIRQ/FAST and NMIIRQ/ENTIRE --- Enumerated separate states for MASKI and MASKIF states --- Removed code on BSR/JSR in fetch cycle --- --- Version 1.20 - 8th October 2011 - John Kent --- added fetch output which should go high during the fetch cycle --- --- Version 1.21 - 8th October 2011 - John Kent --- added Last Instruction Cycle signal --- replaced fetch with ifetch (instruction fetch) signal --- added ba & bs (bus available & bus status) signals --- --- Version 1.22 - 2011-10-29 John Kent --- The halt state isn't correct. --- The halt state is entered into from the fetch_state --- It returned to the fetch state which may re-run an execute cycle --- on the accumulator and it won't necessarily be the last instruction cycle --- I've changed the halt state to return to the decode1_state --- --- Version 1.23 - 2011-10-30 John Kent --- sample halt in the change_state process if lic is high (last instruction cycle) --- --- Version 1.24 - 2011-11-01 John Kent --- Handle interrupts in change_state process --- Sample interrupt inputs on last instruction cycle --- Remove iv_ctrl and implement iv (interrupt vector) in change_state process. --- Generate fic (first instruction cycle) from lic (last instruction cycle) --- and use it to complete the dual operand execute cycle before servicing --- halt or interrupts requests. --- rename lic to lic_out on the entity declaration so that lic can be tested internally. --- add int_firq1_state and int_nmirq1_state to allow for the dual operand execute cycle --- integrated nmi_ctrl into change_state process --- Reduces the microcode state stack to one entry (saved_state) --- imm16_state jumps directly to the fetch_state --- pull_return_lo states jumps directly to the fetch_state --- duplicate andcc_state as cwai_state --- rename exg1_state as exg2 state and duplicate tfr_state as exg1_state --- --- Version 1.25 - 2011-11-27 John Kent --- Changed the microcode for saving registers on an interrupt into a microcode subroutine. --- Removed SWI servicing from the change state process and made SWI, SWI2 & SWI3 --- call the interrupt microcode subroutine. --- Added additional states for nmi, and irq for interrupt servicing. --- Added additional states for nmi/irq, firq, and swi interrupts to mask I & F flags. --- --- Version 1.26 - 2013-03-18 John Kent --- pre-initialized cond_true variable to true in state sequencer --- re-arranged change_state process slightly --- --- Version 1.27 - 2015-05-30 John Kent --- Added test in state machine for masked IRQ and FIRQ in Sync_state. --- --- Version 1.28 - 2015-05-30 John Kent. --- Moved IRQ and FIRQ test from state machine to the state sequencer Sync_state. --- -library ieee; -use ieee.std_logic_1164.all; -use ieee.std_logic_unsigned.all; - -entity cpu09 is - port ( - clk : in std_logic; -- E clock input (falling edge) - rst : in std_logic; -- reset input (active high) - vma : out std_logic; -- valid memory address (active high) - lic_out : out std_logic; -- last instruction cycle (active high) - ifetch : out std_logic; -- instruction fetch cycle (active high) - opfetch : out std_logic; -- opcode fetch (active high) - ba : out std_logic; -- bus available (high on sync wait or DMA grant) - bs : out std_logic; -- bus status (high on interrupt or reset vector fetch or DMA grant) - addr : out std_logic_vector(15 downto 0); -- address bus output - rw : out std_logic; -- read not write output - data_out : out std_logic_vector(7 downto 0); -- data bus output - data_in : in std_logic_vector(7 downto 0); -- data bus input - irq : in std_logic; -- interrupt request input (active high) - firq : in std_logic; -- fast interrupt request input (active high) - nmi : in std_logic; -- non maskable interrupt request input (active high) - halt : in std_logic; -- halt input (active high) grants DMA - hold : in std_logic -- hold input (active high) extend bus cycle - ); -end cpu09; - -architecture rtl of cpu09 is - - constant EBIT : integer := 7; - constant FBIT : integer := 6; - constant HBIT : integer := 5; - constant IBIT : integer := 4; - constant NBIT : integer := 3; - constant ZBIT : integer := 2; - constant VBIT : integer := 1; - constant CBIT : integer := 0; - - -- - -- Interrupt vector modifiers - -- - constant RST_VEC : std_logic_vector(2 downto 0) := "111"; - constant NMI_VEC : std_logic_vector(2 downto 0) := "110"; - constant SWI_VEC : std_logic_vector(2 downto 0) := "101"; - constant IRQ_VEC : std_logic_vector(2 downto 0) := "100"; - constant FIRQ_VEC : std_logic_vector(2 downto 0) := "011"; - constant SWI2_VEC : std_logic_vector(2 downto 0) := "010"; - constant SWI3_VEC : std_logic_vector(2 downto 0) := "001"; - constant RESV_VEC : std_logic_vector(2 downto 0) := "000"; - - type state_type is (-- Start off in Reset - reset_state, - -- Fetch Interrupt Vectors (including reset) - vect_lo_state, vect_hi_state, vect_idle_state, - -- Fetch Instruction Cycle - fetch_state, - -- Decode Instruction Cycles - decode1_state, decode2_state, decode3_state, - -- Calculate Effective Address - imm16_state, - indexed_state, index8_state, index16_state, index16_2_state, - pcrel8_state, pcrel16_state, pcrel16_2_state, - indexaddr_state, indexaddr2_state, - postincr1_state, postincr2_state, - indirect_state, indirect2_state, indirect3_state, - extended_state, - -- single ops - single_op_read_state, - single_op_exec_state, - single_op_write_state, - -- Dual op states - dual_op_read8_state, dual_op_read16_state, dual_op_read16_2_state, - dual_op_write8_state, dual_op_write16_state, - -- - sync_state, halt_state, cwai_state, - -- - andcc_state, orcc_state, - tfr_state, - exg_state, exg1_state, exg2_state, - lea_state, - -- Multiplication - mul_state, mulea_state, muld_state, - mul0_state, mul1_state, mul2_state, mul3_state, - mul4_state, mul5_state, mul6_state, mul7_state, - -- Branches - lbranch_state, sbranch_state, - -- Jumps, Subroutine Calls and Returns - jsr_state, jmp_state, - push_return_hi_state, push_return_lo_state, - pull_return_hi_state, pull_return_lo_state, - -- Interrupt cycles - int_nmi_state, int_nmi1_state, - int_irq_state, int_irq1_state, - int_firq_state, int_firq1_state, - int_entire_state, int_fast_state, - int_pcl_state, int_pch_state, - int_upl_state, int_uph_state, - int_iyl_state, int_iyh_state, - int_ixl_state, int_ixh_state, - int_dp_state, - int_accb_state, int_acca_state, - int_cc_state, - int_cwai_state, - int_nmimask_state, int_firqmask_state, int_swimask_state, int_irqmask_state, - -- Return From Interrupt - rti_cc_state, rti_entire_state, - rti_acca_state, rti_accb_state, - rti_dp_state, - rti_ixl_state, rti_ixh_state, - rti_iyl_state, rti_iyh_state, - rti_upl_state, rti_uph_state, - rti_pcl_state, rti_pch_state, - -- Push Registers using SP - pshs_state, - pshs_pcl_state, pshs_pch_state, - pshs_upl_state, pshs_uph_state, - pshs_iyl_state, pshs_iyh_state, - pshs_ixl_state, pshs_ixh_state, - pshs_dp_state, - pshs_acca_state, pshs_accb_state, - pshs_cc_state, - -- Pull Registers using SP - puls_state, - puls_cc_state, - puls_acca_state, puls_accb_state, - puls_dp_state, - puls_ixl_state, puls_ixh_state, - puls_iyl_state, puls_iyh_state, - puls_upl_state, puls_uph_state, - puls_pcl_state, puls_pch_state, - -- Push Registers using UP - pshu_state, - pshu_pcl_state, pshu_pch_state, - pshu_spl_state, pshu_sph_state, - pshu_iyl_state, pshu_iyh_state, - pshu_ixl_state, pshu_ixh_state, - pshu_dp_state, - pshu_acca_state, pshu_accb_state, - pshu_cc_state, - -- Pull Registers using UP - pulu_state, - pulu_cc_state, - pulu_acca_state, pulu_accb_state, - pulu_dp_state, - pulu_ixl_state, pulu_ixh_state, - pulu_iyl_state, pulu_iyh_state, - pulu_spl_state, pulu_sph_state, - pulu_pcl_state, pulu_pch_state ); - - type st_type is (reset_st, push_st, idle_st ); - type iv_type is (latch_iv, swi3_iv, swi2_iv, firq_iv, irq_iv, swi_iv, nmi_iv, reset_iv); - type addr_type is (idle_ad, fetch_ad, read_ad, write_ad, pushu_ad, pullu_ad, pushs_ad, pulls_ad, int_hi_ad, int_lo_ad ); - type dout_type is (cc_dout, acca_dout, accb_dout, dp_dout, - ix_lo_dout, ix_hi_dout, iy_lo_dout, iy_hi_dout, - up_lo_dout, up_hi_dout, sp_lo_dout, sp_hi_dout, - pc_lo_dout, pc_hi_dout, md_lo_dout, md_hi_dout ); - type op_type is (reset_op, fetch_op, latch_op ); - type pre_type is (reset_pre, fetch_pre, latch_pre ); - type cc_type is (reset_cc, load_cc, pull_cc, latch_cc ); - type acca_type is (reset_acca, load_acca, load_hi_acca, pull_acca, latch_acca ); - type accb_type is (reset_accb, load_accb, pull_accb, latch_accb ); - type dp_type is (reset_dp, load_dp, pull_dp, latch_dp ); - type ix_type is (reset_ix, load_ix, pull_lo_ix, pull_hi_ix, latch_ix ); - type iy_type is (reset_iy, load_iy, pull_lo_iy, pull_hi_iy, latch_iy ); - type sp_type is (reset_sp, latch_sp, load_sp, pull_hi_sp, pull_lo_sp ); - type up_type is (reset_up, latch_up, load_up, pull_hi_up, pull_lo_up ); - type pc_type is (reset_pc, latch_pc, load_pc, pull_lo_pc, pull_hi_pc, incr_pc ); - type md_type is (reset_md, latch_md, load_md, fetch_first_md, fetch_next_md, shiftl_md ); - type ea_type is (reset_ea, latch_ea, load_ea, fetch_first_ea, fetch_next_ea ); - type left_type is (cc_left, acca_left, accb_left, dp_left, - ix_left, iy_left, up_left, sp_left, - accd_left, md_left, pc_left, ea_left ); - type right_type is (ea_right, zero_right, one_right, two_right, - acca_right, accb_right, accd_right, - md_right, md_sign5_right, md_sign8_right ); - type alu_type is (alu_add8, alu_sub8, alu_add16, alu_sub16, alu_adc, alu_sbc, - alu_and, alu_ora, alu_eor, - alu_tst, alu_inc, alu_dec, alu_clr, alu_neg, alu_com, - alu_lsr16, alu_lsl16, - alu_ror8, alu_rol8, alu_mul, - alu_asr8, alu_asl8, alu_lsr8, - alu_andcc, alu_orcc, alu_sex, alu_tfr, alu_abx, - alu_seif, alu_sei, alu_see, alu_cle, - alu_ld8, alu_st8, alu_ld16, alu_st16, alu_lea, alu_nop, alu_daa ); - - signal op_code: std_logic_vector(7 downto 0); - signal pre_code: std_logic_vector(7 downto 0); - signal acca: std_logic_vector(7 downto 0); - signal accb: std_logic_vector(7 downto 0); - signal cc: std_logic_vector(7 downto 0); - signal cc_out: std_logic_vector(7 downto 0); - signal dp: std_logic_vector(7 downto 0); - signal xreg: std_logic_vector(15 downto 0); - signal yreg: std_logic_vector(15 downto 0); - signal sp: std_logic_vector(15 downto 0); - signal up: std_logic_vector(15 downto 0); - signal ea: std_logic_vector(15 downto 0); - signal pc: std_logic_vector(15 downto 0); - signal md: std_logic_vector(15 downto 0); - signal left: std_logic_vector(15 downto 0); - signal right: std_logic_vector(15 downto 0); - signal out_alu: std_logic_vector(15 downto 0); - signal iv: std_logic_vector(2 downto 0); - signal nmi_req: std_logic; - signal nmi_ack: std_logic; - signal nmi_enable: std_logic; - signal fic: std_logic; -- first instruction cycle - signal lic: std_logic; -- last instruction cycle - - signal state: state_type; - signal next_state: state_type; - signal return_state: state_type; - signal saved_state: state_type; - signal st_ctrl: st_type; - signal iv_ctrl: iv_type; - signal pc_ctrl: pc_type; - signal ea_ctrl: ea_type; - signal op_ctrl: op_type; - signal pre_ctrl: pre_type; - signal md_ctrl: md_type; - signal acca_ctrl: acca_type; - signal accb_ctrl: accb_type; - signal ix_ctrl: ix_type; - signal iy_ctrl: iy_type; - signal cc_ctrl: cc_type; - signal dp_ctrl: dp_type; - signal sp_ctrl: sp_type; - signal up_ctrl: up_type; - signal left_ctrl: left_type; - signal right_ctrl: right_type; - signal alu_ctrl: alu_type; - signal addr_ctrl: addr_type; - signal dout_ctrl: dout_type; - - -begin - ----------------------------------- --- --- State machine stack --- ----------------------------------- ---state_stack_proc: process( clk, hold, state_stack, st_ctrl, --- return_state, fetch_state ) -state_stack_proc: process( clk, st_ctrl, return_state ) -begin - if clk'event and clk = '0' then - if hold = '0' then - case st_ctrl is - when reset_st => - saved_state <= fetch_state; - when push_st => - saved_state <= return_state; - when others => - null; - end case; - end if; - end if; -end process; - ----------------------------------- --- --- Interrupt Vector control --- ----------------------------------- --- -int_vec_proc: process( clk, iv_ctrl ) -begin - if clk'event and clk = '0' then - if hold = '0' then - case iv_ctrl is - when reset_iv => - iv <= RST_VEC; - when nmi_iv => - iv <= NMI_VEC; - when swi_iv => - iv <= SWI_VEC; - when irq_iv => - iv <= IRQ_VEC; - when firq_iv => - iv <= FIRQ_VEC; - when swi2_iv => - iv <= SWI2_VEC; - when swi3_iv => - iv <= SWI3_VEC; - when others => - null; - end case; - end if; -- hold - end if; -- clk -end process; - ----------------------------------- --- --- Program Counter Control --- ----------------------------------- - ---pc_reg: process( clk, pc_ctrl, hold, pc, out_alu, data_in ) -pc_reg: process( clk ) -begin - if clk'event and clk = '0' then - if hold = '0' then - case pc_ctrl is - when reset_pc => - pc <= (others=>'0'); - when load_pc => - pc <= out_alu(15 downto 0); - when pull_lo_pc => - pc(7 downto 0) <= data_in; - when pull_hi_pc => - pc(15 downto 8) <= data_in; - when incr_pc => - pc <= pc + 1; - when others => - null; - end case; - end if; - end if; -end process; - ----------------------------------- --- --- Effective Address Control --- ----------------------------------- - ---ea_reg: process( clk, ea_ctrl, hold, ea, out_alu, data_in, dp ) -ea_reg: process( clk ) -begin - - if clk'event and clk = '0' then - if hold= '0' then - case ea_ctrl is - when reset_ea => - ea <= (others=>'0'); - when fetch_first_ea => - ea(7 downto 0) <= data_in; - ea(15 downto 8) <= dp; - when fetch_next_ea => - ea(15 downto 8) <= ea(7 downto 0); - ea(7 downto 0) <= data_in; - when load_ea => - ea <= out_alu(15 downto 0); - when others => - null; - end case; - end if; - end if; -end process; - --------------------------------- --- --- Accumulator A --- --------------------------------- ---acca_reg : process( clk, acca_ctrl, hold, out_alu, acca, data_in ) -acca_reg : process( clk ) -begin - if clk'event and clk = '0' then - if hold = '0' then - case acca_ctrl is - when reset_acca => - acca <= (others=>'0'); - when load_acca => - acca <= out_alu(7 downto 0); - when load_hi_acca => - acca <= out_alu(15 downto 8); - when pull_acca => - acca <= data_in; - when others => - null; - end case; - end if; - end if; -end process; - --------------------------------- --- --- Accumulator B --- --------------------------------- ---accb_reg : process( clk, accb_ctrl, hold, out_alu, accb, data_in ) -accb_reg : process( clk ) -begin - if clk'event and clk = '0' then - if hold = '0' then - case accb_ctrl is - when reset_accb => - accb <= (others=>'0'); - when load_accb => - accb <= out_alu(7 downto 0); - when pull_accb => - accb <= data_in; - when others => - null; - end case; - end if; - end if; -end process; - --------------------------------- --- --- X Index register --- --------------------------------- ---ix_reg : process( clk, ix_ctrl, hold, out_alu, xreg, data_in ) -ix_reg : process( clk ) -begin - if clk'event and clk = '0' then - if hold = '0' then - case ix_ctrl is - when reset_ix => - xreg <= (others=>'0'); - when load_ix => - xreg <= out_alu(15 downto 0); - when pull_hi_ix => - xreg(15 downto 8) <= data_in; - when pull_lo_ix => - xreg(7 downto 0) <= data_in; - when others => - null; - end case; - end if; - end if; -end process; - --------------------------------- --- --- Y Index register --- --------------------------------- ---iy_reg : process( clk, iy_ctrl, hold, out_alu, yreg, data_in ) -iy_reg : process( clk ) -begin - if clk'event and clk = '0' then - if hold = '0' then - case iy_ctrl is - when reset_iy => - yreg <= (others=>'0'); - when load_iy => - yreg <= out_alu(15 downto 0); - when pull_hi_iy => - yreg(15 downto 8) <= data_in; - when pull_lo_iy => - yreg(7 downto 0) <= data_in; - when others => - null; - end case; - end if; - end if; -end process; - --------------------------------- --- --- S stack pointer --- --------------------------------- ---sp_reg : process( clk, sp_ctrl, hold, sp, out_alu, data_in, nmi_enable ) -sp_reg : process( clk ) -begin - if clk'event and clk = '0' then - if hold = '0' then - case sp_ctrl is - when reset_sp => - sp <= (others=>'0'); - nmi_enable <= '0'; - when load_sp => - sp <= out_alu(15 downto 0); - nmi_enable <= '1'; - when pull_hi_sp => - sp(15 downto 8) <= data_in; - when pull_lo_sp => - sp(7 downto 0) <= data_in; - nmi_enable <= '1'; - when others => - null; - end case; - end if; - end if; -end process; - --------------------------------- --- --- U stack pointer --- --------------------------------- ---up_reg : process( clk, up_ctrl, hold, up, out_alu, data_in ) -up_reg : process( clk ) -begin - if clk'event and clk = '0' then - if hold = '0' then - case up_ctrl is - when reset_up => - up <= (others=>'0'); - when load_up => - up <= out_alu(15 downto 0); - when pull_hi_up => - up(15 downto 8) <= data_in; - when pull_lo_up => - up(7 downto 0) <= data_in; - when others => - null; - end case; - end if; - end if; -end process; - --------------------------------- --- --- Memory Data --- --------------------------------- ---md_reg : process( clk, md_ctrl, hold, out_alu, data_in, md ) -md_reg : process( clk ) -begin - if clk'event and clk = '0' then - if hold = '0' then - case md_ctrl is - when reset_md => - md <= (others=>'0'); - when load_md => - md <= out_alu(15 downto 0); - when fetch_first_md => -- sign extend md for branches - md(15 downto 8) <= data_in(7) & data_in(7) & data_in(7) & data_in(7) & - data_in(7) & data_in(7) & data_in(7) & data_in(7) ; - md(7 downto 0) <= data_in; - when fetch_next_md => - md(15 downto 8) <= md(7 downto 0); - md(7 downto 0) <= data_in; - when shiftl_md => - md(15 downto 1) <= md(14 downto 0); - md(0) <= '0'; - when others => - null; - end case; - end if; - end if; -end process; - - ----------------------------------- --- --- Condition Codes --- ----------------------------------- - ---cc_reg: process( clk, cc_ctrl, hold, cc_out, cc, data_in ) -cc_reg: process( clk ) -begin - if clk'event and clk = '0' then - if hold = '0' then - case cc_ctrl is - when reset_cc => - cc <= "11010000"; -- set EBIT, FBIT & IBIT - when load_cc => - cc <= cc_out; - when pull_cc => - cc <= data_in; - when others => - null; - end case; - end if; - end if; -end process; - ----------------------------------- --- --- Direct Page register --- ----------------------------------- - ---dp_reg: process( clk, dp_ctrl, hold, out_alu, dp, data_in ) -dp_reg: process( clk ) -begin - if clk'event and clk = '0' then - if hold = '0' then - case dp_ctrl is - when reset_dp => - dp <= (others=>'0'); - when load_dp => - dp <= out_alu(7 downto 0); - when pull_dp => - dp <= data_in; - when others => - null; - end case; - end if; - end if; -end process; - - ----------------------------------- --- --- op code register --- ----------------------------------- - ---op_reg: process( clk, op_ctrl, hold, op_code, data_in ) -op_reg: process( clk ) -begin - if clk'event and clk = '0' then - if hold = '0' then - case op_ctrl is - when reset_op => - op_code <= "00010010"; - when fetch_op => - op_code <= data_in; - when others => - null; - end case; - end if; - end if; -end process; - - ----------------------------------- --- --- pre byte op code register --- ----------------------------------- - ---pre_reg: process( clk, pre_ctrl, hold, pre_code, data_in ) -pre_reg: process( clk ) -begin - if clk'event and clk = '0' then - if hold = '0' then - case pre_ctrl is - when reset_pre => - pre_code <= (others=>'0'); - when fetch_pre => - pre_code <= data_in; - when others => - null; - end case; - end if; - end if; -end process; - --------------------------------- --- --- state machine --- --------------------------------- - ---change_state: process( clk, rst, state, hold, next_state ) -change_state: process( clk ) -begin - if clk'event and clk = '0' then - if rst = '1' then - fic <= '0'; - nmi_ack <= '0'; - state <= reset_state; - elsif hold = '0' then - fic <= lic; - -- - -- nmi request is not cleared until nmi input goes low - -- - if (nmi_req = '0') and (nmi_ack='1') then - nmi_ack <= '0'; - end if; - - if (nmi_req = '1') and (nmi_ack = '0') and (state = int_nmimask_state) then - nmi_ack <= '1'; - end if; - - if lic = '1' then - if halt = '1' then - state <= halt_state; - - -- service non maskable interrupts - elsif (nmi_req = '1') and (nmi_ack = '0') then - state <= int_nmi_state; - -- - -- FIRQ & IRQ are level sensitive - -- - elsif (firq = '1') and (cc(FBIT) = '0') then - state <= int_firq_state; - - elsif (irq = '1') and (cc(IBIT) = '0') then - state <= int_irq_state; - -- - -- Version 1.27 2015-05-30 - -- Exit sync_state on masked interrupt. - -- - -- Version 1.28 2015-05-30 - -- Move this code to the state sequencer - -- near line 5566. - -- - -- elsif (state = sync_state) and ((firq = '1') or (irq = '1'))then - -- state <= fetch_state; - -- - else - state <= next_state; - end if; -- halt, nmi, firq, irq - else - state <= next_state; - end if; -- lic - end if; -- reset/hold - end if; -- clk -end process; - ------------------------------------- --- --- Detect Edge of NMI interrupt --- ------------------------------------- - ---nmi_handler : process( clk, rst, nmi, nmi_ack, nmi_req, nmi_enable ) -nmi_handler : process( rst, clk ) -begin - if rst='1' then - nmi_req <= '0'; - elsif clk'event and clk='0' then - if (nmi='1') and (nmi_ack='0') and (nmi_enable='1') then - nmi_req <= '1'; - else - if (nmi='0') and (nmi_ack='1') then - nmi_req <= '0'; - end if; - end if; - end if; -end process; - - ----------------------------------- --- --- Address output multiplexer --- ----------------------------------- - -addr_mux: process( addr_ctrl, pc, ea, up, sp, iv ) -begin - ifetch <= '0'; - vma <= '1'; - case addr_ctrl is - when fetch_ad => - addr <= pc; - rw <= '1'; - ifetch <= '1'; - when read_ad => - addr <= ea; - rw <= '1'; - when write_ad => - addr <= ea; - rw <= '0'; - when pushs_ad => - addr <= sp; - rw <= '0'; - when pulls_ad => - addr <= sp; - rw <= '1'; - when pushu_ad => - addr <= up; - rw <= '0'; - when pullu_ad => - addr <= up; - rw <= '1'; - when int_hi_ad => - addr <= "111111111111" & iv & "0"; - rw <= '1'; - when int_lo_ad => - addr <= "111111111111" & iv & "1"; - rw <= '1'; - when others => - addr <= "1111111111111111"; - rw <= '1'; - vma <= '0'; - end case; -end process; - --------------------------------- --- --- Data Bus output --- --------------------------------- -dout_mux : process( dout_ctrl, md, acca, accb, dp, xreg, yreg, sp, up, pc, cc ) -begin - case dout_ctrl is - when cc_dout => -- condition code register - data_out <= cc; - when acca_dout => -- accumulator a - data_out <= acca; - when accb_dout => -- accumulator b - data_out <= accb; - when dp_dout => -- direct page register - data_out <= dp; - when ix_lo_dout => -- X index reg - data_out <= xreg(7 downto 0); - when ix_hi_dout => -- X index reg - data_out <= xreg(15 downto 8); - when iy_lo_dout => -- Y index reg - data_out <= yreg(7 downto 0); - when iy_hi_dout => -- Y index reg - data_out <= yreg(15 downto 8); - when up_lo_dout => -- U stack pointer - data_out <= up(7 downto 0); - when up_hi_dout => -- U stack pointer - data_out <= up(15 downto 8); - when sp_lo_dout => -- S stack pointer - data_out <= sp(7 downto 0); - when sp_hi_dout => -- S stack pointer - data_out <= sp(15 downto 8); - when md_lo_dout => -- alu output - data_out <= md(7 downto 0); - when md_hi_dout => -- alu output - data_out <= md(15 downto 8); - when pc_lo_dout => -- low order pc - data_out <= pc(7 downto 0); - when pc_hi_dout => -- high order pc - data_out <= pc(15 downto 8); - end case; -end process; - ----------------------------------- --- --- Left Mux --- ----------------------------------- - -left_mux: process( left_ctrl, acca, accb, cc, dp, xreg, yreg, up, sp, pc, ea, md ) -begin - case left_ctrl is - when cc_left => - left(15 downto 8) <= "00000000"; - left(7 downto 0) <= cc; - when acca_left => - left(15 downto 8) <= "00000000"; - left(7 downto 0) <= acca; - when accb_left => - left(15 downto 8) <= "00000000"; - left(7 downto 0) <= accb; - when dp_left => - left(15 downto 8) <= "00000000"; - left(7 downto 0) <= dp; - when accd_left => - left(15 downto 8) <= acca; - left(7 downto 0) <= accb; - when md_left => - left <= md; - when ix_left => - left <= xreg; - when iy_left => - left <= yreg; - when sp_left => - left <= sp; - when up_left => - left <= up; - when pc_left => - left <= pc; - when others => --- when ea_left => - left <= ea; - end case; -end process; - ----------------------------------- --- --- Right Mux --- ----------------------------------- - -right_mux: process( right_ctrl, md, acca, accb, ea ) -begin - case right_ctrl is - when ea_right => - right <= ea; - when zero_right => - right <= "0000000000000000"; - when one_right => - right <= "0000000000000001"; - when two_right => - right <= "0000000000000010"; - when acca_right => - if acca(7) = '0' then - right <= "00000000" & acca(7 downto 0); - else - right <= "11111111" & acca(7 downto 0); - end if; - when accb_right => - if accb(7) = '0' then - right <= "00000000" & accb(7 downto 0); - else - right <= "11111111" & accb(7 downto 0); - end if; - when accd_right => - right <= acca & accb; - when md_sign5_right => - if md(4) = '0' then - right <= "00000000000" & md(4 downto 0); - else - right <= "11111111111" & md(4 downto 0); - end if; - when md_sign8_right => - if md(7) = '0' then - right <= "00000000" & md(7 downto 0); - else - right <= "11111111" & md(7 downto 0); - end if; - when others => --- when md_right => - right <= md; - end case; -end process; - ----------------------------------- --- --- Arithmetic Logic Unit --- ----------------------------------- - -alu: process( alu_ctrl, cc, left, right, out_alu, cc_out ) -variable valid_lo, valid_hi : boolean; -variable carry_in : std_logic; -variable daa_reg : std_logic_vector(7 downto 0); -begin - - case alu_ctrl is - when alu_adc | alu_sbc | - alu_rol8 | alu_ror8 => - carry_in := cc(CBIT); - when alu_asr8 => - carry_in := left(7); - when others => - carry_in := '0'; - end case; - - valid_lo := left(3 downto 0) <= 9; - valid_hi := left(7 downto 4) <= 9; - - -- - -- CBIT HBIT VHI VLO DAA - -- 0 0 0 0 66 (!VHI : hi_nybble>8) - -- 0 0 0 1 60 - -- 0 0 1 1 00 - -- 0 0 1 0 06 ( VHI : hi_nybble<=8) - -- - -- 0 1 1 0 06 - -- 0 1 1 1 06 - -- 0 1 0 1 66 - -- 0 1 0 0 66 - -- - -- 1 1 0 0 66 - -- 1 1 0 1 66 - -- 1 1 1 1 66 - -- 1 1 1 0 66 - -- - -- 1 0 1 0 66 - -- 1 0 1 1 60 - -- 1 0 0 1 60 - -- 1 0 0 0 66 - -- - -- 66 = (!VHI & !VLO) + (CBIT & HBIT) + (HBIT & !VHI) + (CBIT & !VLO) - -- = (CBIT & (HBIT + !VLO)) + (!VHI & (HBIT + !VLO)) - -- = (!VLO & (CBIT + !VHI)) + (HBIT & (CBIT + !VHI)) - -- 60 = (CBIT & !HBIT & VLO) + (!HBIT & !VHI & VLO) - -- = (!HBIT & VLO & (CBIT + !VHI)) - -- 06 = (!CBIT & VHI & (!VLO + VHI) - -- 00 = (!CBIT & !HBIT & VHI & VLO) - -- - if (cc(CBIT) = '0') then - -- CBIT=0 - if( cc(HBIT) = '0' ) then - -- HBIT=0 - if valid_lo then - -- lo <= 9 (no overflow in low nybble) - if valid_hi then - -- hi <= 9 (no overflow in either low or high nybble) - daa_reg := "00000000"; - else - -- hi > 9 (overflow in high nybble only) - daa_reg := "01100000"; - end if; - else - -- lo > 9 (overflow in low nybble) - -- - -- since there is already an overflow in the low nybble - -- you need to make room in the high nybble for the low nybble carry - -- so compare the high nybble with 8 rather than 9 - -- if the high nybble is 9 there will be an overflow on the high nybble - -- after the decimal adjust which means it will roll over to an invalid BCD digit - -- - if( left(7 downto 4) <= 8 ) then - -- hi <= 8 (overflow in low nybble only) - daa_reg := "00000110"; - else - -- hi > 8 (overflow in low and high nybble) - daa_reg := "01100110"; - end if; - end if; - else - -- HBIT=1 (overflow in low nybble) - if valid_hi then - -- hi <= 9 (overflow in low nybble only) - daa_reg := "00000110"; - else - -- hi > 9 (overflow in low and high nybble) - daa_reg := "01100110"; - end if; - end if; - else - -- CBIT=1 (carry => overflow in high nybble) - if ( cc(HBIT) = '0' )then - -- HBIT=0 (half carry clear => may or may not be an overflow in the low nybble) - if valid_lo then - -- lo <=9 (overflow in high nybble only) - daa_reg := "01100000"; - else - -- lo >9 (overflow in low and high nybble) - daa_reg := "01100110"; - end if; - else - -- HBIT=1 (overflow in low and high nybble) - daa_reg := "01100110"; - end if; - end if; - - case alu_ctrl is - when alu_add8 | alu_inc | - alu_add16 | alu_adc | alu_mul => - out_alu <= left + right + ("000000000000000" & carry_in); - when alu_sub8 | alu_dec | - alu_sub16 | alu_sbc => - out_alu <= left - right - ("000000000000000" & carry_in); - when alu_abx => - out_alu <= left + ("00000000" & right(7 downto 0)) ; - when alu_and => - out_alu <= left and right; -- and/bit - when alu_ora => - out_alu <= left or right; -- or - when alu_eor => - out_alu <= left xor right; -- eor/xor - when alu_lsl16 | alu_asl8 | alu_rol8 => - out_alu <= left(14 downto 0) & carry_in; -- rol8/asl8/lsl16 - when alu_lsr16 => - out_alu <= carry_in & left(15 downto 1); -- lsr16 - when alu_lsr8 | alu_asr8 | alu_ror8 => - out_alu <= "00000000" & carry_in & left(7 downto 1); -- ror8/asr8/lsr8 - when alu_neg => - out_alu <= right - left; -- neg (right=0) - when alu_com => - out_alu <= not left; - when alu_clr | alu_ld8 | alu_ld16 | alu_lea => - out_alu <= right; -- clr, ld - when alu_st8 | alu_st16 | alu_andcc | alu_orcc | alu_tfr => - out_alu <= left; - when alu_daa => - out_alu <= left + ("00000000" & daa_reg); - when alu_sex => - if left(7) = '0' then - out_alu <= "00000000" & left(7 downto 0); - else - out_alu <= "11111111" & left(7 downto 0); - end if; - when others => - out_alu <= left; -- nop - end case; - - -- - -- carry bit - -- - case alu_ctrl is - when alu_add8 | alu_adc => - cc_out(CBIT) <= (left(7) and right(7)) or - (left(7) and not out_alu(7)) or - (right(7) and not out_alu(7)); - when alu_sub8 | alu_sbc => - cc_out(CBIT) <= ((not left(7)) and right(7)) or - ((not left(7)) and out_alu(7)) or - (right(7) and out_alu(7)); - when alu_add16 => - cc_out(CBIT) <= (left(15) and right(15)) or - (left(15) and not out_alu(15)) or - (right(15) and not out_alu(15)); - when alu_sub16 => - cc_out(CBIT) <= ((not left(15)) and right(15)) or - ((not left(15)) and out_alu(15)) or - (right(15) and out_alu(15)); - when alu_ror8 | alu_lsr16 | alu_lsr8 | alu_asr8 => - cc_out(CBIT) <= left(0); - when alu_rol8 | alu_asl8 => - cc_out(CBIT) <= left(7); - when alu_lsl16 => - cc_out(CBIT) <= left(15); - when alu_com => - cc_out(CBIT) <= '1'; - when alu_neg | alu_clr => - cc_out(CBIT) <= out_alu(7) or out_alu(6) or out_alu(5) or out_alu(4) or - out_alu(3) or out_alu(2) or out_alu(1) or out_alu(0); - when alu_mul => - cc_out(CBIT) <= out_alu(7); - when alu_daa => - if ( daa_reg(7 downto 4) = "0110" ) then - cc_out(CBIT) <= '1'; - else - cc_out(CBIT) <= '0'; - end if; - when alu_andcc => - cc_out(CBIT) <= left(CBIT) and cc(CBIT); - when alu_orcc => - cc_out(CBIT) <= left(CBIT) or cc(CBIT); - when alu_tfr => - cc_out(CBIT) <= left(CBIT); - when others => - cc_out(CBIT) <= cc(CBIT); - end case; - -- - -- Zero flag - -- - case alu_ctrl is - when alu_add8 | alu_sub8 | - alu_adc | alu_sbc | - alu_and | alu_ora | alu_eor | - alu_inc | alu_dec | - alu_neg | alu_com | alu_clr | - alu_rol8 | alu_ror8 | alu_asr8 | alu_asl8 | alu_lsr8 | - alu_ld8 | alu_st8 | alu_sex | alu_daa => - cc_out(ZBIT) <= not( out_alu(7) or out_alu(6) or out_alu(5) or out_alu(4) or - out_alu(3) or out_alu(2) or out_alu(1) or out_alu(0) ); - when alu_add16 | alu_sub16 | alu_mul | - alu_lsl16 | alu_lsr16 | - alu_ld16 | alu_st16 | alu_lea => - cc_out(ZBIT) <= not( out_alu(15) or out_alu(14) or out_alu(13) or out_alu(12) or - out_alu(11) or out_alu(10) or out_alu(9) or out_alu(8) or - out_alu(7) or out_alu(6) or out_alu(5) or out_alu(4) or - out_alu(3) or out_alu(2) or out_alu(1) or out_alu(0) ); - when alu_andcc => - cc_out(ZBIT) <= left(ZBIT) and cc(ZBIT); - when alu_orcc => - cc_out(ZBIT) <= left(ZBIT) or cc(ZBIT); - when alu_tfr => - cc_out(ZBIT) <= left(ZBIT); - when others => - cc_out(ZBIT) <= cc(ZBIT); - end case; - - -- - -- negative flag - -- - case alu_ctrl is - when alu_add8 | alu_sub8 | - alu_adc | alu_sbc | - alu_and | alu_ora | alu_eor | - alu_rol8 | alu_ror8 | alu_asr8 | alu_asl8 | alu_lsr8 | - alu_inc | alu_dec | alu_neg | alu_com | alu_clr | - alu_ld8 | alu_st8 | alu_sex | alu_daa => - cc_out(NBIT) <= out_alu(7); - when alu_add16 | alu_sub16 | - alu_lsl16 | alu_lsr16 | - alu_ld16 | alu_st16 => - cc_out(NBIT) <= out_alu(15); - when alu_andcc => - cc_out(NBIT) <= left(NBIT) and cc(NBIT); - when alu_orcc => - cc_out(NBIT) <= left(NBIT) or cc(NBIT); - when alu_tfr => - cc_out(NBIT) <= left(NBIT); - when others => - cc_out(NBIT) <= cc(NBIT); - end case; - - -- - -- Interrupt mask flag - -- - case alu_ctrl is - when alu_andcc => - cc_out(IBIT) <= left(IBIT) and cc(IBIT); - when alu_orcc => - cc_out(IBIT) <= left(IBIT) or cc(IBIT); - when alu_tfr => - cc_out(IBIT) <= left(IBIT); - when alu_seif | alu_sei => - cc_out(IBIT) <= '1'; - when others => - cc_out(IBIT) <= cc(IBIT); -- interrupt mask - end case; - - -- - -- Half Carry flag - -- - case alu_ctrl is - when alu_add8 | alu_adc => - cc_out(HBIT) <= (left(3) and right(3)) or - (right(3) and not out_alu(3)) or - (left(3) and not out_alu(3)); - when alu_andcc => - cc_out(HBIT) <= left(HBIT) and cc(HBIT); - when alu_orcc => - cc_out(HBIT) <= left(HBIT) or cc(HBIT); - when alu_tfr => - cc_out(HBIT) <= left(HBIT); - when others => - cc_out(HBIT) <= cc(HBIT); - end case; - - -- - -- Overflow flag - -- - case alu_ctrl is - when alu_add8 | alu_adc => - cc_out(VBIT) <= (left(7) and right(7) and (not out_alu(7))) or - ((not left(7)) and (not right(7)) and out_alu(7)); - when alu_sub8 | alu_sbc => - cc_out(VBIT) <= (left(7) and (not right(7)) and (not out_alu(7))) or - ((not left(7)) and right(7) and out_alu(7)); - when alu_add16 => - cc_out(VBIT) <= (left(15) and right(15) and (not out_alu(15))) or - ((not left(15)) and (not right(15)) and out_alu(15)); - when alu_sub16 => - cc_out(VBIT) <= (left(15) and (not right(15)) and (not out_alu(15))) or - ((not left(15)) and right(15) and out_alu(15)); - when alu_inc => - cc_out(VBIT) <= ((not left(7)) and left(6) and left(5) and left(4) and - left(3) and left(2) and left(1) and left(0)); - when alu_dec | alu_neg => - cc_out(VBIT) <= (left(7) and (not left(6)) and (not left(5)) and (not left(4)) and - (not left(3)) and (not left(2)) and (not left(1)) and (not left(0))); --- 6809 Programming reference manual says --- V not affected by ASR, LSR and ROR --- This is different to the 6800 --- John Kent 6th June 2006 --- when alu_asr8 => --- cc_out(VBIT) <= left(0) xor left(7); --- when alu_lsr8 | alu_lsr16 => --- cc_out(VBIT) <= left(0); --- when alu_ror8 => --- cc_out(VBIT) <= left(0) xor cc(CBIT); - when alu_lsl16 => - cc_out(VBIT) <= left(15) xor left(14); - when alu_rol8 | alu_asl8 => - cc_out(VBIT) <= left(7) xor left(6); --- --- 11th July 2006 - John Kent --- What DAA does with V is anyones guess --- It is undefined in the 6809 programming manual --- - when alu_daa => - cc_out(VBIT) <= left(7) xor out_alu(7) xor cc(CBIT); --- CLR resets V Bit --- John Kent 6th June 2006 - when alu_and | alu_ora | alu_eor | alu_com | alu_clr | - alu_st8 | alu_st16 | alu_ld8 | alu_ld16 | alu_sex => - cc_out(VBIT) <= '0'; - when alu_andcc => - cc_out(VBIT) <= left(VBIT) and cc(VBIT); - when alu_orcc => - cc_out(VBIT) <= left(VBIT) or cc(VBIT); - when alu_tfr => - cc_out(VBIT) <= left(VBIT); - when others => - cc_out(VBIT) <= cc(VBIT); - end case; - - case alu_ctrl is - when alu_andcc => - cc_out(FBIT) <= left(FBIT) and cc(FBIT); - when alu_orcc => - cc_out(FBIT) <= left(FBIT) or cc(FBIT); - when alu_tfr => - cc_out(FBIT) <= left(FBIT); - when alu_seif => - cc_out(FBIT) <= '1'; - when others => - cc_out(FBIT) <= cc(FBIT); - end case; - - case alu_ctrl is - when alu_andcc => - cc_out(EBIT) <= left(EBIT) and cc(EBIT); - when alu_orcc => - cc_out(EBIT) <= left(EBIT) or cc(EBIT); - when alu_tfr => - cc_out(EBIT) <= left(EBIT); - when alu_see => - cc_out(EBIT) <= '1'; - when alu_cle => - cc_out(EBIT) <= '0'; - when others => - cc_out(EBIT) <= cc(EBIT); - end case; -end process; - ------------------------------------- --- --- state sequencer --- ------------------------------------- -process( state, saved_state, - op_code, pre_code, - cc, ea, md, iv, fic, halt, - nmi_req, firq, irq, lic ) -variable cond_true : boolean; -- variable used to evaluate coditional branches -begin - cond_true := (1=1); - ba <= '0'; - bs <= '0'; - lic <= '0'; - opfetch <= '0'; - iv_ctrl <= latch_iv; - -- Registers preserved - cc_ctrl <= latch_cc; - acca_ctrl <= latch_acca; - accb_ctrl <= latch_accb; - dp_ctrl <= latch_dp; - ix_ctrl <= latch_ix; - iy_ctrl <= latch_iy; - up_ctrl <= latch_up; - sp_ctrl <= latch_sp; - pc_ctrl <= latch_pc; - md_ctrl <= latch_md; - ea_ctrl <= latch_ea; - op_ctrl <= latch_op; - pre_ctrl <= latch_pre; - -- ALU Idle - left_ctrl <= pc_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_nop; - -- Bus idle - addr_ctrl <= idle_ad; - dout_ctrl <= cc_dout; - -- Next State Fetch - st_ctrl <= idle_st; - return_state <= fetch_state; - next_state <= fetch_state; - - case state is - when reset_state => -- released from reset - -- reset the registers - iv_ctrl <= reset_iv; - op_ctrl <= reset_op; - pre_ctrl <= reset_pre; - cc_ctrl <= reset_cc; - acca_ctrl <= reset_acca; - accb_ctrl <= reset_accb; - dp_ctrl <= reset_dp; - ix_ctrl <= reset_ix; - iy_ctrl <= reset_iy; - up_ctrl <= reset_up; - sp_ctrl <= reset_sp; - pc_ctrl <= reset_pc; - ea_ctrl <= reset_ea; - md_ctrl <= reset_md; - st_ctrl <= reset_st; - next_state <= vect_hi_state; - - -- - -- Jump via interrupt vector - -- iv holds interrupt type - -- fetch PC hi from vector location - -- - when vect_hi_state => - -- fetch pc low interrupt vector - pc_ctrl <= pull_hi_pc; - addr_ctrl <= int_hi_ad; - bs <= '1'; - next_state <= vect_lo_state; - - -- - -- jump via interrupt vector - -- iv holds vector type - -- fetch PC lo from vector location - -- - when vect_lo_state => - -- fetch the vector low byte - pc_ctrl <= pull_lo_pc; - addr_ctrl <= int_lo_ad; - bs <= '1'; - next_state <= fetch_state; - - when vect_idle_state => - -- - -- Last Instruction Cycle for SWI, SWI2 & SWI3 - -- - if op_code = "00111111" then - lic <= '1'; - end if; - next_state <= fetch_state; - - -- - -- Here to fetch an instruction - -- PC points to opcode - -- - when fetch_state => - -- fetch the op code - opfetch <= '1'; - op_ctrl <= fetch_op; - pre_ctrl <= fetch_pre; - ea_ctrl <= reset_ea; - -- Fetch op code - addr_ctrl <= fetch_ad; - -- Advance the PC to fetch next instruction byte - pc_ctrl <= incr_pc; - next_state <= decode1_state; - - -- - -- Here to decode instruction - -- and fetch next byte of intruction - -- whether it be necessary or not - -- - when decode1_state => - -- fetch first byte of address or immediate data - ea_ctrl <= fetch_first_ea; - md_ctrl <= fetch_first_md; - addr_ctrl <= fetch_ad; - case op_code(7 downto 4) is - -- - -- direct single op (2 bytes) - -- 6809 => 6 cycles - -- cpu09 => 5 cycles - -- 1 op=(pc) / pc=pc+1 - -- 2 ea_hi=dp / ea_lo=(pc) / pc=pc+1 - -- 3 md_lo=(ea) / pc=pc - -- 4 alu_left=md / md=alu_out / pc=pc - -- 5 (ea)=md_lo / pc=pc - -- - -- Exception is JMP - -- 6809 => 3 cycles - -- cpu09 => 3 cycles - -- 1 op=(pc) / pc=pc+1 - -- 2 ea_hi=dp / ea_lo=(pc) / pc=pc+1 - -- 3 pc=ea - -- - when "0000" => - -- advance the PC - pc_ctrl <= incr_pc; - - case op_code(3 downto 0) is - when "1110" => -- jmp - next_state <= jmp_state; - - when "1111" => -- clr - next_state <= single_op_exec_state; - - when others => - next_state <= single_op_read_state; - - end case; - - -- acca / accb inherent instructions - when "0001" => - case op_code(3 downto 0) is - -- - -- Page2 pre byte - -- pre=(pc) / pc=pc+1 - -- op=(pc) / pc=pc+1 - -- - when "0000" => -- page2 - opfetch <= '1'; - op_ctrl <= fetch_op; - -- advance pc - pc_ctrl <= incr_pc; - next_state <= decode2_state; - - -- - -- Page3 pre byte - -- pre=(pc) / pc=pc+1 - -- op=(pc) / pc=pc+1 - -- - when "0001" => -- page3 - opfetch <= '1'; - op_ctrl <= fetch_op; - -- advance pc - pc_ctrl <= incr_pc; - next_state <= decode3_state; - - -- - -- nop - No operation ( 1 byte ) - -- 6809 => 2 cycles - -- cpu09 => 2 cycles - -- 1 op=(pc) / pc=pc+1 - -- 2 decode - -- - when "0010" => -- nop - lic <= '1'; - next_state <= fetch_state; - - -- - -- sync - halt execution until an interrupt is received - -- interrupt may be NMI, IRQ or FIRQ - -- program execution continues if the - -- interrupt is asserted for 3 clock cycles - -- note that registers are not pushed onto the stack - -- CPU09 => Interrupts need only be asserted for one clock cycle - -- - when "0011" => -- sync - next_state <= sync_state; - - -- - -- lbra -- long branch (3 bytes) - -- 6809 => 5 cycles - -- cpu09 => 4 cycles - -- 1 op=(pc) / pc=pc+1 - -- 2 md_hi=sign(pc) / md_lo=(pc) / pc=pc+1 - -- 3 md_hi=md_lo / md_lo=(pc) / pc=pc+1 - -- 4 pc=pc+md - -- - when "0110" => - -- increment the pc - pc_ctrl <= incr_pc; - next_state <= lbranch_state; - - -- - -- lbsr - long branch to subroutine (3 bytes) - -- 6809 => 9 cycles - -- cpu09 => 6 cycles - -- 1 op=(pc) /pc=pc+1 - -- 2 md_hi=sign(pc) / md_lo=(pc) / pc=pc+1 / sp=sp-1 - -- 3 md_hi=md_lo / md_lo=(pc) / pc=pc+1 - -- 4 (sp)= pc_lo / sp=sp-1 / pc=pc - -- 5 (sp)=pc_hi / pc=pc - -- 6 pc=pc+md - -- - when "0111" => - -- pre decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- increment the pc - pc_ctrl <= incr_pc; - next_state <= lbranch_state; - - -- - -- Decimal Adjust Accumulator - -- - when "1001" => -- daa - left_ctrl <= acca_left; - right_ctrl <= accb_right; - alu_ctrl <= alu_daa; - cc_ctrl <= load_cc; - acca_ctrl <= load_acca; - lic <= '1'; - next_state <= fetch_state; - - -- - -- OR Condition Codes - -- - when "1010" => -- orcc - -- increment the pc - pc_ctrl <= incr_pc; - next_state <= orcc_state; - - -- - -- AND Condition Codes - -- - when "1100" => -- andcc - -- increment the pc - pc_ctrl <= incr_pc; - next_state <= andcc_state; - - -- - -- Sign Extend - -- - when "1101" => -- sex - left_ctrl <= accb_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_sex; - cc_ctrl <= load_cc; - acca_ctrl <= load_hi_acca; - lic <= '1'; - next_state <= fetch_state; - - -- - -- Exchange Registers - -- - when "1110" => -- exg - -- increment the pc - pc_ctrl <= incr_pc; - next_state <= exg_state; - - -- - -- Transfer Registers - -- - when "1111" => -- tfr - -- increment the pc - pc_ctrl <= incr_pc; - next_state <= tfr_state; - - when others => - -- increment the pc - pc_ctrl <= incr_pc; - lic <= '1'; - next_state <= fetch_state; - end case; - - -- - -- Short branch conditional - -- 6809 => always 3 cycles - -- cpu09 => always = 3 cycles - -- 1 op=(pc) / pc=pc+1 - -- 2 md_hi=sign(pc) / md_lo=(pc) / pc=pc+1 / test cc - -- 3 if cc tru pc=pc+md else pc=pc - -- - when "0010" => -- branch conditional - -- increment the pc - pc_ctrl <= incr_pc; - next_state <= sbranch_state; - - -- - -- Single byte stack operators - -- Do not advance PC - -- - when "0011" => - -- - -- lea - load effective address (2+ bytes) - -- 6809 => 4 cycles + addressing mode - -- cpu09 => 4 cycles + addressing mode - -- 1 op=(pc) / pc=pc+1 - -- 2 md_lo=(pc) / pc=pc+1 - -- 3 calculate ea - -- 4 ix/iy/sp/up = ea - -- - case op_code(3 downto 0) is - when "0000" | -- leax - "0001" | -- leay - "0010" | -- leas - "0011" => -- leau - -- advance PC - pc_ctrl <= incr_pc; - st_ctrl <= push_st; - return_state <= lea_state; - next_state <= indexed_state; - - -- - -- pshs - push registers onto sp stack - -- 6809 => 5 cycles + registers - -- cpu09 => 3 cycles + registers - -- 1 op=(pc) / pc=pc+1 - -- 2 ea_lo=(pc) / pc=pc+1 - -- 3 if ea(7 downto 0) != "00000000" then sp=sp-1 - -- 4 if ea(7) = 1 (sp)=pcl, sp=sp-1 - -- 5 if ea(7) = 1 (sp)=pch - -- if ea(6 downto 0) != "0000000" then sp=sp-1 - -- 6 if ea(6) = 1 (sp)=upl, sp=sp-1 - -- 7 if ea(6) = 1 (sp)=uph - -- if ea(5 downto 0) != "000000" then sp=sp-1 - -- 8 if ea(5) = 1 (sp)=iyl, sp=sp-1 - -- 9 if ea(5) = 1 (sp)=iyh - -- if ea(4 downto 0) != "00000" then sp=sp-1 - -- 10 if ea(4) = 1 (sp)=ixl, sp=sp-1 - -- 11 if ea(4) = 1 (sp)=ixh - -- if ea(3 downto 0) != "0000" then sp=sp-1 - -- 12 if ea(3) = 1 (sp)=dp - -- if ea(2 downto 0) != "000" then sp=sp-1 - -- 13 if ea(2) = 1 (sp)=accb - -- if ea(1 downto 0) != "00" then sp=sp-1 - -- 14 if ea(1) = 1 (sp)=acca - -- if ea(0 downto 0) != "0" then sp=sp-1 - -- 15 if ea(0) = 1 (sp)=cc - -- - when "0100" => -- pshs - -- advance PC - pc_ctrl <= incr_pc; - next_state <= pshs_state; - - -- - -- puls - pull registers of sp stack - -- 6809 => 5 cycles + registers - -- cpu09 => 3 cycles + registers - -- - when "0101" => -- puls - -- advance PC - pc_ctrl <= incr_pc; - next_state <= puls_state; - - -- - -- pshu - push registers onto up stack - -- 6809 => 5 cycles + registers - -- cpu09 => 3 cycles + registers - -- - when "0110" => -- pshu - -- advance PC - pc_ctrl <= incr_pc; - next_state <= pshu_state; - - -- - -- pulu - pull registers of up stack - -- 6809 => 5 cycles + registers - -- cpu09 => 3 cycles + registers - -- - when "0111" => -- pulu - -- advance PC - pc_ctrl <= incr_pc; - next_state <= pulu_state; - - -- - -- rts - return from subroutine - -- 6809 => 5 cycles - -- cpu09 => 4 cycles - -- 1 op=(pc) / pc=pc+1 - -- 2 decode op - -- 3 pc_hi = (sp) / sp=sp+1 - -- 4 pc_lo = (sp) / sp=sp+1 - -- - when "1001" => - next_state <= pull_return_hi_state; - - -- - -- ADD accb to index register - -- *** Note: this is an unsigned addition. - -- does not affect any condition codes - -- 6809 => 3 cycles - -- cpu09 => 2 cycles - -- 1 op=(pc) / pc=pc+1 - -- 2 alu_left=ix / alu_right=accb / ix=alu_out / pc=pc - -- - when "1010" => -- abx - lic <= '1'; - left_ctrl <= ix_left; - right_ctrl <= accb_right; - alu_ctrl <= alu_abx; - ix_ctrl <= load_ix; - next_state <= fetch_state; - - -- - -- Return From Interrupt - -- - when "1011" => -- rti - next_state <= rti_cc_state; - - -- - -- CWAI - -- - when "1100" => -- cwai #$ - -- pre decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- increment pc - pc_ctrl <= incr_pc; - next_state <= cwai_state; - - -- - -- MUL Multiply - -- - when "1101" => -- mul - next_state <= mul_state; - - -- - -- SWI Software Interrupt - -- - when "1111" => -- swi - -- predecrement SP - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - iv_ctrl <= swi_iv; - st_ctrl <= push_st; - return_state <= int_swimask_state; - next_state <= int_entire_state; - - when others => - lic <= '1'; - next_state <= fetch_state; - - end case; - -- - -- Accumulator A Single operand - -- source = acca, dest = acca - -- Do not advance PC - -- Typically 2 cycles 1 bytes - -- 1 opcode fetch - -- 2 post byte fetch / instruction decode - -- Note that there is no post byte - -- so do not advance PC in decode cycle - -- Re-run opcode fetch cycle after decode - -- - when "0100" => -- acca single op - left_ctrl <= acca_left; - case op_code(3 downto 0) is - - when "0000" => -- neg - right_ctrl <= zero_right; - alu_ctrl <= alu_neg; - acca_ctrl <= load_acca; - cc_ctrl <= load_cc; - - when "0011" => -- com - right_ctrl <= zero_right; - alu_ctrl <= alu_com; - acca_ctrl <= load_acca; - cc_ctrl <= load_cc; - - when "0100" => -- lsr - right_ctrl <= zero_right; - alu_ctrl <= alu_lsr8; - acca_ctrl <= load_acca; - cc_ctrl <= load_cc; - - when "0110" => -- ror - right_ctrl <= zero_right; - alu_ctrl <= alu_ror8; - acca_ctrl <= load_acca; - cc_ctrl <= load_cc; - - when "0111" => -- asr - right_ctrl <= zero_right; - alu_ctrl <= alu_asr8; - acca_ctrl <= load_acca; - cc_ctrl <= load_cc; - - when "1000" => -- asl - right_ctrl <= zero_right; - alu_ctrl <= alu_asl8; - acca_ctrl <= load_acca; - cc_ctrl <= load_cc; - - when "1001" => -- rol - right_ctrl <= zero_right; - alu_ctrl <= alu_rol8; - acca_ctrl <= load_acca; - cc_ctrl <= load_cc; - - when "1010" => -- dec - right_ctrl <= one_right; - alu_ctrl <= alu_dec; - acca_ctrl <= load_acca; - cc_ctrl <= load_cc; - - when "1011" => -- undefined - right_ctrl <= zero_right; - alu_ctrl <= alu_nop; - acca_ctrl <= latch_acca; - cc_ctrl <= latch_cc; - - when "1100" => -- inc - right_ctrl <= one_right; - alu_ctrl <= alu_inc; - acca_ctrl <= load_acca; - cc_ctrl <= load_cc; - - when "1101" => -- tst - right_ctrl <= zero_right; - alu_ctrl <= alu_st8; - acca_ctrl <= latch_acca; - cc_ctrl <= load_cc; - - when "1110" => -- jmp (not defined) - right_ctrl <= zero_right; - alu_ctrl <= alu_nop; - acca_ctrl <= latch_acca; - cc_ctrl <= latch_cc; - - when "1111" => -- clr - right_ctrl <= zero_right; - alu_ctrl <= alu_clr; - acca_ctrl <= load_acca; - cc_ctrl <= load_cc; - - when others => - right_ctrl <= zero_right; - alu_ctrl <= alu_nop; - acca_ctrl <= latch_acca; - cc_ctrl <= latch_cc; - - end case; - lic <= '1'; - next_state <= fetch_state; - - -- - -- Single Operand accb - -- source = accb, dest = accb - -- Typically 2 cycles 1 bytes - -- 1 opcode fetch - -- 2 post byte fetch / instruction decode - -- Note that there is no post byte - -- so do not advance PC in decode cycle - -- Re-run opcode fetch cycle after decode - -- - when "0101" => - left_ctrl <= accb_left; - case op_code(3 downto 0) is - when "0000" => -- neg - right_ctrl <= zero_right; - alu_ctrl <= alu_neg; - accb_ctrl <= load_accb; - cc_ctrl <= load_cc; - - when "0011" => -- com - right_ctrl <= zero_right; - alu_ctrl <= alu_com; - accb_ctrl <= load_accb; - cc_ctrl <= load_cc; - - when "0100" => -- lsr - right_ctrl <= zero_right; - alu_ctrl <= alu_lsr8; - accb_ctrl <= load_accb; - cc_ctrl <= load_cc; - - when "0110" => -- ror - right_ctrl <= zero_right; - alu_ctrl <= alu_ror8; - accb_ctrl <= load_accb; - cc_ctrl <= load_cc; - - when "0111" => -- asr - right_ctrl <= zero_right; - alu_ctrl <= alu_asr8; - accb_ctrl <= load_accb; - cc_ctrl <= load_cc; - - when "1000" => -- asl - right_ctrl <= zero_right; - alu_ctrl <= alu_asl8; - accb_ctrl <= load_accb; - cc_ctrl <= load_cc; - - when "1001" => -- rol - right_ctrl <= zero_right; - alu_ctrl <= alu_rol8; - accb_ctrl <= load_accb; - cc_ctrl <= load_cc; - - when "1010" => -- dec - right_ctrl <= one_right; - alu_ctrl <= alu_dec; - accb_ctrl <= load_accb; - cc_ctrl <= load_cc; - - when "1011" => -- undefined - right_ctrl <= zero_right; - alu_ctrl <= alu_nop; - accb_ctrl <= latch_accb; - cc_ctrl <= latch_cc; - - when "1100" => -- inc - right_ctrl <= one_right; - alu_ctrl <= alu_inc; - accb_ctrl <= load_accb; - cc_ctrl <= load_cc; - - when "1101" => -- tst - right_ctrl <= zero_right; - alu_ctrl <= alu_st8; - accb_ctrl <= latch_accb; - cc_ctrl <= load_cc; - - when "1110" => -- jmp (undefined) - right_ctrl <= zero_right; - alu_ctrl <= alu_nop; - accb_ctrl <= latch_accb; - cc_ctrl <= latch_cc; - - when "1111" => -- clr - right_ctrl <= zero_right; - alu_ctrl <= alu_clr; - accb_ctrl <= load_accb; - cc_ctrl <= load_cc; - - when others => - right_ctrl <= zero_right; - alu_ctrl <= alu_nop; - accb_ctrl <= latch_accb; - cc_ctrl <= latch_cc; - end case; - lic <= '1'; - next_state <= fetch_state; - - -- - -- Single operand indexed - -- Two byte instruction so advance PC - -- EA should hold index offset - -- - when "0110" => -- indexed single op - -- increment the pc - pc_ctrl <= incr_pc; - st_ctrl <= push_st; - - case op_code(3 downto 0) is - when "1110" => -- jmp - return_state <= jmp_state; - - when "1111" => -- clr - return_state <= single_op_exec_state; - - when others => - return_state <= single_op_read_state; - - end case; - next_state <= indexed_state; - - -- - -- Single operand extended addressing - -- three byte instruction so advance the PC - -- Low order EA holds high order address - -- - when "0111" => -- extended single op - -- increment PC - pc_ctrl <= incr_pc; - st_ctrl <= push_st; - - case op_code(3 downto 0) is - when "1110" => -- jmp - return_state <= jmp_state; - - when "1111" => -- clr - return_state <= single_op_exec_state; - - when others => - return_state <= single_op_read_state; - - end case; - next_state <= extended_state; - - when "1000" => -- acca immediate - -- increment the pc - pc_ctrl <= incr_pc; - - case op_code(3 downto 0) is - when "0011" | -- subd # - "1100" | -- cmpx # - "1110" => -- ldx # - next_state <= imm16_state; - - -- - -- bsr offset - Branch to subroutine (2 bytes) - -- 6809 => 7 cycles - -- cpu09 => 5 cycles - -- 1 op=(pc) / pc=pc+1 - -- 2 md_hi=sign(pc) / md_lo=(pc) / sp=sp-1 / pc=pc+1 - -- 3 (sp)=pc_lo / sp=sp-1 - -- 4 (sp)=pc_hi - -- 5 pc=pc+md - -- - when "1101" => -- bsr - -- pre decrement SP - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- - st_ctrl <= push_st; - return_state <= sbranch_state; - next_state <= push_return_lo_state; - - when others => - lic <= '1'; - next_state <= fetch_state; - - end case; - - when "1001" => -- acca direct - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- subd - "1100" | -- cmpx - "1110" => -- ldx - next_state <= dual_op_read16_state; - - when "0111" => -- sta direct - next_state <= dual_op_write8_state; - - -- - -- jsr direct - Jump to subroutine in direct page (2 bytes) - -- 6809 => 7 cycles - -- cpu09 => 5 cycles - -- 1 op=(pc) / pc=pc+1 - -- 2 ea_hi=0 / ea_lo=(pc) / sp=sp-1 / pc=pc+1 - -- 3 (sp)=pc_lo / sp=sp-1 - -- 4 (sp)=pc_hi - -- 5 pc=ea - -- - when "1101" => -- jsr direct - -- pre decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- - st_ctrl <= push_st; - return_state <= jmp_state; - next_state <= push_return_lo_state; - - - when "1111" => -- stx direct - -- idle ALU - left_ctrl <= ix_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_nop; - cc_ctrl <= latch_cc; - sp_ctrl <= latch_sp; - next_state <= dual_op_write16_state; - - when others => - next_state <= dual_op_read8_state; - - end case; - - when "1010" => -- acca indexed - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- subd - "1100" | -- cmpx - "1110" => -- ldx - st_ctrl <= push_st; - return_state <= dual_op_read16_state; - next_state <= indexed_state; - - when "0111" => -- staa ,x - st_ctrl <= push_st; - return_state <= dual_op_write8_state; - next_state <= indexed_state; - - when "1101" => -- jsr ,x - -- DO NOT pre decrement SP - st_ctrl <= push_st; - return_state <= jsr_state; - next_state <= indexed_state; - - when "1111" => -- stx ,x - st_ctrl <= push_st; - return_state <= dual_op_write16_state; - next_state <= indexed_state; - - when others => - st_ctrl <= push_st; - return_state <= dual_op_read8_state; - next_state <= indexed_state; - - end case; - - when "1011" => -- acca extended - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- subd - "1100" | -- cmpx - "1110" => -- ldx - st_ctrl <= push_st; - return_state <= dual_op_read16_state; - next_state <= extended_state; - - when "0111" => -- staa > - st_ctrl <= push_st; - return_state <= dual_op_write8_state; - next_state <= extended_state; - - when "1101" => -- jsr >extended - -- DO NOT pre decrement sp - st_ctrl <= push_st; - return_state <= jsr_state; - next_state <= extended_state; - - when "1111" => -- stx > - st_ctrl <= push_st; - return_state <= dual_op_write16_state; - next_state <= extended_state; - - when others => - st_ctrl <= push_st; - return_state <= dual_op_read8_state; - next_state <= extended_state; - - end case; - - when "1100" => -- accb immediate - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- addd # - "1100" | -- ldd # - "1110" => -- ldu # - next_state <= imm16_state; - - when others => - lic <= '1'; - next_state <= fetch_state; - - end case; - - when "1101" => -- accb direct - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- addd - "1100" | -- ldd - "1110" => -- ldu - next_state <= dual_op_read16_state; - - when "0111" => -- stab direct - next_state <= dual_op_write8_state; - - when "1101" => -- std direct - next_state <= dual_op_write16_state; - - when "1111" => -- stu direct - next_state <= dual_op_write16_state; - - when others => - next_state <= dual_op_read8_state; - - end case; - - when "1110" => -- accb indexed - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- addd - "1100" | -- ldd - "1110" => -- ldu - st_ctrl <= push_st; - return_state <= dual_op_read16_state; - next_state <= indexed_state; - - when "0111" => -- stab indexed - st_ctrl <= push_st; - return_state <= dual_op_write8_state; - next_state <= indexed_state; - - when "1101" => -- std indexed - st_ctrl <= push_st; - return_state <= dual_op_write16_state; - next_state <= indexed_state; - - when "1111" => -- stu indexed - st_ctrl <= push_st; - return_state <= dual_op_write16_state; - next_state <= indexed_state; - - when others => - st_ctrl <= push_st; - return_state <= dual_op_read8_state; - next_state <= indexed_state; - - end case; - - when "1111" => -- accb extended - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- addd - "1100" | -- ldd - "1110" => -- ldu - st_ctrl <= push_st; - return_state <= dual_op_read16_state; - next_state <= extended_state; - - when "0111" => -- stab extended - st_ctrl <= push_st; - return_state <= dual_op_write8_state; - next_state <= extended_state; - - when "1101" => -- std extended - st_ctrl <= push_st; - return_state <= dual_op_write16_state; - next_state <= extended_state; - - when "1111" => -- stu extended - st_ctrl <= push_st; - return_state <= dual_op_write16_state; - next_state <= extended_state; - - when others => - st_ctrl <= push_st; - return_state <= dual_op_read8_state; - next_state <= extended_state; - end case; - -- - -- not sure why I need this - -- - when others => - lic <= '1'; - next_state <= fetch_state; - end case; - - -- - -- Here to decode prefix 2 instruction - -- and fetch next byte of intruction - -- whether it be necessary or not - -- - when decode2_state => - -- fetch first byte of address or immediate data - ea_ctrl <= fetch_first_ea; - md_ctrl <= fetch_first_md; - addr_ctrl <= fetch_ad; - case op_code(7 downto 4) is - -- - -- lbcc -- long branch conditional - -- 6809 => branch 6 cycles, no branch 5 cycles - -- cpu09 => always 5 cycles - -- 1 pre=(pc) / pc=pc+1 - -- 2 op=(pc) / pc=pc+1 - -- 3 md_hi=sign(pc) / md_lo=(pc) / pc=pc+1 - -- 4 md_hi=md_lo / md_lo=(pc) / pc=pc+1 - -- 5 if cond pc=pc+md else pc=pc - -- - when "0010" => - -- increment the pc - pc_ctrl <= incr_pc; - next_state <= lbranch_state; - - -- - -- Single byte stack operators - -- Do not advance PC - -- - when "0011" => - case op_code(3 downto 0) is - when "1111" => -- swi 2 - -- predecrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - iv_ctrl <= swi2_iv; - st_ctrl <= push_st; - return_state <= vect_hi_state; - next_state <= int_entire_state; - - when others => - lic <= '1'; - next_state <= fetch_state; - end case; - - when "1000" => -- acca immediate - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- cmpd # - "1100" | -- cmpy # - "1110" => -- ldy # - next_state <= imm16_state; - - when others => - lic <= '1'; - next_state <= fetch_state; - - end case; - - when "1001" => -- acca direct - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- cmpd < - "1100" | -- cmpy < - "1110" => -- ldy < - next_state <= dual_op_read16_state; - - when "1111" => -- sty < - next_state <= dual_op_write16_state; - - when others => - lic <= '1'; - next_state <= fetch_state; - - end case; - - when "1010" => -- acca indexed - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- cmpd ,ind - "1100" | -- cmpy ,ind - "1110" => -- ldy ,ind - st_ctrl <= push_st; - return_state <= dual_op_read16_state; - next_state <= indexed_state; - - when "1111" => -- sty ,ind - st_ctrl <= push_st; - return_state <= dual_op_write16_state; - next_state <= indexed_state; - - when others => - lic <= '1'; - next_state <= fetch_state; - end case; - - when "1011" => -- acca extended - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- cmpd < - "1100" | -- cmpy < - "1110" => -- ldy < - st_ctrl <= push_st; - return_state <= dual_op_read16_state; - next_state <= extended_state; - - when "1111" => -- sty > - st_ctrl <= push_st; - return_state <= dual_op_write16_state; - next_state <= extended_state; - - when others => - lic <= '1'; - next_state <= fetch_state; - - end case; - - when "1100" => -- accb immediate - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- undef # - "1100" | -- undef # - "1110" => -- lds # - next_state <= imm16_state; - - when others => - next_state <= fetch_state; - - end case; - - when "1101" => -- accb direct - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- undef < - "1100" | -- undef < - "1110" => -- lds < - next_state <= dual_op_read16_state; - - when "1111" => -- sts < - next_state <= dual_op_write16_state; - - when others => - lic <= '1'; - next_state <= fetch_state; - - end case; - - when "1110" => -- accb indexed - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- undef ,ind - "1100" | -- undef ,ind - "1110" => -- lds ,ind - st_ctrl <= push_st; - return_state <= dual_op_read16_state; - next_state <= indexed_state; - - when "1111" => -- sts ,ind - st_ctrl <= push_st; - return_state <= dual_op_write16_state; - next_state <= indexed_state; - - when others => - lic <= '1'; - next_state <= fetch_state; - - end case; - - when "1111" => -- accb extended - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- undef > - "1100" | -- undef > - "1110" => -- lds > - st_ctrl <= push_st; - return_state <= dual_op_read16_state; - next_state <= extended_state; - - when "1111" => -- sts > - st_ctrl <= push_st; - return_state <= dual_op_write16_state; - next_state <= extended_state; - - when others => - lic <= '1'; - next_state <= fetch_state; - end case; - - when others => - lic <= '1'; - next_state <= fetch_state; - end case; - -- - -- Here to decode instruction - -- and fetch next byte of intruction - -- whether it be necessary or not - -- - when decode3_state => - ea_ctrl <= fetch_first_ea; - md_ctrl <= fetch_first_md; - addr_ctrl <= fetch_ad; - dout_ctrl <= md_lo_dout; - case op_code(7 downto 4) is - -- - -- Single byte stack operators - -- Do not advance PC - -- - when "0011" => - case op_code(3 downto 0) is - when "1111" => -- swi3 - -- predecrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - iv_ctrl <= swi3_iv; - st_ctrl <= push_st; - return_state <= vect_hi_state; - next_state <= int_entire_state; - when others => - lic <= '1'; - next_state <= fetch_state; - end case; - - when "1000" => -- acca immediate - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- cmpu # - "1100" | -- cmps # - "1110" => -- undef # - next_state <= imm16_state; - when others => - lic <= '1'; - next_state <= fetch_state; - end case; - - when "1001" => -- acca direct - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- cmpu < - "1100" | -- cmps < - "1110" => -- undef < - next_state <= dual_op_read16_state; - - when others => - lic <= '1'; - next_state <= fetch_state; - - end case; - - when "1010" => -- acca indexed - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- cmpu ,X - "1100" | -- cmps ,X - "1110" => -- undef ,X - st_ctrl <= push_st; - return_state <= dual_op_read16_state; - next_state <= indexed_state; - - when others => - lic <= '1'; - next_state <= fetch_state; - - end case; - - when "1011" => -- acca extended - -- increment the pc - pc_ctrl <= incr_pc; - case op_code(3 downto 0) is - when "0011" | -- cmpu > - "1100" | -- cmps > - "1110" => -- undef > - st_ctrl <= push_st; - return_state <= dual_op_read16_state; - next_state <= extended_state; - when others => - lic <= '1'; - next_state <= fetch_state; - end case; - - when others => - lic <= '1'; - next_state <= fetch_state; - end case; - - -- - -- here if ea holds low byte - -- Direct - -- Extended - -- Indexed - -- read memory location - -- - when single_op_read_state => - -- read memory into md - md_ctrl <= fetch_first_md; - addr_ctrl <= read_ad; - dout_ctrl <= md_lo_dout; - next_state <= single_op_exec_state; - - when single_op_exec_state => - case op_code(3 downto 0) is - when "0000" => -- neg - left_ctrl <= md_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_neg; - cc_ctrl <= load_cc; - md_ctrl <= load_md; - next_state <= single_op_write_state; - when "0011" => -- com - left_ctrl <= md_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_com; - cc_ctrl <= load_cc; - md_ctrl <= load_md; - next_state <= single_op_write_state; - when "0100" => -- lsr - left_ctrl <= md_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_lsr8; - cc_ctrl <= load_cc; - md_ctrl <= load_md; - next_state <= single_op_write_state; - when "0110" => -- ror - left_ctrl <= md_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_ror8; - cc_ctrl <= load_cc; - md_ctrl <= load_md; - next_state <= single_op_write_state; - when "0111" => -- asr - left_ctrl <= md_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_asr8; - cc_ctrl <= load_cc; - md_ctrl <= load_md; - next_state <= single_op_write_state; - when "1000" => -- asl - left_ctrl <= md_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_asl8; - cc_ctrl <= load_cc; - md_ctrl <= load_md; - next_state <= single_op_write_state; - when "1001" => -- rol - left_ctrl <= md_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_rol8; - cc_ctrl <= load_cc; - md_ctrl <= load_md; - next_state <= single_op_write_state; - when "1010" => -- dec - left_ctrl <= md_left; - right_ctrl <= one_right; - alu_ctrl <= alu_dec; - cc_ctrl <= load_cc; - md_ctrl <= load_md; - next_state <= single_op_write_state; - when "1011" => -- undefined - lic <= '1'; - next_state <= fetch_state; - when "1100" => -- inc - left_ctrl <= md_left; - right_ctrl <= one_right; - alu_ctrl <= alu_inc; - cc_ctrl <= load_cc; - md_ctrl <= load_md; - next_state <= single_op_write_state; - when "1101" => -- tst - left_ctrl <= md_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_st8; - cc_ctrl <= load_cc; - lic <= '1'; - next_state <= fetch_state; - when "1110" => -- jmp - left_ctrl <= md_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_ld16; - pc_ctrl <= load_pc; - lic <= '1'; - next_state <= fetch_state; - when "1111" => -- clr - left_ctrl <= md_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_clr; - cc_ctrl <= load_cc; - md_ctrl <= load_md; - next_state <= single_op_write_state; - when others => - lic <= '1'; - next_state <= fetch_state; - end case; - -- - -- single operand 8 bit write - -- Write low 8 bits of ALU output - -- EA holds address - -- MD holds data - -- - when single_op_write_state => - -- write ALU low byte output - addr_ctrl <= write_ad; - dout_ctrl <= md_lo_dout; - lic <= '1'; - next_state <= fetch_state; - - -- - -- here if ea holds address of low byte - -- read memory location - -- - when dual_op_read8_state => - -- read first data byte from ea - md_ctrl <= fetch_first_md; - addr_ctrl <= read_ad; - lic <= '1'; - next_state <= fetch_state; - - -- - -- Here to read a 16 bit value into MD - -- pointed to by the EA register - -- The first byte is read - -- and the EA is incremented - -- - when dual_op_read16_state => - -- increment the effective address - left_ctrl <= ea_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - ea_ctrl <= load_ea; - -- read the high byte of the 16 bit data - md_ctrl <= fetch_first_md; - addr_ctrl <= read_ad; - next_state <= dual_op_read16_2_state; - - -- - -- here to read the second byte - -- pointed to by EA into MD - -- - when dual_op_read16_2_state => - -- read the low byte of the 16 bit data - md_ctrl <= fetch_next_md; - addr_ctrl <= read_ad; - lic <= '1'; - next_state <= fetch_state; - - -- - -- 16 bit Write state - -- EA hold address of memory to write to - -- Advance the effective address in ALU - -- decode op_code to determine which - -- register to write - -- - when dual_op_write16_state => - -- increment the effective address - left_ctrl <= ea_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - ea_ctrl <= load_ea; - -- write the ALU hi byte at ea - addr_ctrl <= write_ad; - if op_code(6) = '0' then - case op_code(3 downto 0) is - when "1111" => -- stx / sty - case pre_code is - when "00010000" => -- page 2 -- sty - dout_ctrl <= iy_hi_dout; - when others => -- page 1 -- stx - dout_ctrl <= ix_hi_dout; - end case; - when others => - dout_ctrl <= md_hi_dout; - end case; - else - case op_code(3 downto 0) is - when "1101" => -- std - dout_ctrl <= acca_dout; -- acca is high byte of ACCD - when "1111" => -- stu / sts - case pre_code is - when "00010000" => -- page 2 -- sts - dout_ctrl <= sp_hi_dout; - when others => -- page 1 -- stu - dout_ctrl <= up_hi_dout; - end case; - when others => - dout_ctrl <= md_hi_dout; - end case; - end if; - next_state <= dual_op_write8_state; - - -- - -- Dual operand 8 bit write - -- Write 8 bit accumulator - -- or low byte of 16 bit register - -- EA holds address - -- decode opcode to determine - -- which register to apply to the bus - -- Also set the condition codes here - -- - when dual_op_write8_state => - if op_code(6) = '0' then - case op_code(3 downto 0) is - when "0111" => -- sta - dout_ctrl <= acca_dout; - when "1111" => -- stx / sty - case pre_code is - when "00010000" => -- page 2 -- sty - dout_ctrl <= iy_lo_dout; - when others => -- page 1 -- stx - dout_ctrl <= ix_lo_dout; - end case; - when others => - dout_ctrl <= md_lo_dout; - end case; - else - case op_code(3 downto 0) is - when "0111" => -- stb - dout_ctrl <= accb_dout; - when "1101" => -- std - dout_ctrl <= accb_dout; -- accb is low byte of accd - when "1111" => -- stu / sts - case pre_code is - when "00010000" => -- page 2 -- sts - dout_ctrl <= sp_lo_dout; - when others => -- page 1 -- stu - dout_ctrl <= up_lo_dout; - end case; - when others => - dout_ctrl <= md_lo_dout; - end case; - end if; - -- write ALU low byte output - addr_ctrl <= write_ad; - lic <= '1'; - next_state <= fetch_state; - - -- - -- 16 bit immediate addressing mode - -- - when imm16_state => - -- increment pc - pc_ctrl <= incr_pc; - -- fetch next immediate byte - md_ctrl <= fetch_next_md; - addr_ctrl <= fetch_ad; - lic <= '1'; - next_state <= fetch_state; - - -- - -- md & ea holds 8 bit index offset - -- calculate the effective memory address - -- using the alu - -- - when indexed_state => - -- - -- decode indexing mode - -- - if md(7) = '0' then - case md(6 downto 5) is - when "00" => - left_ctrl <= ix_left; - when "01" => - left_ctrl <= iy_left; - when "10" => - left_ctrl <= up_left; - when others => - -- when "11" => - left_ctrl <= sp_left; - end case; - right_ctrl <= md_sign5_right; - alu_ctrl <= alu_add16; - ea_ctrl <= load_ea; - next_state <= saved_state; - - else - case md(3 downto 0) is - when "0000" => -- ,R+ - case md(6 downto 5) is - when "00" => - left_ctrl <= ix_left; - when "01" => - left_ctrl <= iy_left; - when "10" => - left_ctrl <= up_left; - when others => - left_ctrl <= sp_left; - end case; - -- - right_ctrl <= zero_right; - alu_ctrl <= alu_add16; - ea_ctrl <= load_ea; - next_state <= postincr1_state; - - when "0001" => -- ,R++ - case md(6 downto 5) is - when "00" => - left_ctrl <= ix_left; - when "01" => - left_ctrl <= iy_left; - when "10" => - left_ctrl <= up_left; - when others => - -- when "11" => - left_ctrl <= sp_left; - end case; - right_ctrl <= zero_right; - alu_ctrl <= alu_add16; - ea_ctrl <= load_ea; - next_state <= postincr2_state; - - when "0010" => -- ,-R - case md(6 downto 5) is - when "00" => - left_ctrl <= ix_left; - ix_ctrl <= load_ix; - when "01" => - left_ctrl <= iy_left; - iy_ctrl <= load_iy; - when "10" => - left_ctrl <= up_left; - up_ctrl <= load_up; - when others => - -- when "11" => - left_ctrl <= sp_left; - sp_ctrl <= load_sp; - end case; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - ea_ctrl <= load_ea; - next_state <= saved_state; - - when "0011" => -- ,--R - case md(6 downto 5) is - when "00" => - left_ctrl <= ix_left; - ix_ctrl <= load_ix; - when "01" => - left_ctrl <= iy_left; - iy_ctrl <= load_iy; - when "10" => - left_ctrl <= up_left; - up_ctrl <= load_up; - when others => - -- when "11" => - left_ctrl <= sp_left; - sp_ctrl <= load_sp; - end case; - right_ctrl <= two_right; - alu_ctrl <= alu_sub16; - ea_ctrl <= load_ea; - if md(4) = '0' then - next_state <= saved_state; - else - next_state <= indirect_state; - end if; - - when "0100" => -- ,R (zero offset) - case md(6 downto 5) is - when "00" => - left_ctrl <= ix_left; - when "01" => - left_ctrl <= iy_left; - when "10" => - left_ctrl <= up_left; - when others => - -- when "11" => - left_ctrl <= sp_left; - end case; - right_ctrl <= zero_right; - alu_ctrl <= alu_add16; - ea_ctrl <= load_ea; - if md(4) = '0' then - next_state <= saved_state; - else - next_state <= indirect_state; - end if; - - when "0101" => -- ACCB,R - case md(6 downto 5) is - when "00" => - left_ctrl <= ix_left; - when "01" => - left_ctrl <= iy_left; - when "10" => - left_ctrl <= up_left; - when others => - -- when "11" => - left_ctrl <= sp_left; - end case; - right_ctrl <= accb_right; - alu_ctrl <= alu_add16; - ea_ctrl <= load_ea; - if md(4) = '0' then - next_state <= saved_state; - else - next_state <= indirect_state; - end if; - - when "0110" => -- ACCA,R - case md(6 downto 5) is - when "00" => - left_ctrl <= ix_left; - when "01" => - left_ctrl <= iy_left; - when "10" => - left_ctrl <= up_left; - when others => - -- when "11" => - left_ctrl <= sp_left; - end case; - right_ctrl <= acca_right; - alu_ctrl <= alu_add16; - ea_ctrl <= load_ea; - if md(4) = '0' then - next_state <= saved_state; - else - next_state <= indirect_state; - end if; - - when "0111" => -- undefined - case md(6 downto 5) is - when "00" => - left_ctrl <= ix_left; - when "01" => - left_ctrl <= iy_left; - when "10" => - left_ctrl <= up_left; - when others => - -- when "11" => - left_ctrl <= sp_left; - end case; - right_ctrl <= zero_right; - alu_ctrl <= alu_add16; - ea_ctrl <= load_ea; - if md(4) = '0' then - next_state <= saved_state; - else - next_state <= indirect_state; - end if; - - when "1000" => -- offset8,R - md_ctrl <= fetch_first_md; -- pick up 8 bit offset - addr_ctrl <= fetch_ad; - pc_ctrl <= incr_pc; - next_state <= index8_state; - - when "1001" => -- offset16,R - md_ctrl <= fetch_first_md; -- pick up first byte of 16 bit offset - addr_ctrl <= fetch_ad; - pc_ctrl <= incr_pc; - next_state <= index16_state; - - when "1010" => -- undefined - case md(6 downto 5) is - when "00" => - left_ctrl <= ix_left; - when "01" => - left_ctrl <= iy_left; - when "10" => - left_ctrl <= up_left; - when others => - -- when "11" => - left_ctrl <= sp_left; - end case; - right_ctrl <= zero_right; - alu_ctrl <= alu_add16; - ea_ctrl <= load_ea; - -- - if md(4) = '0' then - next_state <= saved_state; - else - next_state <= indirect_state; - end if; - - when "1011" => -- ACCD,R - case md(6 downto 5) is - when "00" => - left_ctrl <= ix_left; - when "01" => - left_ctrl <= iy_left; - when "10" => - left_ctrl <= up_left; - when others => - -- when "11" => - left_ctrl <= sp_left; - end case; - right_ctrl <= accd_right; - alu_ctrl <= alu_add16; - ea_ctrl <= load_ea; - if md(4) = '0' then - next_state <= saved_state; - else - next_state <= indirect_state; - end if; - - when "1100" => -- offset8,PC - -- fetch 8 bit offset - md_ctrl <= fetch_first_md; - addr_ctrl <= fetch_ad; - pc_ctrl <= incr_pc; - next_state <= pcrel8_state; - - when "1101" => -- offset16,PC - -- fetch offset - md_ctrl <= fetch_first_md; - addr_ctrl <= fetch_ad; - pc_ctrl <= incr_pc; - next_state <= pcrel16_state; - - when "1110" => -- undefined - case md(6 downto 5) is - when "00" => - left_ctrl <= ix_left; - when "01" => - left_ctrl <= iy_left; - when "10" => - left_ctrl <= up_left; - when others => - -- when "11" => - left_ctrl <= sp_left; - end case; - right_ctrl <= zero_right; - alu_ctrl <= alu_add16; - ea_ctrl <= load_ea; - if md(4) = '0' then - next_state <= saved_state; - else - next_state <= indirect_state; - end if; - - when others => --- when "1111" => -- [,address] - -- advance PC to pick up address - md_ctrl <= fetch_first_md; - addr_ctrl <= fetch_ad; - pc_ctrl <= incr_pc; - next_state <= indexaddr_state; - end case; - end if; - - -- load index register with ea plus one - when postincr1_state => - left_ctrl <= ea_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - case md(6 downto 5) is - when "00" => - ix_ctrl <= load_ix; - when "01" => - iy_ctrl <= load_iy; - when "10" => - up_ctrl <= load_up; - when others => - -- when "11" => - sp_ctrl <= load_sp; - end case; - -- return to previous state - if md(4) = '0' then - next_state <= saved_state; - else - next_state <= indirect_state; - end if; - - -- load index register with ea plus two - when postincr2_state => - -- increment register by two (address) - left_ctrl <= ea_left; - right_ctrl <= two_right; - alu_ctrl <= alu_add16; - case md(6 downto 5) is - when "00" => - ix_ctrl <= load_ix; - when "01" => - iy_ctrl <= load_iy; - when "10" => - up_ctrl <= load_up; - when others => - -- when "11" => - sp_ctrl <= load_sp; - end case; - -- return to previous state - if md(4) = '0' then - next_state <= saved_state; - else - next_state <= indirect_state; - end if; - -- - -- ea = index register + md (8 bit signed offset) - -- ea holds post byte - -- - when index8_state => - case ea(6 downto 5) is - when "00" => - left_ctrl <= ix_left; - when "01" => - left_ctrl <= iy_left; - when "10" => - left_ctrl <= up_left; - when others => - -- when "11" => - left_ctrl <= sp_left; - end case; - -- ea = index reg + md - right_ctrl <= md_sign8_right; - alu_ctrl <= alu_add16; - ea_ctrl <= load_ea; - -- return to previous state - if ea(4) = '0' then - next_state <= saved_state; - else - next_state <= indirect_state; - end if; - - -- fetch low byte of 16 bit indexed offset - when index16_state => - -- advance pc - pc_ctrl <= incr_pc; - -- fetch low byte - md_ctrl <= fetch_next_md; - addr_ctrl <= fetch_ad; - next_state <= index16_2_state; - - -- ea = index register + md (16 bit offset) - -- ea holds post byte - when index16_2_state => - case ea(6 downto 5) is - when "00" => - left_ctrl <= ix_left; - when "01" => - left_ctrl <= iy_left; - when "10" => - left_ctrl <= up_left; - when others => - -- when "11" => - left_ctrl <= sp_left; - end case; - -- ea = index reg + md - right_ctrl <= md_right; - alu_ctrl <= alu_add16; - ea_ctrl <= load_ea; - -- return to previous state - if ea(4) = '0' then - next_state <= saved_state; - else - next_state <= indirect_state; - end if; - -- - -- pc relative with 8 bit signed offest - -- md holds signed offset - -- - when pcrel8_state => - -- ea = pc + signed md - left_ctrl <= pc_left; - right_ctrl <= md_sign8_right; - alu_ctrl <= alu_add16; - ea_ctrl <= load_ea; - -- return to previous state - if ea(4) = '0' then - next_state <= saved_state; - else - next_state <= indirect_state; - end if; - - -- pc relative addressing with 16 bit offset - -- pick up the low byte of the offset in md - -- advance the pc - when pcrel16_state => - -- advance pc - pc_ctrl <= incr_pc; - -- fetch low byte - md_ctrl <= fetch_next_md; - addr_ctrl <= fetch_ad; - next_state <= pcrel16_2_state; - - -- pc relative with16 bit signed offest - -- md holds signed offset - when pcrel16_2_state => - -- ea = pc + md - left_ctrl <= pc_left; - right_ctrl <= md_right; - alu_ctrl <= alu_add16; - ea_ctrl <= load_ea; - -- return to previous state - if ea(4) = '0' then - next_state <= saved_state; - else - next_state <= indirect_state; - end if; - - -- indexed to address - -- pick up the low byte of the address - -- advance the pc - when indexaddr_state => - -- advance pc - pc_ctrl <= incr_pc; - -- fetch low byte - md_ctrl <= fetch_next_md; - addr_ctrl <= fetch_ad; - next_state <= indexaddr2_state; - - -- indexed to absolute address - -- md holds address - -- ea hold indexing mode byte - when indexaddr2_state => - -- ea = md - left_ctrl <= pc_left; - right_ctrl <= md_right; - alu_ctrl <= alu_ld16; - ea_ctrl <= load_ea; - -- return to previous state - if ea(4) = '0' then - next_state <= saved_state; - else - next_state <= indirect_state; - end if; - - -- - -- load md with high byte of indirect address - -- pointed to by ea - -- increment ea - -- - when indirect_state => - -- increment ea - left_ctrl <= ea_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - ea_ctrl <= load_ea; - -- fetch high byte - md_ctrl <= fetch_first_md; - addr_ctrl <= read_ad; - next_state <= indirect2_state; - -- - -- load md with low byte of indirect address - -- pointed to by ea - -- ea has previously been incremented - -- - when indirect2_state => - -- fetch high byte - md_ctrl <= fetch_next_md; - addr_ctrl <= read_ad; - dout_ctrl <= md_lo_dout; - next_state <= indirect3_state; - -- - -- complete idirect addressing - -- by loading ea with md - -- - when indirect3_state => - -- load ea with md - left_ctrl <= ea_left; - right_ctrl <= md_right; - alu_ctrl <= alu_ld16; - ea_ctrl <= load_ea; - -- return to previous state - next_state <= saved_state; - - -- - -- ea holds the low byte of the absolute address - -- Move ea low byte into ea high byte - -- load new ea low byte to for absolute 16 bit address - -- advance the program counter - -- - when extended_state => -- fetch ea low byte - -- increment pc - pc_ctrl <= incr_pc; - -- fetch next effective address bytes - ea_ctrl <= fetch_next_ea; - addr_ctrl <= fetch_ad; - -- return to previous state - next_state <= saved_state; - - when lea_state => -- here on load effective address - -- load index register with effective address - left_ctrl <= pc_left; - right_ctrl <= ea_right; - alu_ctrl <= alu_lea; - case op_code(3 downto 0) is - when "0000" => -- leax - cc_ctrl <= load_cc; - ix_ctrl <= load_ix; - when "0001" => -- leay - cc_ctrl <= load_cc; - iy_ctrl <= load_iy; - when "0010" => -- leas - sp_ctrl <= load_sp; - when "0011" => -- leau - up_ctrl <= load_up; - when others => - null; - end case; - lic <= '1'; - next_state <= fetch_state; - - -- - -- jump to subroutine - -- sp=sp-1 - -- call push_return_lo_state to save pc - -- return to jmp_state - -- - when jsr_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- call push_return_state - st_ctrl <= push_st; - return_state <= jmp_state; - next_state <= push_return_lo_state; - - -- - -- Load pc with ea - -- (JMP) - -- - when jmp_state => - -- load PC with effective address - left_ctrl <= pc_left; - right_ctrl <= ea_right; - alu_ctrl <= alu_ld16; - pc_ctrl <= load_pc; - lic <= '1'; - next_state <= fetch_state; - - -- - -- long branch or branch to subroutine - -- pick up next md byte - -- md_hi = md_lo - -- md_lo = (pc) - -- pc=pc+1 - -- if a lbsr push return address - -- continue to sbranch_state - -- to evaluate conditional branches - -- - when lbranch_state => - pc_ctrl <= incr_pc; - -- fetch the next byte into md_lo - md_ctrl <= fetch_next_md; - addr_ctrl <= fetch_ad; - -- if lbsr - push return address - -- then continue on to short branch - if op_code = "00010111" then - st_ctrl <= push_st; - return_state <= sbranch_state; - next_state <= push_return_lo_state; - else - next_state <= sbranch_state; - end if; - - -- - -- here to execute conditional branch - -- short conditional branch md = signed 8 bit offset - -- long branch md = 16 bit offset - -- - when sbranch_state => - left_ctrl <= pc_left; - right_ctrl <= md_right; - alu_ctrl <= alu_add16; - -- Test condition for branch - if op_code(7 downto 4) = "0010" then -- conditional branch - case op_code(3 downto 0) is - when "0000" => -- bra - cond_true := (1 = 1); - when "0001" => -- brn - cond_true := (1 = 0); - when "0010" => -- bhi - cond_true := ((cc(CBIT) or cc(ZBIT)) = '0'); - when "0011" => -- bls - cond_true := ((cc(CBIT) or cc(ZBIT)) = '1'); - when "0100" => -- bcc/bhs - cond_true := (cc(CBIT) = '0'); - when "0101" => -- bcs/blo - cond_true := (cc(CBIT) = '1'); - when "0110" => -- bne - cond_true := (cc(ZBIT) = '0'); - when "0111" => -- beq - cond_true := (cc(ZBIT) = '1'); - when "1000" => -- bvc - cond_true := (cc(VBIT) = '0'); - when "1001" => -- bvs - cond_true := (cc(VBIT) = '1'); - when "1010" => -- bpl - cond_true := (cc(NBIT) = '0'); - when "1011" => -- bmi - cond_true := (cc(NBIT) = '1'); - when "1100" => -- bge - cond_true := ((cc(NBIT) xor cc(VBIT)) = '0'); - when "1101" => -- blt - cond_true := ((cc(NBIT) xor cc(VBIT)) = '1'); - when "1110" => -- bgt - cond_true := ((cc(ZBIT) or (cc(NBIT) xor cc(VBIT))) = '0'); - when "1111" => -- ble - cond_true := ((cc(ZBIT) or (cc(NBIT) xor cc(VBIT))) = '1'); - when others => - null; - end case; - end if; - if cond_true then - pc_ctrl <= load_pc; - end if; - lic <= '1'; - next_state <= fetch_state; - - -- - -- push return address onto the S stack - -- - -- (sp) = pc_lo - -- sp = sp - 1 - -- - when push_return_lo_state => - -- decrement the sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- write PC low - addr_ctrl <= pushs_ad; - dout_ctrl <= pc_lo_dout; - next_state <= push_return_hi_state; - - -- - -- push program counter hi byte onto the stack - -- (sp) = pc_hi - -- sp = sp - -- return to originating state - -- - when push_return_hi_state => - -- write pc hi bytes - addr_ctrl <= pushs_ad; - dout_ctrl <= pc_hi_dout; - next_state <= saved_state; - - -- - -- RTS pull return address from stack - -- - when pull_return_hi_state => - -- increment the sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read pc hi - pc_ctrl <= pull_hi_pc; - addr_ctrl <= pulls_ad; - next_state <= pull_return_lo_state; - - when pull_return_lo_state => - -- increment the SP - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read pc low - pc_ctrl <= pull_lo_pc; - addr_ctrl <= pulls_ad; - dout_ctrl <= pc_lo_dout; - -- - lic <= '1'; - next_state <= fetch_state; - - when andcc_state => - -- AND CC with md - left_ctrl <= md_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_andcc; - cc_ctrl <= load_cc; - -- - lic <= '1'; - next_state <= fetch_state; - - when orcc_state => - -- OR CC with md - left_ctrl <= md_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_orcc; - cc_ctrl <= load_cc; - -- - lic <= '1'; - next_state <= fetch_state; - - when tfr_state => - -- select source register - case md(7 downto 4) is - when "0000" => - left_ctrl <= accd_left; - when "0001" => - left_ctrl <= ix_left; - when "0010" => - left_ctrl <= iy_left; - when "0011" => - left_ctrl <= up_left; - when "0100" => - left_ctrl <= sp_left; - when "0101" => - left_ctrl <= pc_left; - when "1000" => - left_ctrl <= acca_left; - when "1001" => - left_ctrl <= accb_left; - when "1010" => - left_ctrl <= cc_left; - when "1011" => - left_ctrl <= dp_left; - when others => - left_ctrl <= md_left; - end case; - right_ctrl <= zero_right; - alu_ctrl <= alu_tfr; - -- select destination register - case md(3 downto 0) is - when "0000" => -- accd - acca_ctrl <= load_hi_acca; - accb_ctrl <= load_accb; - when "0001" => -- ix - ix_ctrl <= load_ix; - when "0010" => -- iy - iy_ctrl <= load_iy; - when "0011" => -- up - up_ctrl <= load_up; - when "0100" => -- sp - sp_ctrl <= load_sp; - when "0101" => -- pc - pc_ctrl <= load_pc; - when "1000" => -- acca - acca_ctrl <= load_acca; - when "1001" => -- accb - accb_ctrl <= load_accb; - when "1010" => -- cc - cc_ctrl <= load_cc; - when "1011" => --dp - dp_ctrl <= load_dp; - when others => - null; - end case; - -- - lic <= '1'; - next_state <= fetch_state; - - when exg_state => - -- save destination register - case md(3 downto 0) is - when "0000" => - left_ctrl <= accd_left; - when "0001" => - left_ctrl <= ix_left; - when "0010" => - left_ctrl <= iy_left; - when "0011" => - left_ctrl <= up_left; - when "0100" => - left_ctrl <= sp_left; - when "0101" => - left_ctrl <= pc_left; - when "1000" => - left_ctrl <= acca_left; - when "1001" => - left_ctrl <= accb_left; - when "1010" => - left_ctrl <= cc_left; - when "1011" => - left_ctrl <= dp_left; - when others => - left_ctrl <= md_left; - end case; - right_ctrl <= zero_right; - alu_ctrl <= alu_tfr; - ea_ctrl <= load_ea; - -- call tranfer microcode - next_state <= exg1_state; - - when exg1_state => - -- select source register - case md(7 downto 4) is - when "0000" => - left_ctrl <= accd_left; - when "0001" => - left_ctrl <= ix_left; - when "0010" => - left_ctrl <= iy_left; - when "0011" => - left_ctrl <= up_left; - when "0100" => - left_ctrl <= sp_left; - when "0101" => - left_ctrl <= pc_left; - when "1000" => - left_ctrl <= acca_left; - when "1001" => - left_ctrl <= accb_left; - when "1010" => - left_ctrl <= cc_left; - when "1011" => - left_ctrl <= dp_left; - when others => - left_ctrl <= md_left; - end case; - right_ctrl <= zero_right; - alu_ctrl <= alu_tfr; - -- select destination register - case md(3 downto 0) is - when "0000" => -- accd - acca_ctrl <= load_hi_acca; - accb_ctrl <= load_accb; - when "0001" => -- ix - ix_ctrl <= load_ix; - when "0010" => -- iy - iy_ctrl <= load_iy; - when "0011" => -- up - up_ctrl <= load_up; - when "0100" => -- sp - sp_ctrl <= load_sp; - when "0101" => -- pc - pc_ctrl <= load_pc; - when "1000" => -- acca - acca_ctrl <= load_acca; - when "1001" => -- accb - accb_ctrl <= load_accb; - when "1010" => -- cc - cc_ctrl <= load_cc; - when "1011" => --dp - dp_ctrl <= load_dp; - when others => - null; - end case; - next_state <= exg2_state; - - when exg2_state => - -- restore destination - left_ctrl <= ea_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_tfr; - -- save as source register - case md(7 downto 4) is - when "0000" => -- accd - acca_ctrl <= load_hi_acca; - accb_ctrl <= load_accb; - when "0001" => -- ix - ix_ctrl <= load_ix; - when "0010" => -- iy - iy_ctrl <= load_iy; - when "0011" => -- up - up_ctrl <= load_up; - when "0100" => -- sp - sp_ctrl <= load_sp; - when "0101" => -- pc - pc_ctrl <= load_pc; - when "1000" => -- acca - acca_ctrl <= load_acca; - when "1001" => -- accb - accb_ctrl <= load_accb; - when "1010" => -- cc - cc_ctrl <= load_cc; - when "1011" => --dp - dp_ctrl <= load_dp; - when others => - null; - end case; - lic <= '1'; - next_state <= fetch_state; - - when mul_state => - -- move acca to md - left_ctrl <= acca_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_st16; - md_ctrl <= load_md; - next_state <= mulea_state; - - when mulea_state => - -- move accb to ea - left_ctrl <= accb_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_st16; - ea_ctrl <= load_ea; - next_state <= muld_state; - - when muld_state => - -- clear accd - left_ctrl <= acca_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_ld8; - acca_ctrl <= load_hi_acca; - accb_ctrl <= load_accb; - next_state <= mul0_state; - - when mul0_state => - -- if bit 0 of ea set, add accd to md - left_ctrl <= accd_left; - if ea(0) = '1' then - right_ctrl <= md_right; - else - right_ctrl <= zero_right; - end if; - alu_ctrl <= alu_mul; - cc_ctrl <= load_cc; - acca_ctrl <= load_hi_acca; - accb_ctrl <= load_accb; - md_ctrl <= shiftl_md; - next_state <= mul1_state; - - when mul1_state => - -- if bit 1 of ea set, add accd to md - left_ctrl <= accd_left; - if ea(1) = '1' then - right_ctrl <= md_right; - else - right_ctrl <= zero_right; - end if; - alu_ctrl <= alu_mul; - cc_ctrl <= load_cc; - acca_ctrl <= load_hi_acca; - accb_ctrl <= load_accb; - md_ctrl <= shiftl_md; - next_state <= mul2_state; - - when mul2_state => - -- if bit 2 of ea set, add accd to md - left_ctrl <= accd_left; - if ea(2) = '1' then - right_ctrl <= md_right; - else - right_ctrl <= zero_right; - end if; - alu_ctrl <= alu_mul; - cc_ctrl <= load_cc; - acca_ctrl <= load_hi_acca; - accb_ctrl <= load_accb; - md_ctrl <= shiftl_md; - next_state <= mul3_state; - - when mul3_state => - -- if bit 3 of ea set, add accd to md - left_ctrl <= accd_left; - if ea(3) = '1' then - right_ctrl <= md_right; - else - right_ctrl <= zero_right; - end if; - alu_ctrl <= alu_mul; - cc_ctrl <= load_cc; - acca_ctrl <= load_hi_acca; - accb_ctrl <= load_accb; - md_ctrl <= shiftl_md; - next_state <= mul4_state; - - when mul4_state => - -- if bit 4 of ea set, add accd to md - left_ctrl <= accd_left; - if ea(4) = '1' then - right_ctrl <= md_right; - else - right_ctrl <= zero_right; - end if; - alu_ctrl <= alu_mul; - cc_ctrl <= load_cc; - acca_ctrl <= load_hi_acca; - accb_ctrl <= load_accb; - md_ctrl <= shiftl_md; - next_state <= mul5_state; - - when mul5_state => - -- if bit 5 of ea set, add accd to md - left_ctrl <= accd_left; - if ea(5) = '1' then - right_ctrl <= md_right; - else - right_ctrl <= zero_right; - end if; - alu_ctrl <= alu_mul; - cc_ctrl <= load_cc; - acca_ctrl <= load_hi_acca; - accb_ctrl <= load_accb; - md_ctrl <= shiftl_md; - next_state <= mul6_state; - - when mul6_state => - -- if bit 6 of ea set, add accd to md - left_ctrl <= accd_left; - if ea(6) = '1' then - right_ctrl <= md_right; - else - right_ctrl <= zero_right; - end if; - alu_ctrl <= alu_mul; - cc_ctrl <= load_cc; - acca_ctrl <= load_hi_acca; - accb_ctrl <= load_accb; - md_ctrl <= shiftl_md; - next_state <= mul7_state; - - when mul7_state => - -- if bit 7 of ea set, add accd to md - left_ctrl <= accd_left; - if ea(7) = '1' then - right_ctrl <= md_right; - else - right_ctrl <= zero_right; - end if; - alu_ctrl <= alu_mul; - cc_ctrl <= load_cc; - acca_ctrl <= load_hi_acca; - accb_ctrl <= load_accb; - md_ctrl <= shiftl_md; - lic <= '1'; - next_state <= fetch_state; - - -- - -- Enter here on pushs - -- ea holds post byte - -- - when pshs_state => - -- decrement sp if any registers to be pushed - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - -- idle address - addr_ctrl <= idle_ad; - dout_ctrl <= cc_dout; - if ea(7 downto 0) = "00000000" then - sp_ctrl <= latch_sp; - else - sp_ctrl <= load_sp; - end if; - if ea(7) = '1' then - next_state <= pshs_pcl_state; - elsif ea(6) = '1' then - next_state <= pshs_upl_state; - elsif ea(5) = '1' then - next_state <= pshs_iyl_state; - elsif ea(4) = '1' then - next_state <= pshs_ixl_state; - elsif ea(3) = '1' then - next_state <= pshs_dp_state; - elsif ea(2) = '1' then - next_state <= pshs_accb_state; - elsif ea(1) = '1' then - next_state <= pshs_acca_state; - elsif ea(0) = '1' then - next_state <= pshs_cc_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pshs_pcl_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- write pc low - addr_ctrl <= pushs_ad; - dout_ctrl <= pc_lo_dout; - next_state <= pshs_pch_state; - - when pshs_pch_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - if ea(6 downto 0) = "0000000" then - sp_ctrl <= latch_sp; - else - sp_ctrl <= load_sp; - end if; - -- write pc hi - addr_ctrl <= pushs_ad; - dout_ctrl <= pc_hi_dout; - if ea(6) = '1' then - next_state <= pshs_upl_state; - elsif ea(5) = '1' then - next_state <= pshs_iyl_state; - elsif ea(4) = '1' then - next_state <= pshs_ixl_state; - elsif ea(3) = '1' then - next_state <= pshs_dp_state; - elsif ea(2) = '1' then - next_state <= pshs_accb_state; - elsif ea(1) = '1' then - next_state <= pshs_acca_state; - elsif ea(0) = '1' then - next_state <= pshs_cc_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - - when pshs_upl_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- write pc low - addr_ctrl <= pushs_ad; - dout_ctrl <= up_lo_dout; - next_state <= pshs_uph_state; - - when pshs_uph_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - if ea(5 downto 0) = "000000" then - sp_ctrl <= latch_sp; - else - sp_ctrl <= load_sp; - end if; - -- write pc hi - addr_ctrl <= pushs_ad; - dout_ctrl <= up_hi_dout; - if ea(5) = '1' then - next_state <= pshs_iyl_state; - elsif ea(4) = '1' then - next_state <= pshs_ixl_state; - elsif ea(3) = '1' then - next_state <= pshs_dp_state; - elsif ea(2) = '1' then - next_state <= pshs_accb_state; - elsif ea(1) = '1' then - next_state <= pshs_acca_state; - elsif ea(0) = '1' then - next_state <= pshs_cc_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pshs_iyl_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- write iy low - addr_ctrl <= pushs_ad; - dout_ctrl <= iy_lo_dout; - next_state <= pshs_iyh_state; - - when pshs_iyh_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - if ea(4 downto 0) = "00000" then - sp_ctrl <= latch_sp; - else - sp_ctrl <= load_sp; - end if; - -- write iy hi - addr_ctrl <= pushs_ad; - dout_ctrl <= iy_hi_dout; - if ea(4) = '1' then - next_state <= pshs_ixl_state; - elsif ea(3) = '1' then - next_state <= pshs_dp_state; - elsif ea(2) = '1' then - next_state <= pshs_accb_state; - elsif ea(1) = '1' then - next_state <= pshs_acca_state; - elsif ea(0) = '1' then - next_state <= pshs_cc_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pshs_ixl_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- write ix low - addr_ctrl <= pushs_ad; - dout_ctrl <= ix_lo_dout; - next_state <= pshs_ixh_state; - - when pshs_ixh_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - if ea(3 downto 0) = "0000" then - sp_ctrl <= latch_sp; - else - sp_ctrl <= load_sp; - end if; - -- write ix hi - addr_ctrl <= pushs_ad; - dout_ctrl <= ix_hi_dout; - if ea(3) = '1' then - next_state <= pshs_dp_state; - elsif ea(2) = '1' then - next_state <= pshs_accb_state; - elsif ea(1) = '1' then - next_state <= pshs_acca_state; - elsif ea(0) = '1' then - next_state <= pshs_cc_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pshs_dp_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - if ea(2 downto 0) = "000" then - sp_ctrl <= latch_sp; - else - sp_ctrl <= load_sp; - end if; - -- write dp - addr_ctrl <= pushs_ad; - dout_ctrl <= dp_dout; - if ea(2) = '1' then - next_state <= pshs_accb_state; - elsif ea(1) = '1' then - next_state <= pshs_acca_state; - elsif ea(0) = '1' then - next_state <= pshs_cc_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pshs_accb_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - if ea(1 downto 0) = "00" then - sp_ctrl <= latch_sp; - else - sp_ctrl <= load_sp; - end if; - -- write accb - addr_ctrl <= pushs_ad; - dout_ctrl <= accb_dout; - if ea(1) = '1' then - next_state <= pshs_acca_state; - elsif ea(0) = '1' then - next_state <= pshs_cc_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pshs_acca_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - if ea(0) = '1' then - sp_ctrl <= load_sp; - else - sp_ctrl <= latch_sp; - end if; - -- write acca - addr_ctrl <= pushs_ad; - dout_ctrl <= acca_dout; - if ea(0) = '1' then - next_state <= pshs_cc_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pshs_cc_state => - -- idle sp - -- write cc - addr_ctrl <= pushs_ad; - dout_ctrl <= cc_dout; - lic <= '1'; - next_state <= fetch_state; - - -- - -- enter here on PULS - -- ea hold register mask - -- - when puls_state => - if ea(0) = '1' then - next_state <= puls_cc_state; - elsif ea(1) = '1' then - next_state <= puls_acca_state; - elsif ea(2) = '1' then - next_state <= puls_accb_state; - elsif ea(3) = '1' then - next_state <= puls_dp_state; - elsif ea(4) = '1' then - next_state <= puls_ixh_state; - elsif ea(5) = '1' then - next_state <= puls_iyh_state; - elsif ea(6) = '1' then - next_state <= puls_uph_state; - elsif ea(7) = '1' then - next_state <= puls_pch_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when puls_cc_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read cc - cc_ctrl <= pull_cc; - addr_ctrl <= pulls_ad; - if ea(1) = '1' then - next_state <= puls_acca_state; - elsif ea(2) = '1' then - next_state <= puls_accb_state; - elsif ea(3) = '1' then - next_state <= puls_dp_state; - elsif ea(4) = '1' then - next_state <= puls_ixh_state; - elsif ea(5) = '1' then - next_state <= puls_iyh_state; - elsif ea(6) = '1' then - next_state <= puls_uph_state; - elsif ea(7) = '1' then - next_state <= puls_pch_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when puls_acca_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read acca - acca_ctrl <= pull_acca; - addr_ctrl <= pulls_ad; - if ea(2) = '1' then - next_state <= puls_accb_state; - elsif ea(3) = '1' then - next_state <= puls_dp_state; - elsif ea(4) = '1' then - next_state <= puls_ixh_state; - elsif ea(5) = '1' then - next_state <= puls_iyh_state; - elsif ea(6) = '1' then - next_state <= puls_uph_state; - elsif ea(7) = '1' then - next_state <= puls_pch_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when puls_accb_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read accb - accb_ctrl <= pull_accb; - addr_ctrl <= pulls_ad; - if ea(3) = '1' then - next_state <= puls_dp_state; - elsif ea(4) = '1' then - next_state <= puls_ixh_state; - elsif ea(5) = '1' then - next_state <= puls_iyh_state; - elsif ea(6) = '1' then - next_state <= puls_uph_state; - elsif ea(7) = '1' then - next_state <= puls_pch_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when puls_dp_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read dp - dp_ctrl <= pull_dp; - addr_ctrl <= pulls_ad; - if ea(4) = '1' then - next_state <= puls_ixh_state; - elsif ea(5) = '1' then - next_state <= puls_iyh_state; - elsif ea(6) = '1' then - next_state <= puls_uph_state; - elsif ea(7) = '1' then - next_state <= puls_pch_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when puls_ixh_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- pull ix hi - ix_ctrl <= pull_hi_ix; - addr_ctrl <= pulls_ad; - next_state <= puls_ixl_state; - - when puls_ixl_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read ix low - ix_ctrl <= pull_lo_ix; - addr_ctrl <= pulls_ad; - if ea(5) = '1' then - next_state <= puls_iyh_state; - elsif ea(6) = '1' then - next_state <= puls_uph_state; - elsif ea(7) = '1' then - next_state <= puls_pch_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when puls_iyh_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- pull iy hi - iy_ctrl <= pull_hi_iy; - addr_ctrl <= pulls_ad; - next_state <= puls_iyl_state; - - when puls_iyl_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read iy low - iy_ctrl <= pull_lo_iy; - addr_ctrl <= pulls_ad; - if ea(6) = '1' then - next_state <= puls_uph_state; - elsif ea(7) = '1' then - next_state <= puls_pch_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when puls_uph_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- pull up hi - up_ctrl <= pull_hi_up; - addr_ctrl <= pulls_ad; - next_state <= puls_upl_state; - - when puls_upl_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read up low - up_ctrl <= pull_lo_up; - addr_ctrl <= pulls_ad; - if ea(7) = '1' then - next_state <= puls_pch_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when puls_pch_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- pull pc hi - pc_ctrl <= pull_hi_pc; - addr_ctrl <= pulls_ad; - next_state <= puls_pcl_state; - - when puls_pcl_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read pc low - pc_ctrl <= pull_lo_pc; - addr_ctrl <= pulls_ad; - lic <= '1'; - next_state <= fetch_state; - - -- - -- Enter here on pshu - -- ea holds post byte - -- - when pshu_state => - -- decrement up if any registers to be pushed - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - if ea(7 downto 0) = "00000000" then - up_ctrl <= latch_up; - else - up_ctrl <= load_up; - end if; - -- write idle bus - if ea(7) = '1' then - next_state <= pshu_pcl_state; - elsif ea(6) = '1' then - next_state <= pshu_spl_state; - elsif ea(5) = '1' then - next_state <= pshu_iyl_state; - elsif ea(4) = '1' then - next_state <= pshu_ixl_state; - elsif ea(3) = '1' then - next_state <= pshu_dp_state; - elsif ea(2) = '1' then - next_state <= pshu_accb_state; - elsif ea(1) = '1' then - next_state <= pshu_acca_state; - elsif ea(0) = '1' then - next_state <= pshu_cc_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - -- - -- push PC onto U stack - -- - when pshu_pcl_state => - -- decrement up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - up_ctrl <= load_up; - -- write pc low - addr_ctrl <= pushu_ad; - dout_ctrl <= pc_lo_dout; - next_state <= pshu_pch_state; - - when pshu_pch_state => - -- decrement up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - if ea(6 downto 0) = "0000000" then - up_ctrl <= latch_up; - else - up_ctrl <= load_up; - end if; - -- write pc hi - addr_ctrl <= pushu_ad; - dout_ctrl <= pc_hi_dout; - if ea(6) = '1' then - next_state <= pshu_spl_state; - elsif ea(5) = '1' then - next_state <= pshu_iyl_state; - elsif ea(4) = '1' then - next_state <= pshu_ixl_state; - elsif ea(3) = '1' then - next_state <= pshu_dp_state; - elsif ea(2) = '1' then - next_state <= pshu_accb_state; - elsif ea(1) = '1' then - next_state <= pshu_acca_state; - elsif ea(0) = '1' then - next_state <= pshu_cc_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pshu_spl_state => - -- decrement up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - up_ctrl <= load_up; - -- write sp low - addr_ctrl <= pushu_ad; - dout_ctrl <= sp_lo_dout; - next_state <= pshu_sph_state; - - when pshu_sph_state => - -- decrement up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - if ea(5 downto 0) = "000000" then - up_ctrl <= latch_up; - else - up_ctrl <= load_up; - end if; - -- write sp hi - addr_ctrl <= pushu_ad; - dout_ctrl <= sp_hi_dout; - if ea(5) = '1' then - next_state <= pshu_iyl_state; - elsif ea(4) = '1' then - next_state <= pshu_ixl_state; - elsif ea(3) = '1' then - next_state <= pshu_dp_state; - elsif ea(2) = '1' then - next_state <= pshu_accb_state; - elsif ea(1) = '1' then - next_state <= pshu_acca_state; - elsif ea(0) = '1' then - next_state <= pshu_cc_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pshu_iyl_state => - -- decrement up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - up_ctrl <= load_up; - -- write iy low - addr_ctrl <= pushu_ad; - dout_ctrl <= iy_lo_dout; - next_state <= pshu_iyh_state; - - when pshu_iyh_state => - -- decrement up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - if ea(4 downto 0) = "00000" then - up_ctrl <= latch_up; - else - up_ctrl <= load_up; - end if; - -- write iy hi - addr_ctrl <= pushu_ad; - dout_ctrl <= iy_hi_dout; - if ea(4) = '1' then - next_state <= pshu_ixl_state; - elsif ea(3) = '1' then - next_state <= pshu_dp_state; - elsif ea(2) = '1' then - next_state <= pshu_accb_state; - elsif ea(1) = '1' then - next_state <= pshu_acca_state; - elsif ea(0) = '1' then - next_state <= pshu_cc_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pshu_ixl_state => - -- decrement up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - up_ctrl <= load_up; - -- write ix low - addr_ctrl <= pushu_ad; - dout_ctrl <= ix_lo_dout; - next_state <= pshu_ixh_state; - - when pshu_ixh_state => - -- decrement up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - if ea(3 downto 0) = "0000" then - up_ctrl <= latch_up; - else - up_ctrl <= load_up; - end if; - -- write ix hi - addr_ctrl <= pushu_ad; - dout_ctrl <= ix_hi_dout; - if ea(3) = '1' then - next_state <= pshu_dp_state; - elsif ea(2) = '1' then - next_state <= pshu_accb_state; - elsif ea(1) = '1' then - next_state <= pshu_acca_state; - elsif ea(0) = '1' then - next_state <= pshu_cc_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pshu_dp_state => - -- decrement up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - if ea(2 downto 0) = "000" then - up_ctrl <= latch_up; - else - up_ctrl <= load_up; - end if; - -- write dp - addr_ctrl <= pushu_ad; - dout_ctrl <= dp_dout; - if ea(2) = '1' then - next_state <= pshu_accb_state; - elsif ea(1) = '1' then - next_state <= pshu_acca_state; - elsif ea(0) = '1' then - next_state <= pshu_cc_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pshu_accb_state => - -- decrement up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - if ea(1 downto 0) = "00" then - up_ctrl <= latch_up; - else - up_ctrl <= load_up; - end if; - -- write accb - addr_ctrl <= pushu_ad; - dout_ctrl <= accb_dout; - if ea(1) = '1' then - next_state <= pshu_acca_state; - elsif ea(0) = '1' then - next_state <= pshu_cc_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pshu_acca_state => - -- decrement up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - if ea(0) = '0' then - up_ctrl <= latch_up; - else - up_ctrl <= load_up; - end if; - -- write acca - addr_ctrl <= pushu_ad; - dout_ctrl <= acca_dout; - if ea(0) = '1' then - next_state <= pshu_cc_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pshu_cc_state => - -- idle up - -- write cc - addr_ctrl <= pushu_ad; - dout_ctrl <= cc_dout; - lic <= '1'; - next_state <= fetch_state; - - -- - -- enter here on PULU - -- ea hold register mask - -- - when pulu_state => - -- idle UP - -- idle bus - if ea(0) = '1' then - next_state <= pulu_cc_state; - elsif ea(1) = '1' then - next_state <= pulu_acca_state; - elsif ea(2) = '1' then - next_state <= pulu_accb_state; - elsif ea(3) = '1' then - next_state <= pulu_dp_state; - elsif ea(4) = '1' then - next_state <= pulu_ixh_state; - elsif ea(5) = '1' then - next_state <= pulu_iyh_state; - elsif ea(6) = '1' then - next_state <= pulu_sph_state; - elsif ea(7) = '1' then - next_state <= pulu_pch_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pulu_cc_state => - -- increment up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - up_ctrl <= load_up; - -- read cc - cc_ctrl <= pull_cc; - addr_ctrl <= pullu_ad; - if ea(1) = '1' then - next_state <= pulu_acca_state; - elsif ea(2) = '1' then - next_state <= pulu_accb_state; - elsif ea(3) = '1' then - next_state <= pulu_dp_state; - elsif ea(4) = '1' then - next_state <= pulu_ixh_state; - elsif ea(5) = '1' then - next_state <= pulu_iyh_state; - elsif ea(6) = '1' then - next_state <= pulu_sph_state; - elsif ea(7) = '1' then - next_state <= pulu_pch_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pulu_acca_state => - -- increment up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - up_ctrl <= load_up; - -- read acca - acca_ctrl <= pull_acca; - addr_ctrl <= pullu_ad; - if ea(2) = '1' then - next_state <= pulu_accb_state; - elsif ea(3) = '1' then - next_state <= pulu_dp_state; - elsif ea(4) = '1' then - next_state <= pulu_ixh_state; - elsif ea(5) = '1' then - next_state <= pulu_iyh_state; - elsif ea(6) = '1' then - next_state <= pulu_sph_state; - elsif ea(7) = '1' then - next_state <= pulu_pch_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pulu_accb_state => - -- increment up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - up_ctrl <= load_up; - -- read accb - accb_ctrl <= pull_accb; - addr_ctrl <= pullu_ad; - if ea(3) = '1' then - next_state <= pulu_dp_state; - elsif ea(4) = '1' then - next_state <= pulu_ixh_state; - elsif ea(5) = '1' then - next_state <= pulu_iyh_state; - elsif ea(6) = '1' then - next_state <= pulu_sph_state; - elsif ea(7) = '1' then - next_state <= pulu_pch_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pulu_dp_state => - -- increment up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - up_ctrl <= load_up; - -- read dp - dp_ctrl <= pull_dp; - addr_ctrl <= pullu_ad; - if ea(4) = '1' then - next_state <= pulu_ixh_state; - elsif ea(5) = '1' then - next_state <= pulu_iyh_state; - elsif ea(6) = '1' then - next_state <= pulu_sph_state; - elsif ea(7) = '1' then - next_state <= pulu_pch_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pulu_ixh_state => - -- increment up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - up_ctrl <= load_up; - -- read ix hi - ix_ctrl <= pull_hi_ix; - addr_ctrl <= pullu_ad; - next_state <= pulu_ixl_state; - - when pulu_ixl_state => - -- increment up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - up_ctrl <= load_up; - -- read ix low - ix_ctrl <= pull_lo_ix; - addr_ctrl <= pullu_ad; - if ea(5) = '1' then - next_state <= pulu_iyh_state; - elsif ea(6) = '1' then - next_state <= pulu_sph_state; - elsif ea(7) = '1' then - next_state <= pulu_pch_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pulu_iyh_state => - -- increment up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - up_ctrl <= load_up; - -- read iy hi - iy_ctrl <= pull_hi_iy; - addr_ctrl <= pullu_ad; - next_state <= pulu_iyl_state; - - when pulu_iyl_state => - -- increment up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - up_ctrl <= load_up; - -- read iy low - iy_ctrl <= pull_lo_iy; - addr_ctrl <= pullu_ad; - if ea(6) = '1' then - next_state <= pulu_sph_state; - elsif ea(7) = '1' then - next_state <= pulu_pch_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pulu_sph_state => - -- increment up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - up_ctrl <= load_up; - -- read sp hi - sp_ctrl <= pull_hi_sp; - addr_ctrl <= pullu_ad; - next_state <= pulu_spl_state; - - when pulu_spl_state => - -- increment up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - up_ctrl <= load_up; - -- read sp low - sp_ctrl <= pull_lo_sp; - addr_ctrl <= pullu_ad; - if ea(7) = '1' then - next_state <= pulu_pch_state; - else - lic <= '1'; - next_state <= fetch_state; - end if; - - when pulu_pch_state => - -- increment up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - up_ctrl <= load_up; - -- pull pc hi - pc_ctrl <= pull_hi_pc; - addr_ctrl <= pullu_ad; - next_state <= pulu_pcl_state; - - when pulu_pcl_state => - -- increment up - left_ctrl <= up_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - up_ctrl <= load_up; - -- read pc low - pc_ctrl <= pull_lo_pc; - addr_ctrl <= pullu_ad; - lic <= '1'; - next_state <= fetch_state; - - -- - -- pop the Condition codes - -- - when rti_cc_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read cc - cc_ctrl <= pull_cc; - addr_ctrl <= pulls_ad; - next_state <= rti_entire_state; - - -- - -- Added RTI cycle 11th July 2006 John Kent. - -- test the "Entire" Flag - -- that has just been popped off the stack - -- - when rti_entire_state => - -- - -- The Entire flag must be recovered from the stack - -- before testing. - -- - if cc(EBIT) = '1' then - next_state <= rti_acca_state; - else - next_state <= rti_pch_state; - end if; - - when rti_acca_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read acca - acca_ctrl <= pull_acca; - addr_ctrl <= pulls_ad; - next_state <= rti_accb_state; - - when rti_accb_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read accb - accb_ctrl <= pull_accb; - addr_ctrl <= pulls_ad; - next_state <= rti_dp_state; - - when rti_dp_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read dp - dp_ctrl <= pull_dp; - addr_ctrl <= pulls_ad; - next_state <= rti_ixh_state; - - when rti_ixh_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read ix hi - ix_ctrl <= pull_hi_ix; - addr_ctrl <= pulls_ad; - next_state <= rti_ixl_state; - - when rti_ixl_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read ix low - ix_ctrl <= pull_lo_ix; - addr_ctrl <= pulls_ad; - next_state <= rti_iyh_state; - - when rti_iyh_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read iy hi - iy_ctrl <= pull_hi_iy; - addr_ctrl <= pulls_ad; - next_state <= rti_iyl_state; - - when rti_iyl_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read iy low - iy_ctrl <= pull_lo_iy; - addr_ctrl <= pulls_ad; - next_state <= rti_uph_state; - - - when rti_uph_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read up hi - up_ctrl <= pull_hi_up; - addr_ctrl <= pulls_ad; - next_state <= rti_upl_state; - - when rti_upl_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- read up low - up_ctrl <= pull_lo_up; - addr_ctrl <= pulls_ad; - next_state <= rti_pch_state; - - when rti_pch_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- pull pc hi - pc_ctrl <= pull_hi_pc; - addr_ctrl <= pulls_ad; - next_state <= rti_pcl_state; - - when rti_pcl_state => - -- increment sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_add16; - sp_ctrl <= load_sp; - -- pull pc low - pc_ctrl <= pull_lo_pc; - addr_ctrl <= pulls_ad; - lic <= '1'; - next_state <= fetch_state; - - -- - -- here on NMI interrupt - -- Complete execute cycle of the last instruction. - -- If it was a dual operand instruction - -- - when int_nmi_state => - next_state <= int_nmi1_state; - - -- Idle bus cycle - when int_nmi1_state => - -- pre decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - iv_ctrl <= nmi_iv; - st_ctrl <= push_st; - return_state <= int_nmimask_state; - next_state <= int_entire_state; - - -- - -- here on IRQ interrupt - -- Complete execute cycle of the last instruction. - -- If it was a dual operand instruction - -- - when int_irq_state => - next_state <= int_irq1_state; - - -- pre decrement the sp - -- Idle bus cycle - when int_irq1_state => - -- pre decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - iv_ctrl <= irq_iv; - st_ctrl <= push_st; - return_state <= int_irqmask_state; - next_state <= int_entire_state; - - -- - -- here on FIRQ interrupt - -- Complete execution cycle of the last instruction - -- if it was a dual operand instruction - -- - when int_firq_state => - next_state <= int_firq1_state; - - -- Idle bus cycle - when int_firq1_state => - -- pre decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - iv_ctrl <= firq_iv; - st_ctrl <= push_st; - return_state <= int_firqmask_state; - next_state <= int_fast_state; - - -- - -- CWAI entry point - -- stack pointer already pre-decremented - -- mask condition codes - -- - when cwai_state => - -- AND CC with md - left_ctrl <= md_left; - right_ctrl <= zero_right; - alu_ctrl <= alu_andcc; - cc_ctrl <= load_cc; - st_ctrl <= push_st; - return_state <= int_cwai_state; - next_state <= int_entire_state; - - -- - -- wait here for an interrupt - -- - when int_cwai_state => - if (nmi_req = '1') then - iv_ctrl <= nmi_iv; - next_state <= int_nmimask_state; - -- - -- FIRQ & IRQ are level sensitive - -- - elsif (firq = '1') and (cc(FBIT) = '0') then - iv_ctrl <= firq_iv; - next_state <= int_firqmask_state; - - elsif (irq = '1') and (cc(IBIT) = '0') then - iv_ctrl <= irq_iv; - next_state <= int_irqmask_state; - else - next_state <= int_cwai_state; - end if; - - -- - -- State to mask I Flag and F Flag (NMI) - -- - when int_nmimask_state => - alu_ctrl <= alu_seif; - cc_ctrl <= load_cc; - next_state <= vect_hi_state; - - -- - -- State to mask I Flag and F Flag (FIRQ) - -- - when int_firqmask_state => - alu_ctrl <= alu_seif; - cc_ctrl <= load_cc; - next_state <= vect_hi_state; - - - -- - -- State to mask I Flag and F Flag (SWI) - -- - when int_swimask_state => - alu_ctrl <= alu_seif; - cc_ctrl <= load_cc; - next_state <= vect_hi_state; - - -- - -- State to mask I Flag only (IRQ) - -- - when int_irqmask_state => - alu_ctrl <= alu_sei; - cc_ctrl <= load_cc; - next_state <= vect_hi_state; - - -- - -- set Entire Flag on SWI, SWI2, SWI3 and CWAI, IRQ and NMI - -- before stacking all registers - -- - when int_entire_state => - -- set entire flag - alu_ctrl <= alu_see; - cc_ctrl <= load_cc; - next_state <= int_pcl_state; - - -- - -- clear Entire Flag on FIRQ - -- before stacking all registers - -- - when int_fast_state => - -- clear entire flag - alu_ctrl <= alu_cle; - cc_ctrl <= load_cc; - next_state <= int_pcl_state; - - when int_pcl_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- write pc low - addr_ctrl <= pushs_ad; - dout_ctrl <= pc_lo_dout; - next_state <= int_pch_state; - - when int_pch_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- write pc hi - addr_ctrl <= pushs_ad; - dout_ctrl <= pc_hi_dout; - if cc(EBIT) = '1' then - next_state <= int_upl_state; - else - next_state <= int_cc_state; - end if; - - when int_upl_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- write up low - addr_ctrl <= pushs_ad; - dout_ctrl <= up_lo_dout; - next_state <= int_uph_state; - - when int_uph_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- write ix hi - addr_ctrl <= pushs_ad; - dout_ctrl <= up_hi_dout; - next_state <= int_iyl_state; - - when int_iyl_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- write ix low - addr_ctrl <= pushs_ad; - dout_ctrl <= iy_lo_dout; - next_state <= int_iyh_state; - - when int_iyh_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- write ix hi - addr_ctrl <= pushs_ad; - dout_ctrl <= iy_hi_dout; - next_state <= int_ixl_state; - - when int_ixl_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- write ix low - addr_ctrl <= pushs_ad; - dout_ctrl <= ix_lo_dout; - next_state <= int_ixh_state; - - when int_ixh_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- write ix hi - addr_ctrl <= pushs_ad; - dout_ctrl <= ix_hi_dout; - next_state <= int_dp_state; - - when int_dp_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- write accb - addr_ctrl <= pushs_ad; - dout_ctrl <= dp_dout; - next_state <= int_accb_state; - - when int_accb_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- write accb - addr_ctrl <= pushs_ad; - dout_ctrl <= accb_dout; - next_state <= int_acca_state; - - when int_acca_state => - -- decrement sp - left_ctrl <= sp_left; - right_ctrl <= one_right; - alu_ctrl <= alu_sub16; - sp_ctrl <= load_sp; - -- write acca - addr_ctrl <= pushs_ad; - dout_ctrl <= acca_dout; - next_state <= int_cc_state; - - when int_cc_state => - -- write cc - addr_ctrl <= pushs_ad; - dout_ctrl <= cc_dout; - next_state <= saved_state; - - -- - -- According to the 6809 programming manual: - -- If an interrupt is received and is masked - -- or lasts for less than three cycles, the PC - -- will advance to the next instruction. - -- If an interrupt is unmasked and lasts - -- for more than three cycles, an interrupt - -- will be generated. - -- Note that I don't wait 3 clock cycles. - -- John Kent 11th July 2006 - -- - when sync_state => - lic <= '1'; - ba <= '1'; - -- - -- Version 1.28 2015-05-30 - -- Exit sync_state on interrupt. - -- If the interrupts are active - -- they will be caught in the state_machine process - -- and the interrupt service routine microcode will be executed. - -- Masked interrupts will exit the sync_state. - -- Moved from the state_machine process to the state_sequencer process - -- - if (firq = '1') or (irq = '1') then - next_state <= fetch_state; - else - next_state <= sync_state; - end if; - - when halt_state => - -- - -- 2011-10-30 John Kent - -- ba & bs should be high - ba <= '1'; - bs <= '1'; - if halt = '1' then - next_state <= halt_state; - else - next_state <= fetch_state; - end if; - - end case; - --- --- Ver 1.23 2011-10-30 John Kent --- First instruction cycle might be --- fetch_state --- halt_state --- int_nmirq_state --- int_firq_state --- - if fic = '1' then - -- - case op_code(7 downto 6) is - when "10" => -- acca - case op_code(3 downto 0) is - when "0000" => -- suba - left_ctrl <= acca_left; - right_ctrl <= md_right; - alu_ctrl <= alu_sub8; - cc_ctrl <= load_cc; - acca_ctrl <= load_acca; - when "0001" => -- cmpa - left_ctrl <= acca_left; - right_ctrl <= md_right; - alu_ctrl <= alu_sub8; - cc_ctrl <= load_cc; - when "0010" => -- sbca - left_ctrl <= acca_left; - right_ctrl <= md_right; - alu_ctrl <= alu_sbc; - cc_ctrl <= load_cc; - acca_ctrl <= load_acca; - when "0011" => - case pre_code is - when "00010000" => -- page 2 -- cmpd - left_ctrl <= accd_left; - right_ctrl <= md_right; - alu_ctrl <= alu_sub16; - cc_ctrl <= load_cc; - when "00010001" => -- page 3 -- cmpu - left_ctrl <= up_left; - right_ctrl <= md_right; - alu_ctrl <= alu_sub16; - cc_ctrl <= load_cc; - when others => -- page 1 -- subd - left_ctrl <= accd_left; - right_ctrl <= md_right; - alu_ctrl <= alu_sub16; - cc_ctrl <= load_cc; - acca_ctrl <= load_hi_acca; - accb_ctrl <= load_accb; - end case; - when "0100" => -- anda - left_ctrl <= acca_left; - right_ctrl <= md_right; - alu_ctrl <= alu_and; - cc_ctrl <= load_cc; - acca_ctrl <= load_acca; - when "0101" => -- bita - left_ctrl <= acca_left; - right_ctrl <= md_right; - alu_ctrl <= alu_and; - cc_ctrl <= load_cc; - when "0110" => -- ldaa - left_ctrl <= acca_left; - right_ctrl <= md_right; - alu_ctrl <= alu_ld8; - cc_ctrl <= load_cc; - acca_ctrl <= load_acca; - when "0111" => -- staa - left_ctrl <= acca_left; - right_ctrl <= md_right; - alu_ctrl <= alu_st8; - cc_ctrl <= load_cc; - when "1000" => -- eora - left_ctrl <= acca_left; - right_ctrl <= md_right; - alu_ctrl <= alu_eor; - cc_ctrl <= load_cc; - acca_ctrl <= load_acca; - when "1001" => -- adca - left_ctrl <= acca_left; - right_ctrl <= md_right; - alu_ctrl <= alu_adc; - cc_ctrl <= load_cc; - acca_ctrl <= load_acca; - when "1010" => -- oraa - left_ctrl <= acca_left; - right_ctrl <= md_right; - alu_ctrl <= alu_ora; - cc_ctrl <= load_cc; - acca_ctrl <= load_acca; - when "1011" => -- adda - left_ctrl <= acca_left; - right_ctrl <= md_right; - alu_ctrl <= alu_add8; - cc_ctrl <= load_cc; - acca_ctrl <= load_acca; - when "1100" => - case pre_code is - when "00010000" => -- page 2 -- cmpy - left_ctrl <= iy_left; - right_ctrl <= md_right; - alu_ctrl <= alu_sub16; - cc_ctrl <= load_cc; - when "00010001" => -- page 3 -- cmps - left_ctrl <= sp_left; - right_ctrl <= md_right; - alu_ctrl <= alu_sub16; - cc_ctrl <= load_cc; - when others => -- page 1 -- cmpx - left_ctrl <= ix_left; - right_ctrl <= md_right; - alu_ctrl <= alu_sub16; - cc_ctrl <= load_cc; - end case; - when "1101" => -- bsr / jsr - null; - when "1110" => -- ldx - case pre_code is - when "00010000" => -- page 2 -- ldy - left_ctrl <= iy_left; - right_ctrl <= md_right; - alu_ctrl <= alu_ld16; - cc_ctrl <= load_cc; - iy_ctrl <= load_iy; - when others => -- page 1 -- ldx - left_ctrl <= ix_left; - right_ctrl <= md_right; - alu_ctrl <= alu_ld16; - cc_ctrl <= load_cc; - ix_ctrl <= load_ix; - end case; - when "1111" => -- stx - case pre_code is - when "00010000" => -- page 2 -- sty - left_ctrl <= iy_left; - right_ctrl <= md_right; - alu_ctrl <= alu_st16; - cc_ctrl <= load_cc; - when others => -- page 1 -- stx - left_ctrl <= ix_left; - right_ctrl <= md_right; - alu_ctrl <= alu_st16; - cc_ctrl <= load_cc; - end case; - when others => - null; - end case; - when "11" => -- accb dual op - case op_code(3 downto 0) is - when "0000" => -- subb - left_ctrl <= accb_left; - right_ctrl <= md_right; - alu_ctrl <= alu_sub8; - cc_ctrl <= load_cc; - accb_ctrl <= load_accb; - when "0001" => -- cmpb - left_ctrl <= accb_left; - right_ctrl <= md_right; - alu_ctrl <= alu_sub8; - cc_ctrl <= load_cc; - when "0010" => -- sbcb - left_ctrl <= accb_left; - right_ctrl <= md_right; - alu_ctrl <= alu_sbc; - cc_ctrl <= load_cc; - accb_ctrl <= load_accb; - when "0011" => -- addd - left_ctrl <= accd_left; - right_ctrl <= md_right; - alu_ctrl <= alu_add16; - cc_ctrl <= load_cc; - acca_ctrl <= load_hi_acca; - accb_ctrl <= load_accb; - when "0100" => -- andb - left_ctrl <= accb_left; - right_ctrl <= md_right; - alu_ctrl <= alu_and; - cc_ctrl <= load_cc; - accb_ctrl <= load_accb; - when "0101" => -- bitb - left_ctrl <= accb_left; - right_ctrl <= md_right; - alu_ctrl <= alu_and; - cc_ctrl <= load_cc; - when "0110" => -- ldab - left_ctrl <= accb_left; - right_ctrl <= md_right; - alu_ctrl <= alu_ld8; - cc_ctrl <= load_cc; - accb_ctrl <= load_accb; - when "0111" => -- stab - left_ctrl <= accb_left; - right_ctrl <= md_right; - alu_ctrl <= alu_st8; - cc_ctrl <= load_cc; - when "1000" => -- eorb - left_ctrl <= accb_left; - right_ctrl <= md_right; - alu_ctrl <= alu_eor; - cc_ctrl <= load_cc; - accb_ctrl <= load_accb; - when "1001" => -- adcb - left_ctrl <= accb_left; - right_ctrl <= md_right; - alu_ctrl <= alu_adc; - cc_ctrl <= load_cc; - accb_ctrl <= load_accb; - when "1010" => -- orab - left_ctrl <= accb_left; - right_ctrl <= md_right; - alu_ctrl <= alu_ora; - cc_ctrl <= load_cc; - accb_ctrl <= load_accb; - when "1011" => -- addb - left_ctrl <= accb_left; - right_ctrl <= md_right; - alu_ctrl <= alu_add8; - cc_ctrl <= load_cc; - accb_ctrl <= load_accb; - when "1100" => -- ldd - left_ctrl <= accd_left; - right_ctrl <= md_right; - alu_ctrl <= alu_ld16; - cc_ctrl <= load_cc; - acca_ctrl <= load_hi_acca; - accb_ctrl <= load_accb; - when "1101" => -- std - left_ctrl <= accd_left; - right_ctrl <= md_right; - alu_ctrl <= alu_st16; - cc_ctrl <= load_cc; - when "1110" => -- ldu - case pre_code is - when "00010000" => -- page 2 -- lds - left_ctrl <= sp_left; - right_ctrl <= md_right; - alu_ctrl <= alu_ld16; - cc_ctrl <= load_cc; - sp_ctrl <= load_sp; - when others => -- page 1 -- ldu - left_ctrl <= up_left; - right_ctrl <= md_right; - alu_ctrl <= alu_ld16; - cc_ctrl <= load_cc; - up_ctrl <= load_up; - end case; - when "1111" => - case pre_code is - when "00010000" => -- page 2 -- sts - left_ctrl <= sp_left; - right_ctrl <= md_right; - alu_ctrl <= alu_st16; - cc_ctrl <= load_cc; - when others => -- page 1 -- stu - left_ctrl <= up_left; - right_ctrl <= md_right; - alu_ctrl <= alu_st16; - cc_ctrl <= load_cc; - end case; - when others => - null; - end case; - when others => - null; - end case; - - end if; -- first instruction cycle (fic) - lic_out <= lic; -end process; - -end rtl; - diff --git a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/ym_2149_linmix.vhd b/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/ym_2149_linmix.vhd deleted file mode 100644 index b0573a80..00000000 --- a/Arcade_MiST/IremM52 Hardware/TraverseUSA_MiST/rtl/ym_2149_linmix.vhd +++ /dev/null @@ -1,645 +0,0 @@ --- --- A simulation model of YM2149 (AY-3-8910 with bells on) - --- Copyright (c) MikeJ - Jan 2005 --- --- All rights reserved --- --- Redistribution and use in source and synthezised forms, with or without --- modification, are permitted provided that the following conditions are met: --- --- Redistributions of source code must retain the above copyright notice, --- this list of conditions and the following disclaimer. --- --- Redistributions in synthesized form must reproduce the above copyright --- notice, this list of conditions and the following disclaimer in the --- documentation and/or other materials provided with the distribution. --- --- Neither the name of the author nor the names of other contributors may --- be used to endorse or promote products derived from this software without --- specific prior written permission. --- --- THIS CODE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" --- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, --- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR --- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE --- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR --- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF --- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS --- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN --- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) --- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE --- POSSIBILITY OF SUCH DAMAGE. --- --- You are responsible for any legal issues arising from your use of this code. --- --- The latest version of this file can be found at: www.fpgaarcade.com --- --- Email support@fpgaarcade.com --- --- Revision list --- --- version 001 initial release --- --- Clues from MAME sound driver and Kazuhiro TSUJIKAWA --- --- These are the measured outputs from a real chip for a single Isolated channel into a 1K load (V) --- vol 15 .. 0 --- 3.27 2.995 2.741 2.588 2.452 2.372 2.301 2.258 2.220 2.198 2.178 2.166 2.155 2.148 2.141 2.132 --- As the envelope volume is 5 bit, I have fitted a curve to the not quite log shape in order --- to produced all the required values. --- (The first part of the curve is a bit steeper and the last bit is more linear than expected) --- --- NOTE, this component uses LINEAR mixing of the three analogue channels, and is only --- accurate for designs where the outputs are buffered and not simply wired together. --- The ouput level is more complex in that case and requires a larger table. - -library ieee; - use ieee.std_logic_1164.all; - use ieee.std_logic_arith.all; - use ieee.std_logic_unsigned.all; - -entity YM2149 is - port ( - -- data bus - I_DA : in std_logic_vector(7 downto 0); - O_DA : out std_logic_vector(7 downto 0); - O_DA_OE_L : out std_logic; - -- control - I_A9_L : in std_logic; - I_A8 : in std_logic; - I_BDIR : in std_logic; - I_BC2 : in std_logic; - I_BC1 : in std_logic; - I_SEL_L : in std_logic; - - O_AUDIO : out std_logic_vector(7 downto 0); - -- port a - I_IOA : in std_logic_vector(7 downto 0); - O_IOA : out std_logic_vector(7 downto 0); - O_IOA_OE_L : out std_logic; - -- port b - I_IOB : in std_logic_vector(7 downto 0); - O_IOB : out std_logic_vector(7 downto 0); - O_IOB_OE_L : out std_logic; - - ENA : in std_logic; -- clock enable for higher speed operation - RESET_L : in std_logic; - CLK : in std_logic -- note 6 Mhz - ); -end; - -architecture RTL of YM2149 is - type array_16x8 is array (0 to 15) of std_logic_vector(7 downto 0); - type array_3x12 is array (1 to 3) of std_logic_vector(11 downto 0); - - signal cnt_div : std_logic_vector(3 downto 0) := (others => '0'); - signal noise_div : std_logic := '0'; - signal ena_div : std_logic; - signal ena_div_noise : std_logic; - signal poly17 : std_logic_vector(16 downto 0) := (others => '0'); - - -- registers - signal addr : std_logic_vector(7 downto 0); - signal busctrl_addr : std_logic; - signal busctrl_we : std_logic; - signal busctrl_re : std_logic; - - signal reg : array_16x8 ; --:= ( --- "00000000", -- R0 Period Tone A 8bits lsb --- "00000100", -- R1 Period Tone A 4bits msb --- "00000000", -- R2 Period Tone B 8bits lsb --- "00000010", -- R3 Period Tone B 4bits msb --- "00000000", -- R4 Period Tone C 8bits lsb --- "00000001", -- R5 Period Tone C 4bits msb --- "00001000", -- R6 Period Noise 5bits --- "00111000", -- R7 Mixer Noise CBA 3bits, Tone CBA 3bits --- "00000111", -- R8 Amplitude A Mode 1bit, Level 4bits --- "00000111", -- R9 Amplitude B Mode 1bit, Level 4bits --- "00000111", -- R10 Amplitude C Mode 1bit, Level 4bits --- "00000000", -- R11 Period Enveloppe 8bits lsb --- "00000000", -- R12 Period Enveloppe 8bits msb --- "00000000", -- R13 Shape Enveloppe 4bits --- "00000000", -- R14 Port A --- "00000000" -- R15 Port B --- ); - - signal env_reset : std_logic; - signal ioa_inreg : std_logic_vector(7 downto 0); - signal iob_inreg : std_logic_vector(7 downto 0); - - signal noise_gen_cnt : std_logic_vector(4 downto 0); - signal noise_gen_op : std_logic; - signal tone_gen_cnt : array_3x12 := (others => (others => '0')); - signal tone_gen_op : std_logic_vector(3 downto 1) := "000"; - - signal env_gen_cnt : std_logic_vector(15 downto 0); - signal env_ena : std_logic; - signal env_hold : std_logic; - signal env_inc : std_logic; - signal env_vol : std_logic_vector(4 downto 0); - - signal tone_ena_l : std_logic; - signal tone_src : std_logic; - signal noise_ena_l : std_logic; - signal chan_vol : std_logic_vector(4 downto 0); - - signal dac_amp : std_logic_vector(7 downto 0); - signal audio_mix : std_logic_vector(9 downto 0); - signal audio_final : std_logic_vector(9 downto 0); -begin - -- cpu i/f - p_busdecode : process(I_BDIR, I_BC2, I_BC1, addr, I_A9_L, I_A8) - variable cs : std_logic; - variable sel : std_logic_vector(2 downto 0); - begin - -- BDIR BC2 BC1 MODE - -- 0 0 0 inactive - -- 0 0 1 address - -- 0 1 0 inactive - -- 0 1 1 read - -- 1 0 0 address - -- 1 0 1 inactive - -- 1 1 0 write - -- 1 1 1 read - busctrl_addr <= '0'; - busctrl_we <= '0'; - busctrl_re <= '0'; - - cs := '0'; - if (I_A9_L = '0') and (I_A8 = '1') and (addr(7 downto 4) = "0000") then - cs := '1'; - end if; - - sel := (I_BDIR & I_BC2 & I_BC1); - case sel is - when "000" => null; - when "001" => busctrl_addr <= '1'; - when "010" => null; - when "011" => busctrl_re <= cs; - when "100" => busctrl_addr <= '1'; - when "101" => null; - when "110" => busctrl_we <= cs; - when "111" => busctrl_addr <= '1'; - when others => null; - end case; - end process; - - p_oe : process(busctrl_re) - begin - -- if we are emulating a real chip, maybe clock this to fake up the tristate typ delay of 100ns - O_DA_OE_L <= not (busctrl_re); - end process; - - -- - -- CLOCKED - -- - p_waddr : process - begin - ---- looks like registers are latches in real chip, but the address is caught at the end of the address state. - wait until rising_edge(CLK); - - if (RESET_L = '0') then - addr <= (others => '0'); - else - if (busctrl_addr = '1') then - addr <= I_DA; - end if; - end if; - end process; - - p_wdata : process - begin - ---- looks like registers are latches in real chip, but the address is caught at the end of the address state. - wait until rising_edge(CLK); - env_reset <= '0'; - - if (RESET_L = '0') then - reg <= (others => (others => '0')); - env_reset <= '1'; - else - env_reset <= '0'; - if (busctrl_we = '1') then - case addr(3 downto 0) is - when x"0" => reg(0) <= I_DA; - when x"1" => reg(1) <= I_DA; - when x"2" => reg(2) <= I_DA; - when x"3" => reg(3) <= I_DA; - when x"4" => reg(4) <= I_DA; - when x"5" => reg(5) <= I_DA; - when x"6" => reg(6) <= I_DA; - when x"7" => reg(7) <= I_DA; - when x"8" => reg(8) <= I_DA; - when x"9" => reg(9) <= I_DA; - when x"A" => reg(10) <= I_DA; - when x"B" => reg(11) <= I_DA; - when x"C" => reg(12) <= I_DA; - when x"D" => reg(13) <= I_DA; env_reset <= '1'; - when x"E" => reg(14) <= I_DA; - when x"F" => reg(15) <= I_DA; - when others => null; - end case; - end if; - end if; - end process; - - -- - -- LATCHED, useful when emulating a real chip in circuit. Nasty as gated clock. - -- --- p_waddr : process(reset_l, busctrl_addr) --- begin --- -- looks like registers are latches in real chip, but the address is caught at the end of the address state. --- if (RESET_L = '0') then --- addr <= (others => '0'); --- elsif falling_edge(busctrl_addr) then -- yuk --- addr <= I_DA; --- end if; --- end process; --- --- p_wdata : process(reset_l, busctrl_we, addr) --- begin --- if (RESET_L = '0') then --- reg <= (others => (others => '0')); --- elsif falling_edge(busctrl_we) then --- case addr(3 downto 0) is --- when x"0" => reg(0) <= I_DA; --- when x"1" => reg(1) <= I_DA; --- when x"2" => reg(2) <= I_DA; --- when x"3" => reg(3) <= I_DA; --- when x"4" => reg(4) <= I_DA; --- when x"5" => reg(5) <= I_DA; --- when x"6" => reg(6) <= I_DA; --- when x"7" => reg(7) <= I_DA; --- when x"8" => reg(8) <= I_DA; --- when x"9" => reg(9) <= I_DA; --- when x"A" => reg(10) <= I_DA; --- when x"B" => reg(11) <= I_DA; --- when x"C" => reg(12) <= I_DA; --- when x"D" => reg(13) <= I_DA; --- when x"E" => reg(14) <= I_DA; --- when x"F" => reg(15) <= I_DA; --- when others => null; --- end case; --- end if; --- --- env_reset <= '0'; --- if (busctrl_we = '1') and (addr(3 downto 0) = x"D") then --- env_reset <= '1'; --- end if; --- end process; - - -- - -- END LATCHED - -- - - p_rdata : process(busctrl_re, addr, reg) - begin - O_DA <= (others => '0'); -- 'X' - if (busctrl_re = '1') then -- not necessary, but useful for putting 'X's in the simulator - case addr(3 downto 0) is - when x"0" => O_DA <= reg(0) ; - when x"1" => O_DA <= "0000" & reg(1)(3 downto 0) ; - when x"2" => O_DA <= reg(2) ; - when x"3" => O_DA <= "0000" & reg(3)(3 downto 0) ; - when x"4" => O_DA <= reg(4) ; - when x"5" => O_DA <= "0000" & reg(5)(3 downto 0) ; - when x"6" => O_DA <= "000" & reg(6)(4 downto 0) ; - when x"7" => O_DA <= reg(7) ; - when x"8" => O_DA <= "000" & reg(8)(4 downto 0) ; - when x"9" => O_DA <= "000" & reg(9)(4 downto 0) ; - when x"A" => O_DA <= "000" & reg(10)(4 downto 0) ; - when x"B" => O_DA <= reg(11); - when x"C" => O_DA <= reg(12); - when x"D" => O_DA <= "0000" & reg(13)(3 downto 0); - when x"E" => if (reg(7)(6) = '0') then -- input - O_DA <= ioa_inreg; - else - O_DA <= reg(14); -- read output reg - end if; - when x"F" => if (Reg(7)(7) = '0') then - O_DA <= iob_inreg; - else - O_DA <= reg(15); - end if; - when others => null; - end case; - end if; - end process; - -- - p_divider : process - begin - wait until rising_edge(CLK); - -- / 8 when SEL is high and /16 when SEL is low - if (ENA = '1') then - ena_div <= '0'; - ena_div_noise <= '0'; - if (cnt_div = "0000") then - cnt_div <= (not I_SEL_L) & "111"; - ena_div <= '1'; - - noise_div <= not noise_div; - if (noise_div = '1') then - ena_div_noise <= '1'; - end if; - else - cnt_div <= cnt_div - "1"; - end if; - end if; - end process; - - p_noise_gen : process - variable noise_gen_comp : std_logic_vector(4 downto 0); - variable poly17_zero : std_logic; - begin - wait until rising_edge(CLK); - - if (reg(6)(4 downto 0) = "00000") then - noise_gen_comp := "00000"; - else - noise_gen_comp := (reg(6)(4 downto 0) - "1"); - end if; - - poly17_zero := '0'; - if (poly17 = "00000000000000000") then poly17_zero := '1'; end if; - - if (ENA = '1') then - - if (ena_div_noise = '1') then -- divider ena - - if (noise_gen_cnt >= noise_gen_comp) then - noise_gen_cnt <= "00000"; - poly17 <= (poly17(0) xor poly17(2) xor poly17_zero) & poly17(16 downto 1); - else - noise_gen_cnt <= (noise_gen_cnt + "1"); - end if; - end if; - end if; - end process; - noise_gen_op <= poly17(0); - - p_tone_gens : process - variable tone_gen_freq : array_3x12; - variable tone_gen_comp : array_3x12; - begin - wait until rising_edge(CLK); - - -- looks like real chips count up - we need to get the Exact behaviour .. - tone_gen_freq(1) := reg(1)(3 downto 0) & reg(0); - tone_gen_freq(2) := reg(3)(3 downto 0) & reg(2); - tone_gen_freq(3) := reg(5)(3 downto 0) & reg(4); - -- period 0 = period 1 - for i in 1 to 3 loop - if (tone_gen_freq(i) = x"000") then - tone_gen_comp(i) := x"000"; - else - tone_gen_comp(i) := (tone_gen_freq(i) - "1"); - end if; - end loop; - - if (ENA = '1') then - for i in 1 to 3 loop - if (ena_div = '1') then -- divider ena - - if (tone_gen_cnt(i) >= tone_gen_comp(i)) then - tone_gen_cnt(i) <= x"000"; - tone_gen_op(i) <= not tone_gen_op(i); - else - tone_gen_cnt(i) <= (tone_gen_cnt(i) + "1"); - end if; - end if; - end loop; - end if; - end process; - - p_envelope_freq : process - variable env_gen_freq : std_logic_vector(15 downto 0); - variable env_gen_comp : std_logic_vector(15 downto 0); - begin - wait until rising_edge(CLK); - env_gen_freq := reg(12) & reg(11); - -- envelope freqs 1 and 0 are the same. - if (env_gen_freq = x"0000") then - env_gen_comp := x"0000"; - else - env_gen_comp := (env_gen_freq - "1"); - end if; - - if (ENA = '1') then - env_ena <= '0'; - if (ena_div = '1') then -- divider ena - if (env_gen_cnt >= env_gen_comp) then - env_gen_cnt <= x"0000"; - env_ena <= '1'; - else - env_gen_cnt <= (env_gen_cnt + "1"); - end if; - end if; - end if; - end process; - - p_envelope_shape : process(env_reset, CLK) - variable is_bot : boolean; - variable is_bot_p1 : boolean; - variable is_top_m1 : boolean; - variable is_top : boolean; - begin - -- envelope shapes - -- C AtAlH - -- 0 0 x x \___ - -- - -- 0 1 x x /___ - -- - -- 1 0 0 0 \\\\ - -- - -- 1 0 0 1 \___ - -- - -- 1 0 1 0 \/\/ - -- ___ - -- 1 0 1 1 \ - -- - -- 1 1 0 0 //// - -- ___ - -- 1 1 0 1 / - -- - -- 1 1 1 0 /\/\ - -- - -- 1 1 1 1 /___ - if (env_reset = '1') then - -- load initial state - if (reg(13)(2) = '0') then -- attack - env_vol <= "11111"; - env_inc <= '0'; -- -1 - else - env_vol <= "00000"; - env_inc <= '1'; -- +1 - end if; - env_hold <= '0'; - - elsif rising_edge(CLK) then - is_bot := (env_vol = "00000"); - is_bot_p1 := (env_vol = "00001"); - is_top_m1 := (env_vol = "11110"); - is_top := (env_vol = "11111"); - - if (ENA = '1') then - if (env_ena = '1') then - if (env_hold = '0') then - if (env_inc = '1') then - env_vol <= (env_vol + "00001"); - else - env_vol <= (env_vol + "11111"); - end if; - end if; - - -- envelope shape control. - if (reg(13)(3) = '0') then - if (env_inc = '0') then -- down - if is_bot_p1 then env_hold <= '1'; end if; - else - if is_top then env_hold <= '1'; end if; - end if; - else - if (reg(13)(0) = '1') then -- hold = 1 - if (env_inc = '0') then -- down - if (reg(13)(1) = '1') then -- alt - if is_bot then env_hold <= '1'; end if; - else - if is_bot_p1 then env_hold <= '1'; end if; - end if; - else - if (reg(13)(1) = '1') then -- alt - if is_top then env_hold <= '1'; end if; - else - if is_top_m1 then env_hold <= '1'; end if; - end if; - end if; - - elsif (reg(13)(1) = '1') then -- alternate - if (env_inc = '0') then -- down - if is_bot_p1 then env_hold <= '1'; end if; - if is_bot then env_hold <= '0'; env_inc <= '1'; end if; - else - if is_top_m1 then env_hold <= '1'; end if; - if is_top then env_hold <= '0'; env_inc <= '0'; end if; - end if; - end if; - - end if; - end if; - end if; - end if; - end process; - - p_chan_mixer : process(cnt_div, reg, tone_gen_op) - begin - tone_ena_l <= '1'; tone_src <= '1'; - noise_ena_l <= '1'; chan_vol <= "00000"; - case cnt_div(1 downto 0) is - when "00" => - tone_ena_l <= reg(7)(0); tone_src <= tone_gen_op(1); chan_vol <= reg(8)(4 downto 0); - noise_ena_l <= reg(7)(3); - when "01" => - tone_ena_l <= reg(7)(1); tone_src <= tone_gen_op(2); chan_vol <= reg(9)(4 downto 0); - noise_ena_l <= reg(7)(4); - when "10" => - tone_ena_l <= reg(7)(2); tone_src <= tone_gen_op(3); chan_vol <= reg(10)(4 downto 0); - noise_ena_l <= reg(7)(5); - when "11" => null; -- tone gen outputs become valid on this clock - when others => null; - end case; - end process; - - p_op_mixer : process - variable chan_mixed : std_logic; - variable chan_amp : std_logic_vector(4 downto 0); - begin - wait until rising_edge(CLK); - if (ENA = '1') then - - chan_mixed := (tone_ena_l or tone_src) and (noise_ena_l or noise_gen_op); - - chan_amp := (others => '0'); - if (chan_mixed = '1') then - if (chan_vol(4) = '0') then - if (chan_vol(3 downto 0) = "0000") then -- nothing is easy ! make sure quiet is quiet - chan_amp := "00000"; - else - chan_amp := chan_vol(3 downto 0) & '1'; -- make sure level 31 (env) = level 15 (tone) - end if; - else - chan_amp := env_vol(4 downto 0); - end if; - end if; - - dac_amp <= x"00"; - case chan_amp is - when "11111" => dac_amp <= x"FF"; - when "11110" => dac_amp <= x"D9"; - when "11101" => dac_amp <= x"BA"; - when "11100" => dac_amp <= x"9F"; - when "11011" => dac_amp <= x"88"; - when "11010" => dac_amp <= x"74"; - when "11001" => dac_amp <= x"63"; - when "11000" => dac_amp <= x"54"; - when "10111" => dac_amp <= x"48"; - when "10110" => dac_amp <= x"3D"; - when "10101" => dac_amp <= x"34"; - when "10100" => dac_amp <= x"2C"; - when "10011" => dac_amp <= x"25"; - when "10010" => dac_amp <= x"1F"; - when "10001" => dac_amp <= x"1A"; - when "10000" => dac_amp <= x"16"; - when "01111" => dac_amp <= x"13"; - when "01110" => dac_amp <= x"10"; - when "01101" => dac_amp <= x"0D"; - when "01100" => dac_amp <= x"0B"; - when "01011" => dac_amp <= x"09"; - when "01010" => dac_amp <= x"08"; - when "01001" => dac_amp <= x"07"; - when "01000" => dac_amp <= x"06"; - when "00111" => dac_amp <= x"05"; - when "00110" => dac_amp <= x"04"; - when "00101" => dac_amp <= x"03"; - when "00100" => dac_amp <= x"03"; - when "00011" => dac_amp <= x"02"; - when "00010" => dac_amp <= x"02"; - when "00001" => dac_amp <= x"01"; - when "00000" => dac_amp <= x"00"; - when others => null; - end case; - - if (cnt_div(1 downto 0) = "10") then - audio_mix <= (others => '0'); - audio_final <= audio_mix; - else - audio_mix <= audio_mix + ("00" & dac_amp); - end if; - - if (RESET_L = '0') then - O_AUDIO(7 downto 0) <= "00000000"; - else - if (audio_final(9) = '0') then - O_AUDIO(7 downto 0) <= audio_final(8 downto 1); - else -- clip - O_AUDIO(7 downto 0) <= x"FF"; - end if; - end if; - end if; - end process; - - p_io_ports : process(reg) - begin - O_IOA <= reg(14); - - O_IOA_OE_L <= not reg(7)(6); - O_IOB <= reg(15); - O_IOB_OE_L <= not reg(7)(7); - end process; - - p_io_ports_inreg : process - begin - wait until rising_edge(CLK); - ioa_inreg <= I_IOA; - iob_inreg <= I_IOB; - end process; -end architecture RTL;