Минимальная ассемблерная программа для CP/M 3.1 (z80)

Кажется, я проигрываю битву против своей глупости.

Этот сайт объясняет системные вызовы в различных версиях CP/M.

Однако, когда я пытаюсь использовать вызов 2 (C_WRITE, консольный вывод), ничего особенного не происходит.

У меня есть следующий код.

ORG 100h
LD E,'a'
LD C,2
CALL 5
CALL 0

Я повторяю это здесь по памяти. Если есть опечатки, будьте уверены, что они не были в оригинале, так как файл скомпилировался, и у меня был COM-файл для запуска.

Я думаю, что строки означают следующее:

  1. Убедитесь, что это загружается по адресу 100h (от 0h до FFh, это нулевая страница).
  2. Загрузите ASCII 'a' в регистр E для системного вызова 2.
  3. Загрузите целое число 2 в регистр C для системного вызова 2.
  4. Выполните системный вызов (JMP для системного вызова находится по адресу 5 на нулевой странице).
  5. Завершить программу (команда выхода находится по адресу 0 на нулевой странице).

Программа запускается и выходит без проблем. Если я удаляю последнюю команду, она зависает на компьютере (что, я думаю, также ожидается и показывает, что CALL 0 работает).

Тем не менее, он не печатает символ ASCII. (Но он выводит дополнительную новую строку, но система могла бы это сделать.)

Как я могу заставить свою программу CP / M делать то, что должен делать системный вызов? Что я делаю неправильно?

ОБНОВЛЕНИЕ: Проблема была в том, что все ассемблеры, которые я пробовал, ожидали определенного формата исходного файла. Этот файл работал с макросом Microsoft:

        .Z80
START:  LD      E,'a'
        LD      C,2
        CALL    5
        JP      0

Я думаю (я предполагаю), что asm.com (ассемблер DR) и m80.com (макроассемблер Microsoft) ожидают мнемонику Intel 8080 и должны быть уведомлены, когда они должны ожидать мнемонику z80, которая, очевидно, различна.

В любом случае, я приму ответ ниже, потому что он также правильный, поскольку предлагает просто написать само изображение, не беспокоясь об asm.com.

1 ответ

Решение

Очевидная возможность: ваш ассемблер воспринимает "a" как шестнадцатеричный, а не как символ ASCII? 0xa ASCII для новой строки. Может быть, попробуйте "g" или проверьте шестнадцатеричный дамп вашего ассемблера?

Кроме этого ваш код выглядит нормально, хотя RST 0 сэкономит несколько байтов.

РЕДАКТИРОВАТЬ:

Я вручную собрал ваш код для:

1e 61
0e 02 
cd 05 00
cd 00 00

Я сохранил это на диск как mytest.com. Затем я запустил этот эмулятор CP/M (предупреждение: это прямая ссылка на скачивание файла; эмулятор называется "Z80MU PROFESSIONAL" Z80 и CP/M 2.2 эмулятора Джоан Рифф и сам по себе более двадцати лет, так что не похоже, иметь веб-страницу) для DOS внутри DOSBox и запустил mytest.com. Он выводит букву "а". Так что либо ваша цепочка инструментов, либо ваш CP/M виноват.

Картина, потому что это действительно произошло:

Другие вопросы по тегам