Тесты взяты тут. Спасибо begoon за вклад.
Тесты компилировались тут. Исходники компилятора лежат тут. Спасибо svofski за вклад.
Директивы ассемблера (не все работают в pretty-8080-assembler) описаны тут. Спасибо Автору за вклад.
За реализацией некоторых команд 8080 подглядывал:
- Тут - спасибо superzazu за вклад.
- Тут - спасибо vpyk за вклад. Отдельное спасибо за эмулятор - он очень помог, как в отладке тестов на эталонной машине так и в понимании работы процессора.
Список тестов и их исходных кодов:
-
src/main/resources/test/8080apofig- Программа выполняет операции, записывает результаты в память для проверки контрольных сумм и использует XOR SHIFT для рандомизации регистров, улучшая тестовое покрытие.
- Есть исходники.
- Отлажен на эмуляторе.
- Добавлен как интеграционный тест:
- тут
testLik_diagnostic_apofig8080exerciser(). - результаты
- тут
-
src/main/resources/test/8080ex1- The basic CPU Excerciser. This file is a copy of the vanilla file.
- Есть исходники.
- Отлажен на эмуляторе.
- Добавлен как интеграционный тест:
- тест
testLik_diagnostic_zexlax8080exerciser() - результаты
- тест
-
src/main/resources/test/8080exer- Vanilla basic CPU Excerciser having CRCs from the real KR580VM80A contributed by Alexander Timoshenko and Viacheslav Slavinsky.
- Есть исходники.
- Отлажен на эмуляторе.
- Добавлен как интеграционный тест.
-
src/main/resources/test/8080pre- 8080/8085 CPU Exerciser by Ian Bartholomew and Frank Cringles. The preliminary test.
- Есть исходники.
- Отлажен на эмуляторе.
- Добавлен как интеграционный тест:
- тест
testLik_diagnostic_exerciserPreliminary() - результаты
- тест
-
src/main/resources/test/8085exer- Пока еще не изученный тест.
- Есть исходники.
- Отлажен на эмуляторе.
- Добавлен как интеграционный тест.
-
src/main/resources/test/cputest- Diagnostics II, version 1.2, CPU test by Supersoft Associates.
- Есть исходники.
- Отлажен на эмуляторе.
- Добавлен как интеграционный тест.
-
src/main/resources/test/hello-world- Тест выводящий надпись
HELLO WORLDна экран в ЛИКе. - Есть исходники.
- Отлажен на эмуляторе.
- Добавлен как интеграционный тест:
- тест
testLik_helloWorld() - результаты
- тест
- Тест выводящий надпись
-
- 8080/8085 CPU Diagnostic, version 1.0, by Microcosm Associates.
- Есть исходники.
- Отлажен на эмуляторе.
- Добавлен как интеграционный тест:
- тест
testLik_diagnostic_microcosm() - результаты
- тест
Алгоритм компиляции на стороннем компиляторе:
- На примере теста
src/main/resources/test/test - Копируем исходник сюда
- Кликаем в приложении на кнопку
BIN - Скаченный браузером файл с расширением
*.memкопируем в соответствующую тесту папкуsrc/main/resources/test/test.
Алгоритм компиляции на локальном компиляторе:
- В классе
Assemblerсоздаем тест:
public static void main(String[] args) throws IOException {
Assembler assembler = new Assembler();
String sourceCode =
";************************\n" +
"; Prints 'HELLO WORLD\\n'\n" +
";************************\n" +
"\n" +
" .project hello-world.mem\n" +
" .tape специалистъ-mon\n" +
" CPU 8080\n" +
" .ORG 00000h\n" +
"\n" +
"start: LXI H,hello\n" +
" CALL bdos\n" +
" JMP wboot ; exit\n" +
";\n" +
"hello: DB 00Dh, 00Ah, 'HELLO WORLD', 00Dh, 00Ah, '$'\n" +
";\n" +
"bdos EQU 0C037h ; PRINT CHAR PROCEDURE\n" +
"wboot: JMP 0C800h ; BACK TO SYSTEM\n" +
"end:";
// компилируем
Bites result = assembler.compile(sourceCode);
// скомпилированный код
byte[] bytes = result.byteArray();
// сохраняем в файл
FileUtils.writeByteArrayToFile(new File("target/program.mem"), bytes);
// дамп памяти
System.out.println(result);
// напечатает
// 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
// 0000: 21 09 00 CD 37 C0 C3 19 00 0D 0A 48 45 4C 4C 4F
// 0010: 20 57 4F 52 4C 44 0D 0A 24 C3 00 C8
}Запуск тестов:
- В классе
IntegrationTestсоздаем тест:
public class IntegrationTest extends AbstractTest {
@Test
public void testLik_diagnostic_microcosm() {
// given
Lik.loadRom(base, roms);
hard.loadData(CPU_TESTS_RESOURCES + "test/test.rks", Lik.NAME);
// выводим trace только в этом диапазоне
debug.enable(new Range(0x0000, 0x0100));
// не показываем в trace все что относится к выводу на экран
debug.showCallBellow(3);
// последняя команда программы перед выходом в монитор
cpu.modAdd(new StopWhen(0x0057));
// если хочется подебажить внутри
cpu.modAdd(new DebugWhen(0x0383, () ->
assertCpu("cpu_at_0x0383")));
// when
hard.reset();
hard.start();
// then
assertCpu();
assertTrace();
}
}- Запускаем его и смотрим результат выполнения в папке
test/resources/testLik_diagnostic_microcosm- там будет:trace.log- трассировка выполнения программы на определенном уровне вложенности.cpu.log- состояние процессора на момент окончания программы.end.png- скриншот окна эмулятора на момент окончания программы.
Отладка теста на Emu80:
- После запуска приложения и выбора платформы
ЛИК - Выбираем меню
File->Load->Open file... - Выбираем файл с тестом и нажимаем
Open - Выбираем меню
Platform->Debug(или нажимаемAlt-D) чтобы открыть debug окно - Кликаем дважды по адресу команды и выбираем
0000затемEnter - Кликаем дважды слева от адреса команды чтобы появился красный breakpoint кружок
- Выбираем меню
Debug->Run(или нажимаемF5) и ждем пока программа не остановится на breakpoint - Переключаемся в окно эмулятора и выполняем
Jа затемEnterчтобы запустить программу - Эмулятор автоматически остановится на breakpoint
- Исследуем состояние процессора и памяти, смотрим трассировку выполнения программы сравнивая
ее с трассировкой из теста в
trace.log
Зеркала репозиториев содержится в папке src/main/resources/test/arch
на случай потери доступа к оригинальным репозиториям.