Есть некоторая ирония в том, что в данном случае камнем преткновения стали мнемоники z80 в сочетании с sjasm
OutSymCrd: sub a,08h ;
в sjasm компилируется в две команды, первая из которых всегда обнуляет А.
Есть некоторая ирония в том, что в данном случае камнем преткновения стали мнемоники z80 в сочетании с sjasm
OutSymCrd: sub a,08h ;
в sjasm компилируется в две команды, первая из которых всегда обнуляет А.
CityAceE (11.01.2024), HardWareMan (11.01.2024), svofski (12.01.2024)
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
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)
С уважением, Станислав.
ivagor (12.01.2024)
CityAceE, ну вот, прикинь. А всё просто потому что у каждой мнемоники i8080 по сути есть автопроверка. Например, MOV это всегда 2 регистра, а MVI это регистр и число. Как когда-то в одном холиворном обсуждении этого на этом форуме кое-кто говорил: "это они сэкономили на программе ассемблера, заставляя программиста помнить!". Ну не знаю. Если программист говорит, что его надо заставлять, быть может это не его место в принципе? А автоконтроль лично мне позволял писать относительно большие программы в тетрадке, чтобы потом, дождавшись занятия на кружке, ввести её в комп и оно сразу заработало как надо, потому что читается программа вполне однозначно, в отличие от кучи одинаковых условных LD с разными операндами. Или вот, сквозь десятилетия, оно позволяет упростить скрипт преобразования условному CityAceE для конвертации на другой язык.
PS Скрипт преобразования на самом деле прост по алгоритму: достаточно сделать минимальный разбор каждой строки на 4 составляющие: МЕТКА + КОМАНДА + ОПЕРАНД + КОММЕНТАРИЙ. Просто меняешь потом связку КОМАНДА + ОПЕРАНД, если такие присутствуют, и собираешь строку обратно. И этому правилу будут соответствовать все строки текста ассемблерного текста.
Последний раз редактировалось HardWareMan; 12.01.2024 в 13:51.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)