Минимальная ассемблерная программа для CP/M 3.1 (z80)
Кажется, я проигрываю битву против своей глупости.
Этот сайт объясняет системные вызовы в различных версиях CP/M.
Однако, когда я пытаюсь использовать вызов 2 (C_WRITE, консольный вывод), ничего особенного не происходит.
У меня есть следующий код.
ORG 100h
LD E,'a'
LD C,2
CALL 5
CALL 0
Я повторяю это здесь по памяти. Если есть опечатки, будьте уверены, что они не были в оригинале, так как файл скомпилировался, и у меня был COM-файл для запуска.
Я думаю, что строки означают следующее:
- Убедитесь, что это загружается по адресу 100h (от 0h до FFh, это нулевая страница).
- Загрузите ASCII 'a' в регистр E для системного вызова 2.
- Загрузите целое число 2 в регистр C для системного вызова 2.
- Выполните системный вызов (JMP для системного вызова находится по адресу 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 виноват.
Картина, потому что это действительно произошло: