URL
https://opencores.org/ocsvn/light8080/light8080/trunk
Subversion Repositories light8080
Compare Revisions
- This comparison shows the changes necessary to convert path
/light8080/trunk
- from Rev 86 to Rev 87
- ↔ Reverse comparison
Rev 86 → Rev 87
/sw/demos/exer/obj_code_pkg.vhdl
0,0 → 1,621
-- obj_code_pkg -- Object code in VHDL constant table for BRAM initialization. |
-- Generated automatically with script 'build_rom.py'. |
|
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.numeric_std.all; |
use work.l80pkg.all; |
|
package obj_code_pkg is |
|
constant obj_code : obj_code_t(0 to 4848) := ( |
X"c3", X"00", X"01", X"00", X"00", X"c3", X"a6", X"0e", |
X"fb", X"c9", X"00", X"00", X"00", X"00", X"00", X"00", |
X"fb", X"c9", X"00", X"00", X"00", X"00", X"00", X"00", |
X"fb", X"c9", X"00", X"00", X"00", X"00", X"00", X"00", |
X"fb", X"c9", X"00", X"00", X"00", X"00", X"00", X"00", |
X"fb", X"c9", X"00", X"00", X"00", X"00", X"00", X"00", |
X"fb", X"c9", X"00", X"00", X"00", X"00", X"00", X"00", |
X"fb", X"c9", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"c3", X"13", 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"21", X"40", X"1f", X"f9", X"11", |
X"f8", X"0d", X"0e", X"09", X"cd", X"ec", X"0d", X"21", |
X"3c", X"01", X"7e", X"23", X"b6", X"ca", X"2f", X"01", |
X"2b", X"cd", X"d0", X"0a", X"c3", X"22", X"01", X"11", |
X"15", X"0e", X"0e", X"09", X"cd", X"ec", X"0d", X"f3", |
X"76", X"c3", X"00", X"00", X"70", X"01", X"d0", X"01", |
X"30", X"02", X"90", X"02", X"f0", X"02", X"50", X"03", |
X"b0", X"03", X"10", X"04", X"70", X"04", X"d0", X"04", |
X"30", X"05", X"90", X"05", X"f0", X"05", X"50", X"06", |
X"b0", X"06", X"10", X"07", X"70", X"07", X"d0", X"07", |
X"30", X"08", X"90", X"08", X"f0", X"08", X"50", X"09", |
X"b0", X"09", X"10", X"0a", X"70", X"0a", X"00", X"00", |
X"ff", X"09", X"00", X"00", X"00", X"a5", X"c4", X"c7", |
X"c4", X"26", X"d2", X"50", X"a0", X"ea", X"58", X"66", |
X"85", X"c6", X"de", X"c9", X"9b", X"30", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"21", |
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"ff", X"ff", X"ff", X"ff", X"ff", |
X"ff", X"d7", X"00", X"ff", X"ff", X"14", X"47", X"4b", |
X"a6", X"64", X"61", X"64", X"20", X"3c", X"62", X"2c", |
X"64", X"2c", X"68", X"2c", X"73", X"70", X"3e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"c6", X"00", X"00", X"00", X"40", X"91", X"3c", |
X"7e", X"67", X"7a", X"6d", X"df", X"61", X"5b", X"29", |
X"0b", X"10", X"66", X"b2", X"85", 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"ff", 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"d7", X"00", X"00", X"00", X"9e", X"92", X"2f", |
X"9e", X"61", X"6c", X"75", X"6f", X"70", X"20", X"6e", |
X"6e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"80", X"00", X"00", X"00", X"3e", X"c5", X"3a", |
X"57", X"4d", X"4c", X"03", X"01", X"09", X"e3", X"66", |
X"a6", X"d0", X"3b", X"bb", X"ad", 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"ff", 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"d7", X"00", X"00", X"00", X"cf", X"76", X"2c", |
X"86", X"61", X"6c", X"75", X"6f", X"70", X"20", X"3c", |
X"62", X"2c", X"63", X"2c", X"64", X"2c", X"65", X"2c", |
X"68", X"2c", X"6c", X"2c", X"6d", X"2c", X"61", X"3e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"27", X"00", X"00", X"00", X"41", X"21", X"fa", |
X"09", X"60", X"1d", X"59", X"a5", X"5b", X"8d", X"79", |
X"90", X"04", X"8e", X"9d", X"29", 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"d7", 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"bb", X"3f", X"03", |
X"0c", X"3c", X"64", X"61", X"61", X"2c", X"63", X"6d", |
X"61", X"2c", X"73", X"74", X"63", X"2c", X"63", X"6d", |
X"63", X"3e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"3c", X"00", X"00", X"00", X"df", X"4a", X"d8", |
X"d5", X"98", X"e5", X"2b", X"8a", X"b0", X"a7", X"1b", |
X"43", X"44", X"5a", X"30", X"d0", 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"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"d7", X"00", X"00", X"00", X"ad", X"b6", X"46", |
X"0e", X"3c", X"69", X"6e", X"72", X"2c", X"64", X"63", |
X"72", X"3e", X"20", X"61", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"04", X"00", X"00", X"00", X"23", X"d6", X"2d", |
X"43", X"61", X"7a", X"80", X"81", X"86", X"5a", X"85", |
X"1e", X"86", X"58", X"bb", X"9b", 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"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"d7", X"00", X"00", X"00", X"83", X"ed", X"13", |
X"45", X"3c", X"69", X"6e", X"72", X"2c", X"64", X"63", |
X"72", X"3e", X"20", X"62", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"03", X"00", X"00", X"00", X"97", X"cd", X"ab", |
X"44", X"c9", X"8d", X"e3", X"e3", X"cc", X"11", X"a4", |
X"e8", X"02", X"49", X"4d", X"2a", 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"21", 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"d7", X"00", X"00", X"00", X"f7", X"92", X"87", |
X"cd", X"3c", X"69", X"6e", X"78", X"2c", X"64", X"63", |
X"78", X"3e", X"20", X"62", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"0c", X"00", X"00", X"00", X"89", X"d7", X"35", |
X"09", X"5b", X"05", X"85", X"9f", X"27", X"8b", X"08", |
X"d2", X"95", X"05", X"60", X"06", 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"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"d7", X"00", X"00", X"00", X"e5", X"f6", X"72", |
X"1b", X"3c", X"69", X"6e", X"72", X"2c", X"64", X"63", |
X"72", X"3e", X"20", X"63", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"14", X"00", X"00", X"00", X"ea", X"a0", X"ba", |
X"5f", X"fb", X"65", X"1c", X"98", X"cc", X"38", X"bc", |
X"de", X"43", X"5c", X"bd", 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"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"d7", X"00", X"00", X"00", X"15", X"b5", X"57", |
X"9a", X"3c", X"69", X"6e", X"72", X"2c", X"64", X"63", |
X"72", X"3e", X"20", X"64", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"13", X"00", X"00", X"00", X"2e", X"34", X"1d", |
X"13", X"c9", X"28", X"ca", X"0a", X"67", X"99", X"2e", |
X"3a", X"92", X"f6", X"54", X"9d", 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"21", 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"d7", X"00", X"00", X"00", X"7f", X"4e", X"25", |
X"01", X"3c", X"69", X"6e", X"78", X"2c", X"64", X"63", |
X"78", X"3e", X"20", X"64", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"1c", X"00", X"00", X"00", X"2f", X"60", X"0d", |
X"4c", X"02", X"24", X"f5", X"e2", X"f4", X"a0", X"0a", |
X"a1", X"13", X"32", X"25", X"59", 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"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"d7", X"00", X"00", X"00", X"cf", X"2a", X"b3", |
X"96", X"3c", X"69", X"6e", X"72", X"2c", X"64", X"63", |
X"72", X"3e", X"20", X"65", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"24", X"00", X"00", X"00", X"06", X"15", X"eb", |
X"f2", X"dd", X"e8", X"2b", X"26", X"a6", X"11", X"1a", |
X"bc", X"17", X"06", X"18", X"28", 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"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"d7", X"00", X"00", X"00", X"12", X"b2", X"95", |
X"2c", X"3c", X"69", X"6e", X"72", X"2c", X"64", X"63", |
X"72", X"3e", X"20", X"68", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"23", X"00", X"00", X"00", X"f4", X"c3", X"a5", |
X"07", X"6d", X"1b", X"04", X"4f", X"c2", X"e2", X"2a", |
X"82", X"57", X"e0", X"e1", X"c3", X"08", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"21", |
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"d7", X"00", X"00", X"00", X"9f", X"2b", X"23", |
X"c0", X"3c", X"69", X"6e", X"78", X"2c", X"64", X"63", |
X"78", X"3e", X"20", X"68", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"2c", X"00", X"00", X"00", X"31", X"80", X"20", |
X"a5", X"56", X"43", X"09", X"b4", X"c1", X"f4", X"a2", |
X"df", X"d1", X"3c", X"a2", X"3e", X"01", 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"d7", X"00", X"00", X"00", X"ff", X"57", X"d3", |
X"56", X"3c", X"69", X"6e", X"72", X"2c", X"64", X"63", |
X"72", X"3e", X"20", X"6c", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"34", X"00", X"00", X"00", X"56", X"b8", X"7c", |
X"0c", X"3e", X"e5", X"03", X"01", X"7e", X"87", X"58", |
X"da", X"15", X"5c", X"37", X"1f", X"01", 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"d7", X"00", X"00", X"00", X"92", X"e9", X"63", |
X"bd", X"3c", X"69", X"6e", X"72", X"2c", X"64", X"63", |
X"72", X"3e", X"20", X"6d", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"33", X"00", X"00", X"00", X"6f", X"34", X"82", |
X"d4", X"69", X"d1", X"b6", X"de", X"94", X"a4", X"76", |
X"f4", X"53", X"02", X"5b", X"85", 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"21", |
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"d7", X"00", X"00", X"00", X"d5", X"70", X"2f", |
X"ab", X"3c", X"69", X"6e", X"78", X"2c", X"64", X"63", |
X"78", X"3e", X"20", X"73", X"70", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"2a", X"03", X"01", X"00", X"63", X"98", X"30", |
X"78", X"77", X"20", X"fe", X"b1", X"fa", X"b9", X"b8", |
X"ab", X"04", X"06", X"15", 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"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"a9", X"c3", X"d5", |
X"cb", X"6c", X"68", X"6c", X"64", X"20", X"6e", X"6e", |
X"6e", X"6e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"22", X"03", X"01", X"00", X"03", X"d0", X"72", |
X"77", X"53", X"7f", X"72", X"3f", X"ea", X"64", X"80", |
X"e1", X"10", X"2d", X"e9", X"35", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"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"e8", X"86", X"4f", |
X"26", X"73", X"68", X"6c", X"64", X"20", X"6e", X"6e", |
X"6e", X"6e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"01", X"00", X"00", X"00", X"1c", X"5c", X"46", |
X"2d", X"b9", X"8e", X"78", X"60", X"b1", X"74", X"0e", |
X"b3", X"46", X"d1", X"cc", X"30", 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"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"fc", X"f4", X"6e", |
X"12", X"6c", X"78", X"69", X"20", X"3c", X"62", X"2c", |
X"64", X"2c", X"68", X"2c", X"73", X"70", X"3e", X"2c", |
X"6e", X"6e", X"6e", X"6e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"0a", X"00", X"00", X"00", X"a8", X"b3", X"2a", |
X"1d", X"8e", X"7f", X"ac", X"42", X"03", X"01", X"03", |
X"01", X"c6", X"b1", X"8e", X"ef", 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"ff", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"d7", X"ff", X"00", X"00", X"2b", X"82", X"1d", |
X"5f", X"6c", X"64", X"61", X"78", X"20", X"3c", X"62", |
X"2c", X"64", X"3e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"06", X"00", X"00", X"00", X"07", X"c4", X"9d", |
X"f4", X"3d", X"d1", X"39", X"03", X"89", X"de", X"55", |
X"74", X"53", X"c0", X"09", X"55", 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"00", X"00", |
X"00", X"00", X"ff", X"00", X"00", X"ea", X"a7", X"20", |
X"44", X"6d", X"76", X"69", X"20", X"3c", X"62", X"2c", |
X"63", X"2c", X"64", X"2c", X"65", X"2c", X"68", X"2c", |
X"6c", X"2c", X"6d", X"2c", X"61", X"3e", X"2c", X"6e", |
X"6e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"40", X"00", X"00", X"00", X"a4", X"72", X"24", |
X"a0", X"ac", X"61", X"03", X"01", X"c7", X"82", X"8f", |
X"71", X"97", X"8f", X"8e", X"ef", 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"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"d7", X"ff", X"00", X"00", X"10", X"b5", X"8c", |
X"ee", X"6d", X"6f", X"76", X"20", X"3c", X"62", X"63", |
X"64", X"65", X"68", X"6c", X"61", X"3e", X"2c", X"3c", |
X"62", X"63", X"64", X"65", X"68", X"6c", X"61", X"3e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"32", X"03", X"01", X"00", X"68", X"fd", X"ec", |
X"f4", X"a0", X"44", X"43", X"b5", X"53", X"06", X"ba", |
X"cd", X"d2", X"4f", X"d8", X"1f", 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"ff", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"d7", X"ff", X"00", X"00", X"ed", X"57", X"af", |
X"72", X"73", X"74", X"61", X"20", X"6e", X"6e", X"6e", |
X"6e", X"20", X"2f", X"20", X"6c", X"64", X"61", X"20", |
X"6e", X"6e", X"6e", X"6e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"07", X"00", X"00", X"00", X"92", X"cb", X"43", |
X"6d", X"90", X"0a", X"84", X"c2", X"53", X"0c", X"0e", |
X"f5", X"91", X"eb", X"fc", X"40", 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"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"d7", X"00", X"00", X"00", X"e0", X"d8", X"92", |
X"35", X"3c", X"72", X"6c", X"63", X"2c", X"72", X"72", |
X"63", X"2c", X"72", X"61", X"6c", X"2c", X"72", X"61", |
X"72", X"3e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"ff", X"02", X"00", X"00", X"00", X"3b", X"0c", X"92", |
X"b5", X"ff", X"6c", X"9e", X"95", X"03", X"01", X"04", |
X"01", X"c1", X"21", X"e7", X"bd", 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"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"ff", X"00", X"00", X"2b", X"04", X"71", |
X"e9", X"73", X"74", X"61", X"78", X"20", X"3c", X"62", |
X"2c", X"64", X"3e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", |
X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"2e", X"24", |
X"e5", X"7e", X"23", X"66", X"6f", X"7e", X"32", X"81", |
X"0d", X"23", X"e5", X"11", X"14", X"00", X"19", X"11", |
X"e0", X"0c", X"cd", X"4f", X"0c", X"e1", X"e5", X"11", |
X"28", X"00", X"19", X"11", X"08", X"0d", X"cd", X"4f", |
X"0c", X"21", X"08", X"0d", X"36", X"01", X"e1", X"e5", |
X"11", X"4f", X"0d", X"01", X"04", X"00", X"7e", X"12", |
X"23", X"13", X"0b", X"78", X"b1", X"c2", X"fe", X"0a", |
X"11", X"03", X"01", X"01", X"10", X"00", X"7e", X"12", |
X"23", X"13", X"0b", X"78", X"b1", X"c2", X"0e", X"0b", |
X"11", X"2c", X"00", X"19", X"eb", X"0e", X"09", X"cd", |
X"ec", X"0d", X"cd", X"92", X"0e", X"3a", X"4f", X"0d", |
X"fe", X"76", X"ca", X"3c", X"0b", X"e6", X"df", X"fe", |
X"dd", X"c2", X"39", X"0b", X"3a", X"50", X"0d", X"fe", |
X"76", X"c4", X"30", X"0d", X"cd", X"8f", X"0c", X"c4", |
X"b3", X"0c", X"e1", X"ca", X"78", X"0b", X"11", X"3c", |
X"00", X"19", X"cd", X"53", X"0e", X"11", X"26", X"0e", |
X"ca", X"6f", X"0b", X"11", X"2d", X"0e", X"0e", X"09", |
X"cd", X"ec", X"0d", X"cd", X"b7", X"0d", X"11", X"48", |
X"0e", X"0e", X"09", X"cd", X"ec", X"0d", X"21", X"ed", |
X"0e", X"cd", X"b7", X"0d", X"11", X"50", X"0e", X"0e", |
X"09", X"cd", X"ec", X"0d", X"e1", X"23", X"23", X"c9", |
X"e5", X"3e", X"01", X"32", X"ee", X"0b", X"32", X"12", |
X"0c", X"21", X"e0", X"0c", X"22", X"ef", X"0b", X"21", |
X"08", X"0d", X"22", X"13", X"0c", X"06", X"04", X"e1", |
X"e5", X"11", X"4f", X"0d", X"cd", X"a2", X"0b", X"06", |
X"10", X"11", X"03", X"01", X"cd", X"a2", X"0b", X"c3", |
X"25", X"0b", X"cd", X"ab", X"0b", X"23", X"05", X"c2", |
X"a2", X"0b", X"c9", X"c5", X"d5", X"e5", X"4e", X"11", |
X"14", X"00", X"19", X"7e", X"fe", X"00", X"ca", X"cc", |
X"0b", X"06", X"08", X"0f", X"f5", X"3e", X"00", X"dc", |
X"f1", X"0b", X"a9", X"0f", X"4f", X"f1", X"05", X"c2", |
X"bb", X"0b", X"06", X"08", X"11", X"14", X"00", X"19", |
X"7e", X"fe", X"00", X"ca", X"e7", X"0b", X"06", X"08", |
X"0f", X"f5", X"3e", X"00", X"dc", X"15", X"0c", X"a9", |
X"0f", X"4f", X"f1", X"05", X"c2", X"d8", X"0b", X"e1", |
X"d1", X"79", X"12", X"13", X"c1", X"c9", X"00", X"00", |
X"00", X"c5", X"e5", X"2a", X"ef", X"0b", X"46", X"21", |
X"ee", X"0b", X"7e", X"4f", X"07", X"77", X"fe", X"01", |
X"c2", X"0a", X"0c", X"2a", X"ef", X"0b", X"23", X"22", |
X"ef", X"0b", X"78", X"a1", X"e1", X"c1", X"c8", X"3e", |
X"01", X"c9", X"00", X"00", X"00", X"c5", X"e5", X"2a", |
X"13", X"0c", X"46", X"21", X"12", X"0c", X"7e", X"4f", |
X"07", X"77", X"fe", X"01", X"c2", X"2e", X"0c", X"2a", |
X"13", X"0c", X"23", X"22", X"13", X"0c", X"78", X"a1", |
X"e1", X"c1", X"c8", X"3e", X"01", X"c9", X"f5", X"c5", |
X"d5", X"e5", X"36", X"00", X"54", X"5d", X"13", X"0b", |
X"7e", X"12", X"23", X"13", X"0b", X"78", X"b1", X"c2", |
X"40", X"0c", X"e1", X"d1", X"c1", X"f1", X"c9", X"d5", |
X"eb", X"01", X"28", X"00", X"cd", X"36", X"0c", X"eb", |
X"06", X"14", X"0e", X"01", X"16", X"00", X"5e", X"7b", |
X"a1", X"ca", X"65", X"0c", X"14", X"79", X"07", X"4f", |
X"fe", X"01", X"c2", X"5f", X"0c", X"23", X"05", X"c2", |
X"5e", X"0c", X"7a", X"e6", X"f8", X"0f", X"0f", X"0f", |
X"6f", X"26", X"00", X"7a", X"e6", X"07", X"3c", X"47", |
X"3e", X"80", X"07", X"05", X"c2", X"82", X"0c", X"d1", |
X"19", X"11", X"14", X"00", X"19", X"77", X"c9", X"c5", |
X"d5", X"e5", X"21", X"e0", X"0c", X"11", X"14", X"00", |
X"eb", X"19", X"eb", X"34", X"7e", X"fe", X"00", X"ca", |
X"ae", X"0c", X"47", X"1a", X"a0", X"ca", X"aa", X"0c", |
X"36", X"00", X"c1", X"d1", X"e1", X"c9", X"23", X"13", |
X"c3", X"9b", X"0c", X"c5", X"d5", X"e5", X"21", X"08", |
X"0d", X"11", X"14", X"00", X"eb", X"19", X"eb", X"7e", |
X"b7", X"ca", X"db", X"0c", X"47", X"1a", X"a0", X"c2", |
X"d7", X"0c", X"78", X"07", X"fe", X"01", X"c2", X"d5", |
X"0c", X"36", X"00", X"23", X"13", X"77", X"af", X"e1", |
X"d1", X"c1", X"c9", X"23", X"13", X"c3", X"bf", 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"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"f5", X"c5", X"d5", X"e5", X"f3", X"21", X"00", X"00", |
X"39", X"22", X"ab", X"0d", X"31", X"05", X"01", X"e1", |
X"e1", X"e1", X"d1", X"c1", X"f1", X"22", X"99", X"0d", |
X"2a", X"11", X"01", X"f9", X"2a", X"99", X"0d", X"00", |
X"00", X"00", X"00", X"22", X"99", X"0d", X"21", X"00", |
X"00", X"da", X"60", X"0d", X"39", X"c3", X"62", X"0d", |
X"39", X"37", X"22", X"a9", X"0d", X"2a", X"99", X"0d", |
X"31", X"a9", X"0d", X"f5", X"c5", X"d5", X"e5", X"e5", |
X"e5", X"2a", X"ab", X"0d", X"f9", X"fb", X"2a", X"03", |
X"01", X"22", X"9b", X"0d", X"21", X"a7", X"0d", X"7e", |
X"e6", X"ff", X"77", X"06", X"10", X"11", X"9b", X"0d", |
X"21", X"ed", X"0e", X"1a", X"13", X"cd", X"6a", X"0e", |
X"05", X"c2", X"8b", X"0d", X"e1", X"d1", X"c1", X"f1", |
X"c9", X"00", X"00", X"00", X"00", X"00", X"00", X"00", |
X"00", X"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"cd", X"c9", |
X"0d", X"23", X"05", X"c2", X"ad", X"0d", X"c9", X"f5", |
X"c5", X"e5", X"06", X"04", X"7e", X"cd", X"c9", X"0d", |
X"23", X"05", X"c2", X"bc", X"0d", X"e1", X"c1", X"f1", |
X"c9", X"f5", X"0f", X"0f", X"0f", X"0f", X"cd", X"d2", |
X"0d", X"f1", X"f5", X"c5", X"d5", X"e5", X"e6", X"0f", |
X"fe", X"0a", X"da", X"df", X"0d", X"c6", X"27", X"c6", |
X"30", X"5f", X"0e", X"02", X"cd", X"ec", X"0d", X"e1", |
X"d1", X"c1", X"f1", X"c9", X"f5", X"c5", X"d5", X"e5", |
X"cd", X"05", X"00", X"e1", X"d1", X"c1", X"f1", X"c9", |
X"38", X"30", X"38", X"30", X"20", X"69", X"6e", X"73", |
X"74", X"72", X"75", X"63", X"74", X"69", X"6f", X"6e", |
X"20", X"65", X"78", X"65", X"72", X"63", X"69", X"73", |
X"65", X"72", X"0a", X"0d", X"24", X"54", X"65", X"73", |
X"74", X"73", X"20", X"63", X"6f", X"6d", X"70", X"6c", |
X"65", X"74", X"65", X"0a", X"0d", X"24", X"20", X"20", |
X"4f", X"4b", X"0a", X"0d", X"24", X"20", X"20", X"45", |
X"52", X"52", X"4f", X"52", X"20", X"2a", X"2a", X"2a", |
X"2a", X"20", X"63", X"72", X"63", X"20", X"65", X"78", |
X"70", X"65", X"63", X"74", X"65", X"64", X"3a", X"24", |
X"20", X"66", X"6f", X"75", X"6e", X"64", X"3a", X"24", |
X"0a", X"0d", X"24", X"c5", X"d5", X"e5", X"11", X"ed", |
X"0e", X"06", X"04", X"1a", X"be", X"c2", X"66", X"0e", |
X"23", X"13", X"05", X"c2", X"5b", X"0e", X"e1", X"d1", |
X"c1", X"c9", X"f5", X"c5", X"d5", X"e5", X"e5", X"11", |
X"03", X"00", X"19", X"ae", X"6f", X"26", X"00", X"29", |
X"29", X"eb", X"21", X"f1", X"0e", X"19", X"eb", X"e1", |
X"01", X"04", X"00", X"1a", X"a8", X"46", X"77", X"13", |
X"23", X"0d", X"c2", X"83", X"0e", X"e1", X"d1", X"c1", |
X"f1", X"c9", X"f5", X"c5", X"e5", X"21", X"ed", X"0e", |
X"3e", X"ff", X"06", X"04", X"77", X"23", X"05", X"c2", |
X"9c", X"0e", X"e1", X"c1", X"f1", X"c9", X"47", X"79", |
X"fe", X"09", X"ca", X"d6", X"0e", X"fe", X"02", X"ca", |
X"d2", X"0e", X"11", X"ba", X"0e", X"cd", X"d6", X"0e", |
X"f3", X"76", X"49", X"6e", X"76", X"61", X"6c", X"69", |
X"64", X"20", X"42", X"44", X"4f", X"53", X"20", X"66", |
X"75", X"6e", X"63", X"74", X"69", X"6f", X"6e", X"0d", |
X"0a", X"24", X"48", X"c3", X"e2", X"0e", X"1a", X"13", |
X"fe", X"24", X"c8", X"4f", X"cd", X"e2", X"0e", X"c3", |
X"d6", X"0e", X"db", X"81", X"e6", X"01", X"ca", X"e2", |
X"0e", X"79", X"d3", X"80", X"c9", X"00", X"00", X"00", |
X"00", X"00", X"00", X"00", X"00", X"77", X"07", X"30", |
X"96", X"ee", X"0e", X"61", X"2c", X"99", X"09", X"51", |
X"ba", X"07", X"6d", X"c4", X"19", X"70", X"6a", X"f4", |
X"8f", X"e9", X"63", X"a5", X"35", X"9e", X"64", X"95", |
X"a3", X"0e", X"db", X"88", X"32", X"79", X"dc", X"b8", |
X"a4", X"e0", X"d5", X"e9", X"1e", X"97", X"d2", X"d9", |
X"88", X"09", X"b6", X"4c", X"2b", X"7e", X"b1", X"7c", |
X"bd", X"e7", X"b8", X"2d", X"07", X"90", X"bf", X"1d", |
X"91", X"1d", X"b7", X"10", X"64", X"6a", X"b0", X"20", |
X"f2", X"f3", X"b9", X"71", X"48", X"84", X"be", X"41", |
X"de", X"1a", X"da", X"d4", X"7d", X"6d", X"dd", X"e4", |
X"eb", X"f4", X"d4", X"b5", X"51", X"83", X"d3", X"85", |
X"c7", X"13", X"6c", X"98", X"56", X"64", X"6b", X"a8", |
X"c0", X"fd", X"62", X"f9", X"7a", X"8a", X"65", X"c9", |
X"ec", X"14", X"01", X"5c", X"4f", X"63", X"06", X"6c", |
X"d9", X"fa", X"0f", X"3d", X"63", X"8d", X"08", X"0d", |
X"f5", X"3b", X"6e", X"20", X"c8", X"4c", X"69", X"10", |
X"5e", X"d5", X"60", X"41", X"e4", X"a2", X"67", X"71", |
X"72", X"3c", X"03", X"e4", X"d1", X"4b", X"04", X"d4", |
X"47", X"d2", X"0d", X"85", X"fd", X"a5", X"0a", X"b5", |
X"6b", X"35", X"b5", X"a8", X"fa", X"42", X"b2", X"98", |
X"6c", X"db", X"bb", X"c9", X"d6", X"ac", X"bc", X"f9", |
X"40", X"32", X"d8", X"6c", X"e3", X"45", X"df", X"5c", |
X"75", X"dc", X"d6", X"0d", X"cf", X"ab", X"d1", X"3d", |
X"59", X"26", X"d9", X"30", X"ac", X"51", X"de", X"00", |
X"3a", X"c8", X"d7", X"51", X"80", X"bf", X"d0", X"61", |
X"16", X"21", X"b4", X"f4", X"b5", X"56", X"b3", X"c4", |
X"23", X"cf", X"ba", X"95", X"99", X"b8", X"bd", X"a5", |
X"0f", X"28", X"02", X"b8", X"9e", X"5f", X"05", X"88", |
X"08", X"c6", X"0c", X"d9", X"b2", X"b1", X"0b", X"e9", |
X"24", X"2f", X"6f", X"7c", X"87", X"58", X"68", X"4c", |
X"11", X"c1", X"61", X"1d", X"ab", X"b6", X"66", X"2d", |
X"3d", X"76", X"dc", X"41", X"90", X"01", X"db", X"71", |
X"06", X"98", X"d2", X"20", X"bc", X"ef", X"d5", X"10", |
X"2a", X"71", X"b1", X"85", X"89", X"06", X"b6", X"b5", |
X"1f", X"9f", X"bf", X"e4", X"a5", X"e8", X"b8", X"d4", |
X"33", X"78", X"07", X"c9", X"a2", X"0f", X"00", X"f9", |
X"34", X"96", X"09", X"a8", X"8e", X"e1", X"0e", X"98", |
X"18", X"7f", X"6a", X"0d", X"bb", X"08", X"6d", X"3d", |
X"2d", X"91", X"64", X"6c", X"97", X"e6", X"63", X"5c", |
X"01", X"6b", X"6b", X"51", X"f4", X"1c", X"6c", X"61", |
X"62", X"85", X"65", X"30", X"d8", X"f2", X"62", X"00", |
X"4e", X"6c", X"06", X"95", X"ed", X"1b", X"01", X"a5", |
X"7b", X"82", X"08", X"f4", X"c1", X"f5", X"0f", X"c4", |
X"57", X"65", X"b0", X"d9", X"c6", X"12", X"b7", X"e9", |
X"50", X"8b", X"be", X"b8", X"ea", X"fc", X"b9", X"88", |
X"7c", X"62", X"dd", X"1d", X"df", X"15", X"da", X"2d", |
X"49", X"8c", X"d3", X"7c", X"f3", X"fb", X"d4", X"4c", |
X"65", X"4d", X"b2", X"61", X"58", X"3a", X"b5", X"51", |
X"ce", X"a3", X"bc", X"00", X"74", X"d4", X"bb", X"30", |
X"e2", X"4a", X"df", X"a5", X"41", X"3d", X"d8", X"95", |
X"d7", X"a4", X"d1", X"c4", X"6d", X"d3", X"d6", X"f4", |
X"fb", X"43", X"69", X"e9", X"6a", X"34", X"6e", X"d9", |
X"fc", X"ad", X"67", X"88", X"46", X"da", X"60", X"b8", |
X"d0", X"44", X"04", X"2d", X"73", X"33", X"03", X"1d", |
X"e5", X"aa", X"0a", X"4c", X"5f", X"dd", X"0d", X"7c", |
X"c9", X"50", X"05", X"71", X"3c", X"27", X"02", X"41", |
X"aa", X"be", X"0b", X"10", X"10", X"c9", X"0c", X"20", |
X"86", X"57", X"68", X"b5", X"25", X"20", X"6f", X"85", |
X"b3", X"b9", X"66", X"d4", X"09", X"ce", X"61", X"e4", |
X"9f", X"5e", X"de", X"f9", X"0e", X"29", X"d9", X"c9", |
X"98", X"b0", X"d0", X"98", X"22", X"c7", X"d7", X"a8", |
X"b4", X"59", X"b3", X"3d", X"17", X"2e", X"b4", X"0d", |
X"81", X"b7", X"bd", X"5c", X"3b", X"c0", X"ba", X"6c", |
X"ad", X"ed", X"b8", X"83", X"20", X"9a", X"bf", X"b3", |
X"b6", X"03", X"b6", X"e2", X"0c", X"74", X"b1", X"d2", |
X"9a", X"ea", X"d5", X"47", X"39", X"9d", X"d2", X"77", |
X"af", X"04", X"db", X"26", X"15", X"73", X"dc", X"16", |
X"83", X"e3", X"63", X"0b", X"12", X"94", X"64", X"3b", |
X"84", X"0d", X"6d", X"6a", X"3e", X"7a", X"6a", X"5a", |
X"a8", X"e4", X"0e", X"cf", X"0b", X"93", X"09", X"ff", |
X"9d", X"0a", X"00", X"ae", X"27", X"7d", X"07", X"9e", |
X"b1", X"f0", X"0f", X"93", X"44", X"87", X"08", X"a3", |
X"d2", X"1e", X"01", X"f2", X"68", X"69", X"06", X"c2", |
X"fe", X"f7", X"62", X"57", X"5d", X"80", X"65", X"67", |
X"cb", X"19", X"6c", X"36", X"71", X"6e", X"6b", X"06", |
X"e7", X"fe", X"d4", X"1b", X"76", X"89", X"d3", X"2b", |
X"e0", X"10", X"da", X"7a", X"5a", X"67", X"dd", X"4a", |
X"cc", X"f9", X"b9", X"df", X"6f", X"8e", X"be", X"ef", |
X"f9", X"17", X"b7", X"be", X"43", X"60", X"b0", X"8e", |
X"d5", X"d6", X"d6", X"a3", X"e8", X"a1", X"d1", X"93", |
X"7e", X"38", X"d8", X"c2", X"c4", X"4f", X"df", X"f2", |
X"52", X"d1", X"bb", X"67", X"f1", X"a6", X"bc", X"57", |
X"67", X"3f", X"b5", X"06", X"dd", X"48", X"b2", X"36", |
X"4b", X"d8", X"0d", X"2b", X"da", X"af", X"0a", X"1b", |
X"4c", X"36", X"03", X"4a", X"f6", X"41", X"04", X"7a", |
X"60", X"df", X"60", X"ef", X"c3", X"a8", X"67", X"df", |
X"55", X"31", X"6e", X"8e", X"ef", X"46", X"69", X"be", |
X"79", X"cb", X"61", X"b3", X"8c", X"bc", X"66", X"83", |
X"1a", X"25", X"6f", X"d2", X"a0", X"52", X"68", X"e2", |
X"36", X"cc", X"0c", X"77", X"95", X"bb", X"0b", X"47", |
X"03", X"22", X"02", X"16", X"b9", X"55", X"05", X"26", |
X"2f", X"c5", X"ba", X"3b", X"be", X"b2", X"bd", X"0b", |
X"28", X"2b", X"b4", X"5a", X"92", X"5c", X"b3", X"6a", |
X"04", X"c2", X"d7", X"ff", X"a7", X"b5", X"d0", X"cf", |
X"31", X"2c", X"d9", X"9e", X"8b", X"5b", X"de", X"ae", |
X"1d", X"9b", X"64", X"c2", X"b0", X"ec", X"63", X"f2", |
X"26", X"75", X"6a", X"a3", X"9c", X"02", X"6d", X"93", |
X"0a", X"9c", X"09", X"06", X"a9", X"eb", X"0e", X"36", |
X"3f", X"72", X"07", X"67", X"85", X"05", X"00", X"57", |
X"13", X"95", X"bf", X"4a", X"82", X"e2", X"b8", X"7a", |
X"14", X"7b", X"b1", X"2b", X"ae", X"0c", X"b6", X"1b", |
X"38", X"92", X"d2", X"8e", X"9b", X"e5", X"d5", X"be", |
X"0d", X"7c", X"dc", X"ef", X"b7", X"0b", X"db", X"df", |
X"21", X"86", X"d3", X"d2", X"d4", X"f1", X"d4", X"e2", |
X"42", X"68", X"dd", X"b3", X"f8", X"1f", X"da", X"83", |
X"6e", X"81", X"be", X"16", X"cd", X"f6", X"b9", X"26", |
X"5b", X"6f", X"b0", X"77", X"e1", X"18", X"b7", X"47", |
X"77", X"88", X"08", X"5a", X"e6", X"ff", X"0f", X"6a", |
X"70", X"66", X"06", X"3b", X"ca", X"11", X"01", X"0b", |
X"5c", X"8f", X"65", X"9e", X"ff", X"f8", X"62", X"ae", |
X"69", X"61", X"6b", X"ff", X"d3", X"16", X"6c", X"cf", |
X"45", X"a0", X"0a", X"e2", X"78", X"d7", X"0d", X"d2", |
X"ee", X"4e", X"04", X"83", X"54", X"39", X"03", X"b3", |
X"c2", X"a7", X"67", X"26", X"61", X"d0", X"60", X"16", |
X"f7", X"49", X"69", X"47", X"4d", X"3e", X"6e", X"77", |
X"db", X"ae", X"d1", X"6a", X"4a", X"d9", X"d6", X"5a", |
X"dc", X"40", X"df", X"0b", X"66", X"37", X"d8", X"3b", |
X"f0", X"a9", X"bc", X"ae", X"53", X"de", X"bb", X"9e", |
X"c5", X"47", X"b2", X"cf", X"7f", X"30", X"b5", X"ff", |
X"e9", X"bd", X"bd", X"f2", X"1c", X"ca", X"ba", X"c2", |
X"8a", X"53", X"b3", X"93", X"30", X"24", X"b4", X"a3", |
X"a6", X"ba", X"d0", X"36", X"05", X"cd", X"d7", X"06", |
X"93", X"54", X"de", X"57", X"29", X"23", X"d9", X"67", |
X"bf", X"b3", X"66", X"7a", X"2e", X"c4", X"61", X"4a", |
X"b8", X"5d", X"68", X"1b", X"02", X"2a", X"6f", X"2b", |
X"94", X"b4", X"0b", X"be", X"37", X"c3", X"0c", X"8e", |
X"a1", X"5a", X"05", X"df", X"1b", X"2d", X"02", X"ef", |
X"8d" |
); |
|
end package obj_code_pkg; |
/sw/demos/exer/8080EXER.MAC
0,0 → 1,1375
title 'Z80 instruction set exerciser' |
|
; zexlax.z80 - Z80 instruction set exerciser |
; Copyright (C) 1994 Frank D. Cringle |
; |
; 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 2 |
; 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, write to the Free Software |
; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
; |
;****************************************************************************** |
; |
; Modified to exercise an 8080 by Ian Bartholomew, February 2009 |
; |
; I have made the following changes - |
; |
; Converted all mnemonics to 8080 and rewritten any Z80 code used |
; in the original exerciser. Changes are tagged with a #idb in the |
; source code listing. |
; |
; Removed any test descriptors that are not used. |
; |
; Changed the macro definitions to work in M80 |
; |
; The machine state snapshot has been changed to remove the IX/IY registers. |
; They have been replaced by two more copies of HL to obviate the need |
; for major changes in the exerciser code. |
; |
; Changed flag mask in all tests to 0ffh to reflect that the 8080, unlike the 8085 |
; and Z80, does define the unused bits in the flag register - [S Z 0 AC 0 P 1 C] |
; |
;****************************************************************************** |
|
MASK_RX_IRQ equ 20h |
MASK_TX_IRQ equ 10h |
MASK_RX_RDY equ 02h |
MASK_TX_RDY equ 01h |
|
UART_DATA equ 80h |
UART_STATUS equ 81h |
UART_BAUDL equ 82h |
UART_BAUDH equ 83h |
IRQ_ENABLE equ 88h |
|
P1IN equ 84h |
P2OUT equ 86h |
|
|
|
.8080 |
aseg |
|
org 0H ; Reset entry point |
jmp 100h ; Jump to program start |
|
;***** Interrupt vectors in area 0008h-0038h ***************** |
org 5h ; BDOS entry point |
jmp bdos$entry |
|
org 0h+(1*8) ; interrupt vector 1 |
ei |
ret |
org 0h+(2*8) ; interrupt vector 2 |
ei |
ret |
org 0h+(3*8) ; interrupt vector 3 |
ei |
ret |
org 0h+(4*8) ; interrupt vector 4 |
ei |
ret |
org 0h+(5*8) ; interrupt vector 5 |
ei |
ret |
org 0h+(6*8) ; interrupt vector 6 |
ei |
ret |
org 0h+(7*8) ; interrupt vector 7 |
ei |
ret |
|
|
|
org 100h |
|
begin: jmp start |
|
; machine state before test (needs to be at predictably constant address) |
msbt: ds 14 |
spbt: ds 2 |
|
; For the purposes of this test program, the machine state consists of: |
; a 2 byte memory operand, followed by |
; the registers iy,ix,hl,de,bc,af,sp |
; for a total of 16 bytes. |
|
; The program tests instructions (or groups of similar instructions) |
; by cycling through a sequence of machine states, executing the test |
; instruction for each one and running a 32-bit crc over the resulting |
; machine states. At the end of the sequence the crc is compared to |
; an expected value that was found empirically on a real Z80. |
|
; A test case is defined by a descriptor which consists of: |
; a flag mask byte, |
; the base case, |
; the incement vector, |
; the shift vector, |
; the expected crc, |
; a short descriptive message. |
; |
; The flag mask byte is used to prevent undefined flag bits from |
; influencing the results. Documented flags are as per Mostek Z80 |
; Technical Manual. |
; |
; The next three parts of the descriptor are 20 byte vectors |
; corresponding to a 4 byte instruction and a 16 byte machine state. |
; The first part is the base case, which is the first test case of |
; the sequence. This base is then modified according to the next 2 |
; vectors. Each 1 bit in the increment vector specifies a bit to be |
; cycled in the form of a binary counter. For instance, if the byte |
; corresponding to the accumulator is set to 0ffh in the increment |
; vector, the test will be repeated for all 256 values of the |
; accumulator. Note that 1 bits don't have to be contiguous. The |
; number of test cases 'caused' by the increment vector is equal to |
; 2^(number of 1 bits). The shift vector is similar, but specifies a |
; set of bits in the test case that are to be successively inverted. |
; Thus the shift vector 'causes' a number of test cases equal to the |
; number of 1 bits in it. |
|
; The total number of test cases is the product of those caused by the |
; counter and shift vectors and can easily become unweildy. Each |
; individual test case can take a few milliseconds to execute, due to |
; the overhead of test setup and crc calculation, so test design is a |
; compromise between coverage and execution time. |
|
; This program is designed to detect differences between |
; implementations and is not ideal for diagnosing the causes of any |
; discrepancies. However, provided a reference implementation (or |
; real system) is available, a failing test case can be isolated by |
; hand using a binary search of the test space. |
|
|
start: ;lhld 6 |
lxi h,8000 |
sphl |
lxi d,msg1 |
mvi c,9 |
call bdos |
|
lxi h,tests ; first test case |
loop: mov a,m ; end of list ? |
inx h |
ora m |
jz done |
dcx h |
call stt |
jmp loop |
|
done: lxi d,msg2 |
mvi c,9 |
call bdos |
di |
hlt |
jmp 0 ; warm boot |
|
tests: |
dw add16 |
dw alu8i |
dw alu8r |
dw daa |
dw inca |
dw incb |
dw incbc |
dw incc |
dw incd |
dw incde |
dw ince |
dw inch |
dw inchl |
dw incl |
dw incm |
dw incsp |
dw ld162 |
dw ld166 |
dw ld16im |
dw ld8bd |
dw ld8im |
dw ld8rr |
dw lda |
dw rot8080 |
dw stabd |
dw 0 |
|
tstr macro insn,memop,hliy,hlix,hl,de,bc,flags,acc,sp |
local lab |
lab: db insn |
ds lab+4-$,0 |
dw memop,hliy,hlix,hl,de,bc |
db flags |
db acc |
dw sp |
if $-lab ne 20 |
error 'missing parameter' |
endif |
endm |
|
tmsg macro m |
local lab |
lab: db m |
if $ ge lab+30 |
error 'message too long' |
else |
ds lab+30-$,'.' |
endif |
db '$' |
endm |
|
; add hl,<bc,de,hl,sp> (19,456 cycles) |
add16: db 0ffh ; flag mask |
tstr 9,0c4a5h,0c4c7h,0d226h,0a050h,058eah,08566h,0c6h,0deh,09bc9h |
tstr 030h,0,0,0,0f821h,0,0,0,0,0 ; (512 cycles) |
tstr 0,0,0,0,-1,-1,-1,0d7h,0,-1 ; (38 cycles) |
db 014h,047h,04bh,0a6h ; expected crc |
tmsg 'dad <b,d,h,sp>' |
|
; aluop a,nn (28,672 cycles) |
alu8i: db 0ffh ; flag mask |
tstr 0c6h,09140h,07e3ch,07a67h,0df6dh,05b61h,00b29h,010h,066h,085b2h |
tstr 038h,0,0,0,0,0,0,0,-1,0 ; (2048 cycles) |
tstr <0,-1>,0,0,0,0,0,0,0d7h,0,0 ; (14 cycles) |
db 09eh,092h,02fh,09eh ; expected crc |
tmsg 'aluop nn' |
|
; aluop a,<b,c,d,e,h,l,(hl),a> (753,664 cycles) |
alu8r: db 0ffh ; flag mask |
tstr 080h,0c53eh,0573ah,04c4dh,msbt,0e309h,0a666h,0d0h,03bh,0adbbh |
tstr 03fh,0,0,0,0,0,0,0,-1,0 ; (16,384 cycles) |
tstr 0,0ffh,0,0,0,-1,-1,0d7h,0,0 ; (46 cycles) |
db 0cfh,076h,02ch,086h ; expected crc |
tmsg 'aluop <b,c,d,e,h,l,m,a>' |
|
; <daa,cpl,scf,ccf> |
daa: db 0ffh ; flag mask |
tstr 027h,02141h,009fah,01d60h,0a559h,08d5bh,09079h,004h,08eh,0299dh |
tstr 018h,0,0,0,0,0,0,0d7h,-1,0 ; (65,536 cycles) |
tstr 0,0,0,0,0,0,0,0,0,0 ; (1 cycle) |
db 0bbh,03fh,003h,00ch ; expected crc |
tmsg '<daa,cma,stc,cmc>' |
|
; <inc,dec> a (3072 cycles) |
inca: db 0ffh ; flag mask |
tstr 03ch,04adfh,0d5d8h,0e598h,08a2bh,0a7b0h,0431bh,044h,05ah,0d030h |
tstr 001h,0,0,0,0,0,0,0,-1,0 ; (512 cycles) |
tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) |
db 0adh,0b6h,046h,00eh ; expected crc |
tmsg '<inr,dcr> a' |
|
; <inc,dec> b (3072 cycles) |
incb: db 0ffh ; flag mask |
tstr 004h,0d623h,0432dh,07a61h,08180h,05a86h,01e85h,086h,058h,09bbbh |
tstr 001h,0,0,0,0,0,0ff00h,0,0,0 ; (512 cycles) |
tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) |
db 083h,0edh,013h,045h ; expected crc |
tmsg '<inr,dcr> b' |
|
; <inc,dec> bc (1536 cycles) |
incbc: db 0ffh ; flag mask |
tstr 003h,0cd97h,044abh,08dc9h,0e3e3h,011cch,0e8a4h,002h,049h,02a4dh |
tstr 008h,0,0,0,0,0,0f821h,0,0,0 ; (256 cycles) |
tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) |
db 0f7h,092h,087h,0cdh ; expected crc |
tmsg '<inx,dcx> b' |
|
; <inc,dec> c (3072 cycles) |
incc: db 0ffh ; flag mask |
tstr 00ch,0d789h,00935h,0055bh,09f85h,08b27h,0d208h,095h,005h,00660h |
tstr 001h,0,0,0,0,0,0ffh,0,0,0 ; (512 cycles) |
tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) |
db 0e5h,0f6h,072h,01bh ; expected crc |
tmsg '<inr,dcr> c' |
|
; <inc,dec> d (3072 cycles) |
incd: db 0ffh ; flag mask |
tstr 014h,0a0eah,05fbah,065fbh,0981ch,038cch,0debch,043h,05ch,003bdh |
tstr 001h,0,0,0,0,0ff00h,0,0,0,0 ; (512 cycles) |
tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) |
db 015h,0b5h,057h,09ah ; expected crc |
tmsg '<inr,dcr> d' |
|
; <inc,dec> de (1536 cycles) |
incde: db 0ffh ; flag mask |
tstr 013h,0342eh,0131dh,028c9h,00acah,09967h,03a2eh,092h,0f6h,09d54h |
tstr 008h,0,0,0,0,0f821h,0,0,0,0 ; (256 cycles) |
tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) |
db 07fh,04eh,025h,001h ; expected crc |
tmsg '<inx,dcx> d' |
|
; <inc,dec> e (3072 cycles) |
ince: db 0ffh ; flag mask |
tstr 01ch,0602fh,04c0dh,02402h,0e2f5h,0a0f4h,0a10ah,013h,032h,05925h |
tstr 001h,0,0,0,0,0ffh,0,0,0,0 ; (512 cycles) |
tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) |
db 0cfh,02ah,0b3h,096h ; expected crc |
tmsg '<inr,dcr> e' |
|
; <inc,dec> h (3072 cycles) |
inch: db 0ffh ; flag mask |
tstr 024h,01506h,0f2ebh,0e8ddh,0262bh,011a6h,0bc1ah,017h,006h,02818h |
tstr 001h,0,0,0,0ff00h,0,0,0,0,0 ; (512 cycles) |
tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) |
db 012h,0b2h,095h,02ch ; expected crc |
tmsg '<inr,dcr> h' |
|
; <inc,dec> hl (1536 cycles) |
inchl: db 0ffh ; flag mask |
tstr 023h,0c3f4h,007a5h,01b6dh,04f04h,0e2c2h,0822ah,057h,0e0h,0c3e1h |
tstr 008h,0,0,0,0f821h,0,0,0,0,0 ; (256 cycles) |
tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) |
db 09fh,02bh,023h,0c0h ; expected crc |
tmsg '<inx,dcx> h' |
|
; <inc,dec> l (3072 cycles) |
incl: db 0ffh ; flag mask |
tstr 02ch,08031h,0a520h,04356h,0b409h,0f4c1h,0dfa2h,0d1h,03ch,03ea2h |
tstr 001h,0,0,0,0ffh,0,0,0,0,0 ; (512 cycles) |
tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) |
db 0ffh,057h,0d3h,056h ; expected crc |
tmsg '<inr,dcr> l' |
|
; <inc,dec> (hl) (3072 cycles) |
incm: db 0ffh ; flag mask |
tstr 034h,0b856h,00c7ch,0e53eh,msbt,0877eh,0da58h,015h,05ch,01f37h |
tstr 001h,0ffh,0,0,0,0,0,0,0,0 ; (512 cycles) |
tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) |
db 092h,0e9h,063h,0bdh ; expected crc |
tmsg '<inr,dcr> m' |
|
; <inc,dec> sp (1536 cycles) |
incsp: db 0ffh ; flag mask |
tstr 033h,0346fh,0d482h,0d169h,0deb6h,0a494h,0f476h,053h,002h,0855bh |
tstr 008h,0,0,0,0,0,0,0,0,0f821h ; (256 cycles) |
tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) |
db 0d5h,070h,02fh,0abh ; expected crc |
tmsg '<inx,dcx> sp' |
|
; ld hl,(nnnn) (16 cycles) |
ld162: db 0ffh ; flag mask |
tstr <02ah,low msbt,high msbt>,09863h,07830h,02077h,0b1feh,0b9fah,0abb8h,004h,006h,06015h |
tstr 0,0,0,0,0,0,0,0,0,0 ; (1 cycle) |
tstr 0,-1,0,0,0,0,0,0,0,0 ; (16 cycles) |
db 0a9h,0c3h,0d5h,0cbh ; expected crc |
tmsg 'lhld nnnn' |
|
; ld (nnnn),hl (16 cycles) |
ld166: db 0ffh ; flag mask |
tstr <022h,low msbt,high msbt>,0d003h,07772h,07f53h,03f72h,064eah,0e180h,010h,02dh,035e9h |
tstr 0,0,0,0,0,0,0,0,0,0 ; (1 cycle) |
tstr 0,0,0,0,-1,0,0,0,0,0 ; (16 cycles) |
db 0e8h,086h,04fh,026h ; expected crc |
tmsg 'shld nnnn' |
|
; ld <bc,de,hl,sp>,nnnn (64 cycles) |
ld16im: db 0ffh ; flag mask |
tstr 1,05c1ch,02d46h,08eb9h,06078h,074b1h,0b30eh,046h,0d1h,030cch |
tstr 030h,0,0,0,0,0,0,0,0,0 ; (4 cycles) |
tstr <0,0ffh,0ffh>,0,0,0,0,0,0,0,0,0 ; (16 cycles) |
db 0fch,0f4h,06eh,012h ; expected crc |
tmsg 'lxi <b,d,h,sp>,nnnn' |
|
; ld a,<(bc),(de)> (44 cycles) |
ld8bd: db 0ffh ; flag mask |
tstr 00ah,0b3a8h,01d2ah,07f8eh,042ach,msbt,msbt,0c6h,0b1h,0ef8eh |
tstr 010h,0,0,0,0,0,0,0,0,0 ; (2 cycles) |
tstr 0,0ffh,0,0,0,0,0,0d7h,-1,0 ; (22 cycles) |
db 02bh,082h,01dh,05fh ; expected crc |
tmsg 'ldax <b,d>' |
|
; ld <b,c,d,e,h,l,(hl),a>,nn (64 cycles) |
ld8im: db 0ffh ; flag mask |
tstr 6,0c407h,0f49dh,0d13dh,00339h,0de89h,07455h,053h,0c0h,05509h |
tstr 038h,0,0,0,0,0,0,0,0,0 ; (8 cycles) |
tstr 0,0,0,0,0,0,0,0,-1,0 ; (8 cycles) |
db 0eah,0a7h,020h,044h ; expected crc |
tmsg 'mvi <b,c,d,e,h,l,m,a>,nn' |
|
; ld <b,c,d,e,h,l,a>,<b,c,d,e,h,l,a> (3456 cycles) |
ld8rr: db 0ffh ; flag mask |
tstr 040h,072a4h,0a024h,061ach,msbt,082c7h,0718fh,097h,08fh,0ef8eh |
tstr 03fh,0,0,0,0,0,0,0,0,0 ; (64 cycles) |
tstr 0,0ffh,0,0,0,-1,-1,0d7h,-1,0 ; (54 cycles) |
db 010h,0b5h,08ch,0eeh ; expected crc |
tmsg 'mov <bcdehla>,<bcdehla>' |
|
; ld a,(nnnn) / ld (nnnn),a (44 cycles) |
lda: db 0ffh ; flag mask |
tstr <032h,low msbt,high msbt>,0fd68h,0f4ech,044a0h,0b543h,00653h,0cdbah,0d2h,04fh,01fd8h |
tstr 008h,0,0,0,0,0,0,0,0,0 ; (2 cycle) |
tstr 0,0ffh,0,0,0,0,0,0d7h,-1,0 ; (22 cycles) |
db 0edh,057h,0afh,072h ; expected crc |
tmsg 'sta nnnn / lda nnnn' |
|
; <rlca,rrca,rla,rra> (6144 cycles) |
rot8080: db 0ffh ; flag mask |
tstr 7,0cb92h,06d43h,00a90h,0c284h,00c53h,0f50eh,091h,0ebh,040fch |
tstr 018h,0,0,0,0,0,0,0,-1,0 ; (1024 cycles) |
tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) |
db 0e0h,0d8h,092h,035h ; expected crc |
tmsg '<rlc,rrc,ral,rar>' |
|
; ld (<bc,de>),a (96 cycles) |
stabd: db 0ffh ; flag mask |
tstr 2,00c3bh,0b592h,06cffh,0959eh,msbt,msbt+1,0c1h,021h,0bde7h |
tstr 018h,0,0,0,0,0,0,0,0,0 ; (4 cycles) |
tstr 0,-1,0,0,0,0,0,0,-1,0 ; (24 cycles) |
db 02bh,004h,071h,0e9h ; expected crc |
tmsg 'stax <b,d>' |
|
; start test pointed to by (hl) |
stt: push h |
mov a,m ; get pointer to test |
inx h |
mov h,m |
mov l,a |
mov a,m ; flag mask |
sta flgmsk+1 |
inx h |
push h |
lxi d,20 |
dad d ; point to incmask |
lxi d,counter |
call initmask |
pop h |
push h |
lxi d,20+20 |
dad d ; point to scanmask |
lxi d,shifter |
call initmask |
lxi h,shifter |
mvi m,1 ; first bit |
pop h |
push h |
lxi d,iut ; copy initial instruction under test |
lxi b,4 |
|
;#idb ldir replaced with following code |
ldir1: mov a,m |
stax d |
inx h |
inx d |
dcx b |
mov a,b |
ora c |
jnz ldir1 |
;#idb |
|
lxi d,msbt ; copy initial machine state |
lxi b,16 |
|
;#idb ldir replaced with following code |
ldir2: mov a,m |
stax d |
inx h |
inx d |
dcx b |
mov a,b |
ora c |
jnz ldir2 |
;#idb |
|
lxi d,20+20+4 ; skip incmask, scanmask and expcrc |
dad d |
xchg |
mvi c,9 |
call bdos ; show test name |
call initcrc ; initialise crc |
; test loop |
tlp: lda iut |
cpi 076h ; pragmatically avoid halt intructions |
jz tlp2 |
ani 0dfh |
cpi 0ddh |
jnz tlp1 |
lda iut+1 |
cpi 076h |
tlp1: cnz test ; execute the test instruction |
tlp2: call count ; increment the counter |
cnz shift ; shift the scan bit |
pop h ; pointer to test case |
jz tlp3 ; done if shift returned NZ |
lxi d,20+20+20 |
dad d ; point to expected crc |
call cmpcrc |
lxi d,okmsg |
jz tlpok |
lxi d,ermsg1 |
mvi c,9 |
call bdos |
call phex8 |
lxi d,ermsg2 |
mvi c,9 |
call bdos |
lxi h,crcval |
call phex8 |
lxi d,crlf |
tlpok: mvi c,9 |
call bdos |
pop h |
inx h |
inx h |
ret |
|
tlp3: push h |
mvi a,1 ; initialise count and shift scanners |
sta cntbit |
sta shfbit |
lxi h,counter |
shld cntbyt |
lxi h,shifter |
shld shfbyt |
|
mvi b,4 ; bytes in iut field |
pop h ; pointer to test case |
push h |
lxi d,iut |
call setup ; setup iut |
mvi b,16 ; bytes in machine state |
lxi d,msbt |
call setup ; setup machine state |
jmp tlp |
|
; setup a field of the test case |
; b = number of bytes |
; hl = pointer to base case |
; de = destination |
setup: call subyte |
inx h |
dcr b |
jnz setup |
ret |
|
subyte: push b |
push d |
push h |
mov c,m ; get base byte |
lxi d,20 |
dad d ; point to incmask |
mov a,m |
cpi 0 |
jz subshf |
mvi b,8 ; 8 bits |
subclp: rrc |
push psw |
mvi a,0 |
cc nxtcbit ; get next counter bit if mask bit was set |
xra c ; flip bit if counter bit was set |
rrc |
mov c,a |
pop psw |
dcr b |
jnz subclp |
mvi b,8 |
subshf: lxi d,20 |
dad d ; point to shift mask |
mov a,m |
cpi 0 |
jz substr |
mvi b,8 ; 8 bits |
sbshf1: rrc |
push psw |
mvi a,0 |
cc nxtsbit ; get next shifter bit if mask bit was set |
xra c ; flip bit if shifter bit was set |
rrc |
mov c,a |
pop psw |
dcr b |
jnz sbshf1 |
substr: pop h |
pop d |
mov a,c |
stax d ; mangled byte to destination |
inx d |
pop b |
ret |
|
; get next counter bit in low bit of a |
cntbit: ds 1 |
cntbyt: ds 2 |
|
nxtcbit: push b |
push h |
lhld cntbyt |
mov b,m |
lxi h,cntbit |
mov a,m |
mov c,a |
rlc |
mov m,a |
cpi 1 |
jnz ncb1 |
lhld cntbyt |
inx h |
shld cntbyt |
ncb1: mov a,b |
ana c |
pop h |
pop b |
rz |
mvi a,1 |
ret |
|
; get next shifter bit in low bit of a |
shfbit: ds 1 |
shfbyt: ds 2 |
|
nxtsbit: push b |
push h |
lhld shfbyt |
mov b,m |
lxi h,shfbit |
mov a,m |
mov c,a |
rlc |
mov m,a |
cpi 1 |
jnz nsb1 |
lhld shfbyt |
inx h |
shld shfbyt |
nsb1: mov a,b |
ana c |
pop h |
pop b |
rz |
mvi a,1 |
ret |
|
|
; clear memory at hl, bc bytes |
clrmem: push psw |
push b |
push d |
push h |
mvi m,0 |
mov d,h |
mov e,l |
inx d |
dcx b |
|
;#idb ldir replaced with following code |
ldir3: mov a,m |
stax d |
inx h |
inx d |
dcx b |
mov a,b |
ora c |
jnz ldir3 |
;#idb |
|
pop h |
pop d |
pop b |
pop psw |
ret |
|
; initialise counter or shifter |
; de = pointer to work area for counter or shifter |
; hl = pointer to mask |
initmask: |
push d |
xchg |
lxi b,20+20 |
call clrmem ; clear work area |
xchg |
mvi b,20 ; byte counter |
mvi c,1 ; first bit |
mvi d,0 ; bit counter |
imlp: mov e,m |
imlp1: mov a,e |
ana c |
jz imlp2 |
inr d |
imlp2: mov a,c |
rlc |
mov c,a |
cpi 1 |
jnz imlp1 |
inx h |
dcr b |
jnz imlp |
; got number of 1-bits in mask in reg d |
mov a,d |
ani 0f8h |
rrc |
rrc |
rrc ; divide by 8 (get byte offset) |
mov l,a |
mvi h,0 |
mov a,d |
ani 7 ; bit offset |
inr a |
mov b,a |
mvi a,080h |
imlp3: rlc |
dcr b |
jnz imlp3 |
pop d |
dad d |
lxi d,20 |
dad d |
mov m,a |
ret |
|
; multi-byte counter |
count: push b |
push d |
push h |
lxi h,counter ; 20 byte counter starts here |
lxi d,20 ; somewhere in here is the stop bit |
xchg |
dad d |
xchg |
cntlp: inr m |
mov a,m |
cpi 0 |
jz cntlp1 ; overflow to next byte |
mov b,a |
ldax d |
ana b ; test for terminal value |
jz cntend |
mvi m,0 ; reset to zero |
cntend: pop b |
pop d |
pop h |
ret |
|
cntlp1: inx h |
inx d |
jmp cntlp |
|
|
; multi-byte shifter |
shift: push b |
push d |
push h |
lxi h,shifter ; 20 byte shift register starts here |
lxi d,20 ; somewhere in here is the stop bit |
xchg |
dad d |
xchg |
shflp: mov a,m |
ora a |
jz shflp1 |
mov b,a |
ldax d |
ana b |
jnz shlpe |
mov a,b |
rlc |
cpi 1 |
jnz shflp2 |
mvi m,0 |
inx h |
inx d |
shflp2: mov m,a |
xra a ; set Z |
shlpe: pop h |
pop d |
pop b |
ret |
shflp1: inx h |
inx d |
jmp shflp |
|
counter: ds 2*20 |
shifter: ds 2*20 |
|
; test harness |
test: push psw |
push b |
push d |
push h |
if 0 |
lxi d,crlf |
mvi c,9 |
call bdos |
lxi h,iut |
mvi b,4 |
call hexstr |
mvi e,' ' |
mvi c,2 |
call bdos |
mvi b,16 |
lxi h,msbt |
call hexstr |
endif |
di ; disable interrupts |
|
;#idb ld (spsav),sp replaced by following code |
;#idb All registers and flages are immediately overwritten so |
;#idb no need to preserve any state. |
lxi h,0 ; save stack pointer |
dad sp |
shld spsav |
;#idb |
|
lxi sp,msbt+2 ; point to test-case machine state |
|
;#idb pop iy |
;#idb pop ix both replaced by following code |
;#idb Just dummy out ix/iy with copies of hl |
pop h ; and load all regs |
pop h |
;#idb |
|
pop h |
pop d |
pop b |
pop psw |
|
;#idb ld sp,(spbt) replaced with the following code |
;#idb HL is copied/restored before/after load so no state changed |
shld temp |
lhld spbt |
sphl |
lhld temp |
;#idb |
|
iut: ds 4 ; max 4 byte instruction under test |
|
;#idb ld (spat),sp replaced with the following code |
;#idb Must be very careful to preserve registers and flag |
;#idb state resulting from the test. The temptation is to use the |
;#idb stack - but that doesn't work because of the way the app |
;#idb uses SP as a quick way of pointing to memory. |
;#idb Bit of a code smell, but I can't think of an easier way. |
shld temp |
lxi h,0 |
jc temp1 ;jump on the state of the C flag set in the test |
|
dad sp ;this code will clear the C flag (0 + nnnn = nc) |
jmp temp2 ;C flag is same state as before |
|
temp1: dad sp ;this code will clear the C flag (0 + nnnn = nc) |
stc ;C flage needs re-setting to preserve state |
|
temp2: shld spat |
lhld temp |
;#idb |
|
lxi sp,spat |
push psw ; save other registers |
push b |
push d |
push h |
|
;#idb push ix |
;#idb push iy both replaced by following code |
;#idb Must match change made to pops made before test |
push h |
push h |
;#idb |
|
;#idb ld sp,(spsav) replaced with following code |
;#idb No need to preserve state |
lhld spsav ; restore stack pointer |
sphl |
;#idb |
|
ei ; enable interrupts |
lhld msbt ; copy memory operand |
shld msat |
lxi h,flgsat ; flags after test |
mov a,m |
flgmsk: ani 0ffh ; mask-out irrelevant bits (self-modified code!) |
mov m,a |
mvi b,16 ; total of 16 bytes of state |
lxi d,msat |
lxi h,crcval |
tcrc: ldax d |
inx d |
call updcrc ; accumulate crc of this test case |
dcr b |
jnz tcrc |
if 0 |
mvi e,' ' |
mvi c,2 |
call bdos |
lxi h,crcval |
call phex8 |
lxi d,crlf |
mvi c,9 |
call bdos |
lxi h,msat |
mvi b,16 |
call hexstr |
lxi d,crlf |
mvi c,9 |
call bdos |
endif |
pop h |
pop d |
pop b |
pop psw |
ret |
|
;#idb Added to store HL state |
temp: ds 2 |
;#idb |
|
; machine state after test |
msat: ds 14 ; memop,iy,ix,hl,de,bc,af |
spat: ds 2 ; stack pointer after test |
flgsat equ spat-2 ; flags |
|
spsav: ds 2 ; saved stack pointer |
|
; display hex string (pointer in hl, byte count in b) |
hexstr: mov a,m |
call phex2 |
inx h |
dcr b |
jnz hexstr |
ret |
|
; display hex |
; display the big-endian 32-bit value pointed to by hl |
phex8: push psw |
push b |
push h |
mvi b,4 |
ph8lp: mov a,m |
call phex2 |
inx h |
dcr b |
jnz ph8lp |
pop h |
pop b |
pop psw |
ret |
|
; display byte in a |
phex2: push psw |
rrc |
rrc |
rrc |
rrc |
call phex1 |
pop psw |
; fall through |
|
; display low nibble in a |
phex1: push psw |
push b |
push d |
push h |
ani 0fh |
cpi 10 |
jc ph11 |
adi 'a'-'9'-1 |
ph11: adi '0' |
mov e,a |
mvi c,2 |
call bdos |
pop h |
pop d |
pop b |
pop psw |
ret |
|
bdos: push psw |
push b |
push d |
push h |
call 5 |
pop h |
pop d |
pop b |
pop psw |
ret |
|
msg1: db '8080 instruction exerciser',10,13,'$' |
msg2: db 'Tests complete',10,13,'$' |
okmsg: db ' OK',10,13,'$' |
ermsg1: db ' ERROR **** crc expected:$' |
ermsg2: db ' found:$' |
crlf: db 10,13,'$' |
|
; compare crc |
; hl points to value to compare to crcval |
cmpcrc: push b |
push d |
push h |
lxi d,crcval |
mvi b,4 |
cclp: ldax d |
cmp m |
jnz cce |
inx h |
inx d |
dcr b |
jnz cclp |
cce: pop h |
pop d |
pop b |
ret |
|
; 32-bit crc routine |
; entry: a contains next byte, hl points to crc |
; exit: crc updated |
updcrc: push psw |
push b |
push d |
push h |
push h |
lxi d,3 |
dad d ; point to low byte of old crc |
xra m ; xor with new byte |
mov l,a |
mvi h,0 |
dad h ; use result as index into table of 4 byte entries |
dad h |
xchg |
lxi h,crctab |
dad d ; point to selected entry in crctab |
xchg |
pop h |
lxi b,4 ; c = byte count, b = accumulator |
crclp: ldax d |
xra b |
mov b,m |
mov m,a |
inx d |
inx h |
dcr c |
jnz crclp |
if 0 |
lxi h,crcval |
call phex8 |
lxi d,crlf |
mvi c,9 |
call bdos |
endif |
pop h |
pop d |
pop b |
pop psw |
ret |
|
initcrc:push psw |
push b |
push h |
lxi h,crcval |
mvi a,0ffh |
mvi b,4 |
icrclp: mov m,a |
inx h |
dcr b |
jnz icrclp |
pop h |
pop b |
pop psw |
ret |
|
bdos$entry: |
mov b,a |
mov a,c |
cpi 9 |
jz print$string |
cpi 2 |
jz print$char |
lxi d,bdos$error |
call print$string |
di |
hlt |
bdos$error: db "Invalid BDOS function", 13, 10, '$' |
|
;print$char: print character in A to console. |
; |
print$char: |
mov c,b |
jmp print$char$c |
|
|
;print$string: print $-terminated string at DE. |
; |
print$string: |
ldax d |
inx d |
cpi '$' |
rz |
mov c,a |
call print$char$c |
jmp print$string |
|
print$char$c: |
in UART_STATUS |
ani MASK_TX_RDY |
jz print$char$c |
mov a,c |
out UART_DATA |
ret |
|
|
|
crcval: ds 4 |
|
crctab: db 000h,000h,000h,000h |
db 077h,007h,030h,096h |
db 0eeh,00eh,061h,02ch |
db 099h,009h,051h,0bah |
db 007h,06dh,0c4h,019h |
db 070h,06ah,0f4h,08fh |
db 0e9h,063h,0a5h,035h |
db 09eh,064h,095h,0a3h |
db 00eh,0dbh,088h,032h |
db 079h,0dch,0b8h,0a4h |
db 0e0h,0d5h,0e9h,01eh |
db 097h,0d2h,0d9h,088h |
db 009h,0b6h,04ch,02bh |
db 07eh,0b1h,07ch,0bdh |
db 0e7h,0b8h,02dh,007h |
db 090h,0bfh,01dh,091h |
db 01dh,0b7h,010h,064h |
db 06ah,0b0h,020h,0f2h |
db 0f3h,0b9h,071h,048h |
db 084h,0beh,041h,0deh |
db 01ah,0dah,0d4h,07dh |
db 06dh,0ddh,0e4h,0ebh |
db 0f4h,0d4h,0b5h,051h |
db 083h,0d3h,085h,0c7h |
db 013h,06ch,098h,056h |
db 064h,06bh,0a8h,0c0h |
db 0fdh,062h,0f9h,07ah |
db 08ah,065h,0c9h,0ech |
db 014h,001h,05ch,04fh |
db 063h,006h,06ch,0d9h |
db 0fah,00fh,03dh,063h |
db 08dh,008h,00dh,0f5h |
db 03bh,06eh,020h,0c8h |
db 04ch,069h,010h,05eh |
db 0d5h,060h,041h,0e4h |
db 0a2h,067h,071h,072h |
db 03ch,003h,0e4h,0d1h |
db 04bh,004h,0d4h,047h |
db 0d2h,00dh,085h,0fdh |
db 0a5h,00ah,0b5h,06bh |
db 035h,0b5h,0a8h,0fah |
db 042h,0b2h,098h,06ch |
db 0dbh,0bbh,0c9h,0d6h |
db 0ach,0bch,0f9h,040h |
db 032h,0d8h,06ch,0e3h |
db 045h,0dfh,05ch,075h |
db 0dch,0d6h,00dh,0cfh |
db 0abh,0d1h,03dh,059h |
db 026h,0d9h,030h,0ach |
db 051h,0deh,000h,03ah |
db 0c8h,0d7h,051h,080h |
db 0bfh,0d0h,061h,016h |
db 021h,0b4h,0f4h,0b5h |
db 056h,0b3h,0c4h,023h |
db 0cfh,0bah,095h,099h |
db 0b8h,0bdh,0a5h,00fh |
db 028h,002h,0b8h,09eh |
db 05fh,005h,088h,008h |
db 0c6h,00ch,0d9h,0b2h |
db 0b1h,00bh,0e9h,024h |
db 02fh,06fh,07ch,087h |
db 058h,068h,04ch,011h |
db 0c1h,061h,01dh,0abh |
db 0b6h,066h,02dh,03dh |
db 076h,0dch,041h,090h |
db 001h,0dbh,071h,006h |
db 098h,0d2h,020h,0bch |
db 0efh,0d5h,010h,02ah |
db 071h,0b1h,085h,089h |
db 006h,0b6h,0b5h,01fh |
db 09fh,0bfh,0e4h,0a5h |
db 0e8h,0b8h,0d4h,033h |
db 078h,007h,0c9h,0a2h |
db 00fh,000h,0f9h,034h |
db 096h,009h,0a8h,08eh |
db 0e1h,00eh,098h,018h |
db 07fh,06ah,00dh,0bbh |
db 008h,06dh,03dh,02dh |
db 091h,064h,06ch,097h |
db 0e6h,063h,05ch,001h |
db 06bh,06bh,051h,0f4h |
db 01ch,06ch,061h,062h |
db 085h,065h,030h,0d8h |
db 0f2h,062h,000h,04eh |
db 06ch,006h,095h,0edh |
db 01bh,001h,0a5h,07bh |
db 082h,008h,0f4h,0c1h |
db 0f5h,00fh,0c4h,057h |
db 065h,0b0h,0d9h,0c6h |
db 012h,0b7h,0e9h,050h |
db 08bh,0beh,0b8h,0eah |
db 0fch,0b9h,088h,07ch |
db 062h,0ddh,01dh,0dfh |
db 015h,0dah,02dh,049h |
db 08ch,0d3h,07ch,0f3h |
db 0fbh,0d4h,04ch,065h |
db 04dh,0b2h,061h,058h |
db 03ah,0b5h,051h,0ceh |
db 0a3h,0bch,000h,074h |
db 0d4h,0bbh,030h,0e2h |
db 04ah,0dfh,0a5h,041h |
db 03dh,0d8h,095h,0d7h |
db 0a4h,0d1h,0c4h,06dh |
db 0d3h,0d6h,0f4h,0fbh |
db 043h,069h,0e9h,06ah |
db 034h,06eh,0d9h,0fch |
db 0adh,067h,088h,046h |
db 0dah,060h,0b8h,0d0h |
db 044h,004h,02dh,073h |
db 033h,003h,01dh,0e5h |
db 0aah,00ah,04ch,05fh |
db 0ddh,00dh,07ch,0c9h |
db 050h,005h,071h,03ch |
db 027h,002h,041h,0aah |
db 0beh,00bh,010h,010h |
db 0c9h,00ch,020h,086h |
db 057h,068h,0b5h,025h |
db 020h,06fh,085h,0b3h |
db 0b9h,066h,0d4h,009h |
db 0ceh,061h,0e4h,09fh |
db 05eh,0deh,0f9h,00eh |
db 029h,0d9h,0c9h,098h |
db 0b0h,0d0h,098h,022h |
db 0c7h,0d7h,0a8h,0b4h |
db 059h,0b3h,03dh,017h |
db 02eh,0b4h,00dh,081h |
db 0b7h,0bdh,05ch,03bh |
db 0c0h,0bah,06ch,0adh |
db 0edh,0b8h,083h,020h |
db 09ah,0bfh,0b3h,0b6h |
db 003h,0b6h,0e2h,00ch |
db 074h,0b1h,0d2h,09ah |
db 0eah,0d5h,047h,039h |
db 09dh,0d2h,077h,0afh |
db 004h,0dbh,026h,015h |
db 073h,0dch,016h,083h |
db 0e3h,063h,00bh,012h |
db 094h,064h,03bh,084h |
db 00dh,06dh,06ah,03eh |
db 07ah,06ah,05ah,0a8h |
db 0e4h,00eh,0cfh,00bh |
db 093h,009h,0ffh,09dh |
db 00ah,000h,0aeh,027h |
db 07dh,007h,09eh,0b1h |
db 0f0h,00fh,093h,044h |
db 087h,008h,0a3h,0d2h |
db 01eh,001h,0f2h,068h |
db 069h,006h,0c2h,0feh |
db 0f7h,062h,057h,05dh |
db 080h,065h,067h,0cbh |
db 019h,06ch,036h,071h |
db 06eh,06bh,006h,0e7h |
db 0feh,0d4h,01bh,076h |
db 089h,0d3h,02bh,0e0h |
db 010h,0dah,07ah,05ah |
db 067h,0ddh,04ah,0cch |
db 0f9h,0b9h,0dfh,06fh |
db 08eh,0beh,0efh,0f9h |
db 017h,0b7h,0beh,043h |
db 060h,0b0h,08eh,0d5h |
db 0d6h,0d6h,0a3h,0e8h |
db 0a1h,0d1h,093h,07eh |
db 038h,0d8h,0c2h,0c4h |
db 04fh,0dfh,0f2h,052h |
db 0d1h,0bbh,067h,0f1h |
db 0a6h,0bch,057h,067h |
db 03fh,0b5h,006h,0ddh |
db 048h,0b2h,036h,04bh |
db 0d8h,00dh,02bh,0dah |
db 0afh,00ah,01bh,04ch |
db 036h,003h,04ah,0f6h |
db 041h,004h,07ah,060h |
db 0dfh,060h,0efh,0c3h |
db 0a8h,067h,0dfh,055h |
db 031h,06eh,08eh,0efh |
db 046h,069h,0beh,079h |
db 0cbh,061h,0b3h,08ch |
db 0bch,066h,083h,01ah |
db 025h,06fh,0d2h,0a0h |
db 052h,068h,0e2h,036h |
db 0cch,00ch,077h,095h |
db 0bbh,00bh,047h,003h |
db 022h,002h,016h,0b9h |
db 055h,005h,026h,02fh |
db 0c5h,0bah,03bh,0beh |
db 0b2h,0bdh,00bh,028h |
db 02bh,0b4h,05ah,092h |
db 05ch,0b3h,06ah,004h |
db 0c2h,0d7h,0ffh,0a7h |
db 0b5h,0d0h,0cfh,031h |
db 02ch,0d9h,09eh,08bh |
db 05bh,0deh,0aeh,01dh |
db 09bh,064h,0c2h,0b0h |
db 0ech,063h,0f2h,026h |
db 075h,06ah,0a3h,09ch |
db 002h,06dh,093h,00ah |
db 09ch,009h,006h,0a9h |
db 0ebh,00eh,036h,03fh |
db 072h,007h,067h,085h |
db 005h,000h,057h,013h |
db 095h,0bfh,04ah,082h |
db 0e2h,0b8h,07ah,014h |
db 07bh,0b1h,02bh,0aeh |
db 00ch,0b6h,01bh,038h |
db 092h,0d2h,08eh,09bh |
db 0e5h,0d5h,0beh,00dh |
db 07ch,0dch,0efh,0b7h |
db 00bh,0dbh,0dfh,021h |
db 086h,0d3h,0d2h,0d4h |
db 0f1h,0d4h,0e2h,042h |
db 068h,0ddh,0b3h,0f8h |
db 01fh,0dah,083h,06eh |
db 081h,0beh,016h,0cdh |
db 0f6h,0b9h,026h,05bh |
db 06fh,0b0h,077h,0e1h |
db 018h,0b7h,047h,077h |
db 088h,008h,05ah,0e6h |
db 0ffh,00fh,06ah,070h |
db 066h,006h,03bh,0cah |
db 011h,001h,00bh,05ch |
db 08fh,065h,09eh,0ffh |
db 0f8h,062h,0aeh,069h |
db 061h,06bh,0ffh,0d3h |
db 016h,06ch,0cfh,045h |
db 0a0h,00ah,0e2h,078h |
db 0d7h,00dh,0d2h,0eeh |
db 04eh,004h,083h,054h |
db 039h,003h,0b3h,0c2h |
db 0a7h,067h,026h,061h |
db 0d0h,060h,016h,0f7h |
db 049h,069h,047h,04dh |
db 03eh,06eh,077h,0dbh |
db 0aeh,0d1h,06ah,04ah |
db 0d9h,0d6h,05ah,0dch |
db 040h,0dfh,00bh,066h |
db 037h,0d8h,03bh,0f0h |
db 0a9h,0bch,0aeh,053h |
db 0deh,0bbh,09eh,0c5h |
db 047h,0b2h,0cfh,07fh |
db 030h,0b5h,0ffh,0e9h |
db 0bdh,0bdh,0f2h,01ch |
db 0cah,0bah,0c2h,08ah |
db 053h,0b3h,093h,030h |
db 024h,0b4h,0a3h,0a6h |
db 0bah,0d0h,036h,005h |
db 0cdh,0d7h,006h,093h |
db 054h,0deh,057h,029h |
db 023h,0d9h,067h,0bfh |
db 0b3h,066h,07ah,02eh |
db 0c4h,061h,04ah,0b8h |
db 05dh,068h,01bh,002h |
db 02ah,06fh,02bh,094h |
db 0b4h,00bh,0beh,037h |
db 0c3h,00ch,08eh,0a1h |
db 05ah,005h,0dfh,01bh |
db 02dh,002h,0efh,08dh |
|
end |
/sw/demos/exer/build.bat
0,0 → 1,13
@rem Build script for the SoC basic demo 'hello'. |
|
@rem Set the program name. |
@set PROG=8080exer |
|
@rem Build vhdl test bench file with object code embedded into it. |
python ..\..\..\tools\obj2hdl\src\obj2hdl.py ^ |
-f %PROG%.hex ^ |
-c obj_code ^ |
--package obj_code_pkg ^ |
--output obj_code_pkg.vhdl |
:done |
|
/sw/demos/exer/8080EXER.HEX
0,0 → 1,153
:20000000C300010000C3A60EFBC9000000000000FBC9000000000000FBC900000000000059 |
:20002000FBC9000000000000FBC9000000000000FBC9000000000000FBC9000000000000B0 |
:200040000000000000000000000000000000000000000000000000000000000000000000A0 |
:20006000000000000000000000000000000000000000000000000000000000000000000080 |
:20008000000000000000000000000000000000000000000000000000000000000000000060 |
:2000A000000000000000000000000000000000000000000000000000000000000000000040 |
:2000C000000000000000000000000000000000000000000000000000000000000000000020 |
:2000E000000000000000000000000000000000000000000000000000000000000000000000 |
:20010000C313010000000000000000000000000000000021401FF911F80D0E09CDEC0D217B |
:200120003C017E23B6CA2F012BCDD00AC3220111150E0E09CDEC0DF376C300007001D001FA |
:2001400030029002F0025003B00310047004D00430059005F0055006B00610077007D00757 |
:2001600030089008F0085009B009100A700A0000FF09000000A5C4C7C426D250A0EA586685 |
:2001800085C6DEC99B3000000000000000000021F800000000000000000000000000000089 |
:2001A000000000FFFFFFFFFFFFD700FFFF14474BA6646164203C622C642C682C73703E2E9E |
:2001C0002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24FFC600000040913C7E677A6DDF615B29E7 |
:2001E0000B1066B2853800000000000000000000000000000000FF000000FF000000000011 |
:20020000000000000000000000D70000009E922F9E616C756F70206E6E2E2E2E2E2E2E2EAB |
:200220002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF800000003EC53A574D4C030109E366E6 |
:20024000A6D03BBBAD3F00000000000000000000000000000000FF000000000000FF000048 |
:200260000000000000FFFFFFFFD7000000CF762C86616C756F70203C622C632C642C652CF9 |
:20028000682C6C2C6D2C613E2E2E2E2E2E2E2E24FF270000004121FA09601D59A55B8D792D |
:2002A00090048E9D2918000000000000000000000000000000D7FF00000000000000000068 |
:2002C00000000000000000000000000000BB3F030C3C6461612C636D612C7374632C636DE4 |
:2002E000633E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF3C000000DF4AD8D598E52B8AB0A71B2E |
:2003000043445A30D00100000000000000000000000000000000FF000000000000000000FC |
:20032000000000000000000000D7000000ADB6460E3C696E722C6463723E20612E2E2E2ECE |
:200340002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF0400000023D62D43617A8081865A851A |
:200360001E8658BB9B010000000000000000000000000000FF00000000000000000000002B |
:20038000000000000000000000D700000083ED13453C696E722C6463723E20622E2E2E2E5C |
:2003A0002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF0300000097CDAB44C98DE3E3CC11A475 |
:2003C000E802494D2A080000000000000000000000000021F8000000000000000000000052 |
:2003E000000000000000000000D7000000F79287CD3C696E782C6463783E20622E2E2E2EDB |
:200400002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF0C00000089D735095B05859F278B081F |
:20042000D2950560060100000000000000000000000000FF000000000000000000000000EA |
:20044000000000000000000000D7000000E5F6721B3C696E722C6463723E20632E2E2E2EFA |
:200460002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF14000000EAA0BA5FFB651C98CC38BC1C |
:20048000DE435CBD0301000000000000000000000000FF000000000000000000000000001F |
:2004A000000000000000000000D700000015B5579A3C696E722C6463723E20642E2E2E2E46 |
:2004C0002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF130000002E341D13C928CA0A67992EAF |
:2004E0003A92F6549D08000000000000000000000021F80000000000000000000000000028 |
:20050000000000000000000000D70000007F4E25013C696E782C6463783E20642E2E2E2EA1 |
:200520002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF1C0000002F600D4C0224F5E2F4A00A47 |
:20054000A113322559010000000000000000000000FF000000000000000000000000000037 |
:20056000000000000000000000D7000000CF2AB3963C696E722C6463723E20652E2E2E2EFD |
:200580002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF240000000615EBF2DDE82B26A6111A83 |
:2005A000BC170618280100000000000000000000FF00000000000000000000000000000022 |
:2005C000000000000000000000D700000012B2952C3C696E722C6463723E20682E2E2E2E57 |
:2005E0002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF23000000F4C3A5076D1B044FC2E22AF7 |
:200600008257E0E1C30800000000000000000021F80000000000000000000000000000005C |
:20062000000000000000000000D70000009F2B23C03C696E782C6463783E20682E2E2E2EC2 |
:200640002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF2C000000318020A5564309B4C1F4A276 |
:20066000DFD13CA23E01000000000000000000FF00000000000000000000000000000000AE |
:20068000000000000000000000D7000000FF57D3563C696E722C6463723E206C2E2E2E2E98 |
:2006A0002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF3400000056B87C0C3EE503017E875817 |
:2006C000DA155C371F01000000FF0000000000000000000000000000000000000000000079 |
:2006E000000000000000000000D700000092E963BD3C696E722C6463723E206D2E2E2E2E1B |
:200700002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF330000006F3482D469D1B6DE94A4765C |
:20072000F453025B8508000000000000000000000000000000000021F8000000000000006F |
:20074000000000000000000000D7000000D5702FAB3C696E782C6463783E2073702E2E2EE2 |
:200760002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF2A030100639830787720FEB1FAB9B822 |
:20078000AB04061560000000000000000000000000000000000000000000000000FFFF0031 |
:2007A00000000000000000000000000000A9C3D5CB6C686C64206E6E6E6E2E2E2E2E2E2E9D |
:2007C0002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF2203010003D07277537F723FEA648011 |
:2007E000E1102DE935000000000000000000000000000000000000000000000000000000BD |
:20080000000000FFFF0000000000000000E8864F2673686C64206E6E6E6E2E2E2E2E2E2E60 |
:200820002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF010000001C5C462DB98E7860B1740EA5 |
:20084000B346D1CC30300000000000000000000000000000000000000000FFFF00000000A4 |
:2008600000000000000000000000000000FCF46E126C7869203C622C642C682C73703E2C60 |
:200880006E6E6E6E2E2E2E2E2E2E2E2E2E2E2E24FF0A000000A8B32A1D8E7FAC42030103D5 |
:2008A00001C6B18EEF100000000000000000000000000000000000000000000000FF000034 |
:2008C000000000000000000000D7FF00002B821D5F6C646178203C622C643E2E2E2E2E2EFE |
:2008E0002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF0600000007C49DF43DD1390389DE55BB |
:200900007453C00955380000000000000000000000000000000000000000000000000000BA |
:2009200000000000000000000000FF0000EAA720446D7669203C622C632C642C652C682C49 |
:200940006C2C6D2C613E2C6E6E2E2E2E2E2E2E24FF40000000A47224A0AC610301C7828F85 |
:2009600071978F8EEF3F0000000000000000000000000000000000000000000000FF000025 |
:200980000000000000FFFFFFFFD7FF000010B58CEE6D6F76203C62636465686C613E2C3C2F |
:2009A00062636465686C613E2E2E2E2E2E2E2E24FF3203010068FDECF4A04443B55306BA67 |
:2009C000CDD24FD81F080000000000000000000000000000000000000000000000FF00002B |
:2009E000000000000000000000D7FF0000ED57AF72737461206E6E6E6E202F206C646120DC |
:200A00006E6E6E6E2E2E2E2E2E2E2E2E2E2E2E24FF0700000092CB436D900A84C2530C0EA0 |
:200A2000F591EBFC401800000000000000000000000000000000FF000000000000000000F2 |
:200A4000000000000000000000D7000000E0D892353C726C632C7272632C72616C2C7261E6 |
:200A6000723E2E2E2E2E2E2E2E2E2E2E2E2E2E24FF020000003B0C92B5FF6C9E9503010417 |
:200A800001C121E7BD180000000000000000000000000000000000000000000000FFFF00B9 |
:200AA00000000000000000000000FF00002B0471E973746178203C622C643E2E2E2E2E2E7C |
:200AC0002E2E2E2E2E2E2E2E2E2E2E2E2E2E2E24E57E23666F7E32810D23E5111400191150 |
:200AE000E00CCD4F0CE1E51128001911080DCD4F0C21080D3601E1E5114F0D0104007E1247 |
:200B000023130B78B1C2FE0A1103010110007E1223130B78B1C20E0B112C0019EB0E09CD81 |
:200B2000EC0DCD920E3A4F0DFE76CA3C0BE6DFFEDDC2390B3A500DFE76C4300DCD8F0CC456 |
:200B4000B30CE1CA780B113C0019CD530E11260ECA6F0B112D0E0E09CDEC0DCDB70D114878 |
:200B60000E0E09CDEC0D21ED0ECDB70D11500E0E09CDEC0DE12323C9E53E0132EE0B32120E |
:200B80000C21E00C22EF0B21080D22130C0604E1E5114F0DCDA20B0610110301CDA20BC38A |
:200BA000250BCDAB0B2305C2A20BC9C5D5E54E111400197EFE00CACC0B06080FF53E00DCCE |
:200BC000F10BA90F4FF105C2BB0B0608111400197EFE00CAE70B06080FF53E00DC150CA91A |
:200BE0000F4FF105C2D80BE1D1791213C1C9000000C5E52AEF0B4621EE0B7E4F0777FE01AA |
:200C0000C20A0C2AEF0B2322EF0B78A1E1C1C83E01C9000000C5E52A130C4621120C7E4FC9 |
:200C20000777FE01C22E0C2A130C2322130C78A1E1C1C83E01C9F5C5D5E53600545D130B8A |
:200C40007E1223130B78B1C2400CE1D1C1F1C9D5EB012800CD360CEB06140E0116005E7B64 |
:200C6000A1CA650C1479074FFE01C25F0C2305C25E0C7AE6F80F0F0F6F26007AE6073C4731 |
:200C80003E800705C2820CD1191114001977C9C5D5E521E00C111400EB19EB347EFE00CAB8 |
:200CA000AE0C471AA0CAAA0C3600C1D1E1C92313C39B0CC5D5E521080D111400EB19EB7EA0 |
:200CC000B7CADB0C471AA0C2D70C7807FE01C2D50C3600231377AFE1D1C1C92313C3BF0C53 |
:200CE0000000000000000000000000000000000000000000000000000000000000000000F4 |
:200D00000000000000000000000000000000000000000000000000000000000000000000D3 |
:200D200000000000000000000000000000000000F5C5D5E5F32100003922AB0D310501E100 |
:200D4000E1E1D1C1F122990D2A1101F92A990D0000000022990D210000DA600D39C3620DE6 |
:200D6000393722A90D2A990D31A90DF5C5D5E5E5E52AAB0DF9FB2A0301229B0D21A70D7E15 |
:200D8000E6FF770610119B0D21ED0E1A13CD6A0E05C28B0DE1D1C1F1C9000000000000000E |
:200DA000000000000000000000000000007ECDC90D2305C2AD0DC9F5C5E506047ECDC90DDB |
:200DC0002305C2BC0DE1C1F1C9F50F0F0F0FCDD20DF1F5C5D5E5E60FFE0ADADF0DC627C64C |
:200DE000305F0E02CDEC0DE1D1C1F1C9F5C5D5E5CD0500E1D1C1F1C93830383020696E73B4 |
:200E00007472756374696F6E206578657263697365720A0D24546573747320636F6D706CE7 |
:200E20006574650A0D2420204F4B0A0D2420204552524F52202A2A2A2A206372632065783D |
:200E40007065637465643A2420666F756E643A240A0D24C5D5E511ED0E06041ABEC2660E47 |
:200E6000231305C25B0EE1D1C1C9F5C5D5E5E511030019AE6F26002929EB21F10E19EBE1C5 |
:200E80000104001AA8467713230DC2830EE1D1C1F1C9F5C5E521ED0E3EFF0604772305C2A8 |
:200EA0009C0EE1C1F1C94779FE09CAD60EFE02CAD20E11BA0ECDD60EF376496E76616C69B7 |
:200EC000642042444F532066756E6374696F6E0D0A2448C3E20E1A13FE24C84FCDE20EC3C4 |
:200EE000D60EDB81E601CAE20E79D380C9000000000000000077073096EE0E612C990951BC |
:200F0000BA076DC419706AF48FE963A5359E6495A30EDB883279DCB8A4E0D5E91E97D2D9B7 |
:200F20008809B64C2B7EB17CBDE7B82D0790BF1D911DB710646AB020F2F3B9714884BE415F |
:200F4000DE1ADAD47D6DDDE4EBF4D4B55183D385C7136C9856646BA8C0FD62F97A8A65C9B7 |
:200F6000EC14015C4F63066CD9FA0F3D638D080DF53B6E20C84C69105ED56041E4A267714F |
:200F8000723C03E4D14B04D447D20D85FDA50AB56B35B5A8FA42B2986CDBBBC9D6ACBCF937 |
:200FA0004032D86CE345DF5C75DCD60DCFABD13D5926D930AC51DE003AC8D75180BFD0615F |
:200FC0001621B4F4B556B3C423CFBA9599B8BDA50F2802B89E5F058808C60CD9B2B10BE937 |
:200FE000242F6F7C8758684C11C1611DABB6662D3D76DC419001DB710698D220BCEFD5100F |
:201000002A71B1858906B6B51F9FBFE4A5E8B8D4337807C9A20F00F9349609A88EE10E98D6 |
:20102000187F6A0DBB086D3D2D91646C97E6635C016B6B51F41C6C6162856530D8F26200BE |
:201040004E6C0695ED1B01A57B8208F4C1F50FC45765B0D9C612B7E9508BBEB8EAFCB988D6 |
:201060007C62DD1DDF15DA2D498CD37CF3FBD44C654DB261583AB551CEA3BC0074D4BB30AE |
:20108000E24ADFA5413DD895D7A4D1C46DD3D6F4FB4369E96A346ED9FCAD678846DA60B856 |
:2010A000D044042D7333031DE5AA0A4C5FDD0D7CC95005713C270241AABE0B1010C90C20BE |
:2010C000865768B525206F85B3B966D409CE61E49F5EDEF90E29D9C998B0D09822C7D7A856 |
:2010E000B459B33D172EB40D81B7BD5C3BC0BA6CADEDB883209ABFB3B603B6E20C74B1D226 |
:201100009AEAD547399DD277AF04DB261573DC1683E3630B1294643B840D6D6A3E7A6A5AE5 |
:20112000A8E40ECF0B9309FF9D0A00AE277D079EB1F00F93448708A3D21E01F2686906C2CD |
:20114000FEF762575D806567CB196C36716E6B06E7FED41B7689D32BE010DA7A5A67DD4A65 |
:20116000CCF9B9DF6F8EBEEFF917B7BE4360B08ED5D6D6A3E8A1D1937E38D8C2C44FDFF2BD |
:2011800052D1BB67F1A6BC57673FB506DD48B2364BD80D2BDAAF0A1B4C36034AF641047A65 |
:2011A00060DF60EFC3A867DF55316E8EEF4669BE79CB61B38CBC66831A256FD2A05268E2CD |
:2011C00036CC0C7795BB0B4703220216B95505262FC5BA3BBEB2BD0B282BB45A925CB36AE5 |
:2011E00004C2D7FFA7B5D0CF312CD99E8B5BDEAE1D9B64C2B0EC63F226756AA39C026D93FD |
:201200000A9C0906A9EB0E363F720767850500571395BF4A82E2B87A147BB12BAE0CB61B04 |
:201220003892D28E9BE5D5BE0D7CDCEFB70BDBDF2186D3D2D4F1D4E24268DDB3F81FDA832C |
:201240006E81BE16CDF6B9265B6FB077E118B7477788085AE6FF0F6A7066063BCA11010B84 |
:201260005C8F659EFFF862AE69616BFFD3166CCF45A00AE278D70DD2EE4E0483543903B31C |
:20128000C2A7672661D06016F74969474D3E6E77DBAED16A4AD9D65ADC40DF0B6637D83B84 |
:2012A000F0A9BCAE53DEBB9EC547B2CF7F30B5FFE9BDBDF21CCABAC28A53B3933024B4A32C |
:2012C000A6BAD03605CDD7069354DE572923D967BFB3667A2EC4614AB85D681B022A6F2B04 |
:1112E00094B40BBE37C30C8EA15A05DF1B2D02EF8DB3 |
:00000001FF |
/sw/demos/exer/MAC.SUB
0,0 → 1,5
; read and compile an assembler program |
A:R $1.MAC |
A:M80 =$1/M/L |
A:L80 $1,$1/N/X/E |
ERA $1.REL |
/sw/demos/exer/readme.txt
0,0 → 1,69
|
8080EXER is an instruction exerciser that runs all the 8080 opcodes with a large |
number of parameter combinations. The program computes a CRC value for the CPU |
state after testing each block of CPU opcodes. that CRC value is then compared |
against the CRC value produced by an original, silicon i8080. |
If the CRC values match, it can safely be assumed that the core and the original |
8080 behavior is identical. |
|
The program was taken from this web: |
|
http://www.idb.me.uk/sunhillow/8080.html |
|
Here you can find a more detailed explaination. |
|
I have made the following modifications to the original 8080EXEC: |
|
- Added code that emulates a few CP/M BDOS functions needed to output text. |
- Adapted the code to work on the C2SB demo board within the l80soc module. |
- Added the original Intel CRC values for comparison. |
|
The source code is in a format compatible to CP/M M80 assembler and incompatible |
to TASM, AS80 and all other Windows and Linux 8080-compatible assemblers that |
I know about. Therefore it can only be compiled from within CP/M. You can use |
SIMH for that. I will not include instructions but you can find plenty in SIMH |
web site. |
|
File 'MAC.SUB' is a CP/M 'batch' file that you can use to assemble the source |
with: |
DO MAC 8080EXER |
|
I hope this saves you the trouble to find and read M80 documentation... |
|
At any rate, i have included the compiled HEX file so all you have to do is |
run the build.bat script. Or just use the pre-built obj_code_pkg.vhdl included. |
|
Synthesis instructions: |
======================= |
|
Assuming you are using Quartus-2 and targetting a Terasic DE-1 dev board (for |
which the demo is tailored), you need to follow these steps: |
|
1.- Create a new project for the DE-1 board, (device EP2C20F484C7, etc.). |
2.- Add the following vhdl files to the project: |
-# /vhdl/light8080.vhdl |
-# /vhdl/demos/c2sb/c2sb_soc.vhdl |
-# /vhdl/soc/*.vhdl |
3.- Select file c2sb_soc.vhdl as 'top' entity. |
4.- Configure dual-purpose pin nCEO as regular i/o (Device settings->Device and |
pin options->Dual-purpose pins) |
5.- Import pin location constraints from file /vhdl/demos/c2sb/c2sb_pins.csv. |
|
That's all. Synthesize and have a terminal (19200/8/N/1) connected to the UART |
connector. Reset pin is button 1 (rightmost). |
|
|
Execution instructions: |
======================= |
|
You need to run this with a terminal connected to the SoC UART (19200/8/N/1). |
The tests will take quite a long time to run at 50MHz (about 11 minutes). |
All you have to do is watch the messages. |
|
In the present version of the core, all tests should succeed except for the |
special opcode block (<daa,cma,stc,cmc>): one of those instructions is |
incompatible to the original intel silicon. |
|
Note that ALL instructions have been tested for compatibility to the |
DOCUMENTATION. We're talking about replicating undocumented behavior here. |
|