Skip to content

Latest commit

 

History

History
184 lines (160 loc) · 11 KB

File metadata and controls

184 lines (160 loc) · 11 KB

Тесты взяты тут. Спасибо begoon за вклад.

Тесты компилировались тут. Исходники компилятора лежат тут. Спасибо svofski за вклад.

Директивы ассемблера (не все работают в pretty-8080-assembler) описаны тут. Спасибо Автору за вклад.

За реализацией некоторых команд 8080 подглядывал:

  • Тут - спасибо superzazu за вклад.
  • Тут - спасибо vpyk за вклад. Отдельное спасибо за эмулятор - он очень помог, как в отладке тестов на эталонной машине так и в понимании работы процессора.

Список тестов и их исходных кодов:

Алгоритм компиляции на стороннем компиляторе:

Алгоритм компиляции на локальном компиляторе:

  • В классе 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
    }

Запуск тестов:

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 на случай потери доступа к оригинальным репозиториям.