Есть некоторая ирония в том, что в данном случае камнем преткновения стали мнемоники z80 в сочетании с sjasm
OutSymCrd: sub a,08h ;
в sjasm компилируется в две команды, первая из которых всегда обнуляет А.
Вид для печати
Есть некоторая ирония в том, что в данном случае камнем преткновения стали мнемоники z80 в сочетании с sjasm
OutSymCrd: sub a,08h ;
в sjasm компилируется в две команды, первая из которых всегда обнуляет А.
ivagor, вот это было внезапно!
- - - Добавлено - - -
Погоди, а разве не просто "SUB 08H" должно быть?
- - - Добавлено - - -Код:SUB (HL) 96 1 NOP 1
SUB (IX*) 96DD 3 NOP 1
SUB (IY*) 96FD 3 NOP 1
SUB A 97 1 NOP 1
SUB B 90 1 NOP 1
SUB C 91 1 NOP 1
SUB D 92 1 NOP 1
SUB E 93 1 NOP 1
SUB H 94 1 NOP 1
SUB L 95 1 NOP 1
SUB * D6 2 NOP 1
А иначе он делает похоже:
И первое действительно обнулит А (А-А=0). Медвежья услуга ассемблера.Код:SUB A
SUB 08H
В общем, для перегона я воспользовался табличкой вот с таким синтаксисом:
Это же касается и всего остального. Пофиксил и перезалил исходник. Сейчас всё работает как задумано!Код:SUB A,B
SUB A,C
SUB A,D
SUB A,E
SUB A,H
SUB A,L
SUB A,(HL)
SUB A,A
SUB A,d
Вот про преобразование мнемоник 8080->z80 мне было бы интересно посмотреть/послушать/почитать. Есть несколько конвертеров, но у каждого из них есть какие-то странности или ошибки, которые не позволяют мне нормально преобразовать большую программу. Собирался сделать подход к своему конвертеру, но так и не созрел.
Поделишься скриптом? Интересно было бы посмотреть.
Да там делиться-то особо нечем. Всё делается деревянно, "в лоб". Заготовка просто, которая ни регистр не учитывает, ни количество пробелов. Словарь, естественно, полностью заполнить нужно.
Код:filename = "BIOS.ASM"
file = open(filename, 'r')
conv_dict ={
".db": "db",
".include": "include",
"push h": "push hl",
"push b": "push bc",
"lxi h,": "ld hl,",
"dad sp": "add hl,sp",
}
text = ""
for line in file:
for key in conv_dict.keys():
line = line.replace(key, str(conv_dict[key]))
text += line
with open(filename + ".txt", "w") as f:
f.write(text)
CityAceE, ну вот, прикинь. А всё просто потому что у каждой мнемоники i8080 по сути есть автопроверка. Например, MOV это всегда 2 регистра, а MVI это регистр и число. Как когда-то в одном холиворном обсуждении этого на этом форуме кое-кто говорил: "это они сэкономили на программе ассемблера, заставляя программиста помнить!". Ну не знаю. Если программист говорит, что его надо заставлять, быть может это не его место в принципе? А автоконтроль лично мне позволял писать относительно большие программы в тетрадке, чтобы потом, дождавшись занятия на кружке, ввести её в комп и оно сразу заработало как надо, потому что читается программа вполне однозначно, в отличие от кучи одинаковых условных LD с разными операндами. Или вот, сквозь десятилетия, оно позволяет упростить скрипт преобразования условному CityAceE для конвертации на другой язык.
PS Скрипт преобразования на самом деле прост по алгоритму: достаточно сделать минимальный разбор каждой строки на 4 составляющие: МЕТКА + КОМАНДА + ОПЕРАНД + КОММЕНТАРИЙ. Просто меняешь потом связку КОМАНДА + ОПЕРАНД, если такие присутствуют, и собираешь строку обратно. И этому правилу будут соответствовать все строки текста ассемблерного текста.