in VHDL 'X' means Unknown, not dont care, dont care is '-'
But VHDL also has strong typing, so comparing an input of 4 bits to "1XXX" will look for that string literally during simulation, so "1000 will NOT match, only "1XXX" will match.
To do what you are doing, you need to use the matching case statement from VHDL 2008 (case?), that will try and match dont cares:
case? a is
when "0100000110-00100" => dq(8 downto 1) <= "10111111";
when "01--------00----" => dq(8 downto 1) <= "01111111";
--etc
otherwise, if you're stuck with VHDL 93, you can use the std_match function from the std_logic_misc library
if std_match(a, "01000000110-00100") then
---
elsif std_match(a, "01--------00----") then
--etc
This way simulation will match your hardware.