User Tag List

Страница 69 из 70 ПерваяПервая ... 656667686970 ПоследняяПоследняя
Показано с 681 по 690 из 699

Тема: SjASMPlus от z00m

  1. #681

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,213
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,643
    Поблагодарили
    572 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от b2m Посмотреть сообщение
    Определи имена регистров как числа от 0 до 7. Удобнее будет если B=0, C=1, и т.д., тогда их можно будет прямо к коду операции 8080 добавлять.
    Спасибо за подсказку. Работает, хотя наглядность, конечно, при сравнении пропала. Но для уже написанного особой разницы нет.
    С уважением, Станислав.

  2. #682

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,213
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,643
    Поблагодарили
    572 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Существует ли какой-нибудь метод, который позволяет автоматически развернуть все макросы, подставить все данные и удалить из несработавшие условия?

    Исходный макрос:

    Код:
    ; LD reg,(IX+d)
        macro    macro_ld_reg_ix_d reg, data, no_stack
        if reg != 0 ; A
        ld    (.tmp + 1), a
        endif
    
        if no_stack == 1 || reg == 5 || reg == 6    ; || H || L
            if reg != 5
                ld a, h
                ld    (TMP1 + 1), a
            endif
            if reg != 6
                ld    a, l
                ld    (TMP1), a
            endif
    
        else
            push    hl
        endif
    
        ld    hl, (rIX)
    
        if reg == 1 || reg == 2        ; B || C
            if no_stack == 1
                ld    a, d
                ld    (TMP2 + 1), a
                ld    a, e
                ld    (TMP2), a
            else
                push    de
            endif
        ld    de, data
        else
            if no_stack == 1
                ld    a, b
                ld    (TMP2 + 1), a
                ld    a, c
                ld    (TMP2), a
            else
                push    bc
            endif
        ld    bc, data
        endif
    
        if reg == 1 || reg == 2        ; B || C
            add    hl, de
        else
            add    hl, bc
        endif
    
        if reg == 1 || reg == 2        ; B || C
    
            if no_stack == 1
                ld    a, (TMP2 + 1)
                ld    d, a
                ld    a, (TMP2)
                ld    e, a
            else
                pop    de
            endif
        else
            if no_stack == 1
                ld    a, (TMP2 + 1)
                ld    b, a
                ld    a, (TMP2)
                ld    c, a
            else
                pop    bc
            endif
        endif
    
        ld  reg, (hl)
    
        if reg == 0    ; A
        ld    (.tmp + 1), a
        endif
    
        if no_stack == 1 || reg == 5 || reg == 6    ; || H || L 
            if reg != 5
                ld    a, (TMP1 + 1)
                ld    h, a
            endif
            if reg != 6
                ld    a, (TMP1)
                ld    l, a
            endif
        else
            pop    hl
        endif
    
    .tmp    ld    a, 0
        endm

    А нужно, чтобы он развернулся, подставились все необходимые значения и убрались все несработавшие условия. То есть, чтобы в итоге в тексте вместо

    macro_ld_reg_ix_d A,99-100,0

    нарисовалось такое:

    Код:
    ; macro_ld_reg_ix_d A,99-100,0
        push    hl
        ld    hl, (rIX)
        push    bc
        ld    bc, 99-100
        add    hl, bc
        pop    bc
        ld  a, (hl)
        pop    hl
    ;---------------------------------------
    С уважением, Станислав.

  3. #683

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,213
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,643
    Поблагодарили
    572 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В общем, отвечаю сам себе, вдруг ещё кому-нибудь пригодится.

    1. Создал листинг с помощью ключа --lst
    2. Загрузил его в Excel и там разбил на колонки.
    3. Удалил следующие строки, удовлетворяющие следующим условиям по двум колонкам:

    • Пустой код && >
    • Код ~ && >
    • Не пустой код && Пустой текст

    4. Скопировал колонку с текстом в редактор.

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

  4. #684

    Регистрация
    31.01.2007
    Адрес
    Москва
    Сообщений
    810
    Спасибо Благодарностей отдано 
    11
    Спасибо Благодарностей получено 
    77
    Поблагодарили
    59 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    а потом искать почему неправильно работает, а С то улетел

  5. #685

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,213
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,643
    Поблагодарили
    572 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я, естественно, сравнил получаемый бинарник до подобного преобразования и после него. Всё совпадает байт в байт.
    С уважением, Станислав.

  6. #686

    Регистрация
    31.01.2007
    Адрес
    Москва
    Сообщений
    810
    Спасибо Благодарностей отдано 
    11
    Спасибо Благодарностей получено 
    77
    Поблагодарили
    59 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я про то что комманда ld R,(ix+D) на афектит флаг С, а замена еще как, да и не только С. Не знаю как часто, но думаю подобные ситуации встречаются.

  7. #687

    Регистрация
    24.07.2018
    Адрес
    г. Москва
    Сообщений
    83
    Спасибо Благодарностей отдано 
    34
    Спасибо Благодарностей получено 
    49
    Поблагодарили
    34 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от CityAceE Посмотреть сообщение
    Ни одно из условий не выполнится. Я пробовал и кавычки и много чего ещё. Чаще всего получаю ошибку на отсутствующую метку.
    Не знаю, как вы кавычки пробовали. Вот я попробовал:

    Код:
    	macro instr reg1, reg2
    	 if reg1 == "A"
    	  DISPLAY "A"
    	  ; some code
    	 if reg2 == "H"
    	  DISPLAY "H"
    	  ; some code
    	 endm
    
    	instr "A", "C"
    Все нормально выполняется. Первое условие выполнилось, второе - нет, все корректно. Хотя я у этого кросс-ассемблера заметил какую-то лажу в приоритетах операций. Иногда довольно странные скобки приходится ставить.

    Код:
    SjASMPlus Z80 Cross-Assembler v1.21.0 (https://github.com/z00m128/sjasmplus)
    Pass 1 complete (0 errors)
    Pass 2 complete (0 errors)
    > A
    macro.asm(11): error: [IF] No ENDIF
    macro.asm(15): ^ emitted from here
    macro.asm(11): error: [IF] No ENDIF
    macro.asm(15): ^ emitted from here
    Pass 3 complete
    Errors: 2, warnings: 0, compiled: 23 lines, work time: 0.000 seconds
    Ну и да, у вас второй иф вложен в первый, ENDIFов нет.

    Или вы хотели в instr именно без кавычек писать имена регистров?
    Последний раз редактировалось cafedead; 03.07.2025 в 23:11.

  8. #688

    Регистрация
    10.01.2010
    Адрес
    Смоленская обл.
    Сообщений
    556
    Спасибо Благодарностей отдано 
    187
    Спасибо Благодарностей получено 
    197
    Поблагодарили
    100 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от cafedead Посмотреть сообщение
    Все нормально выполняется. Первое условие выполнилось, второе - нет, все корректно.
    Кавычки в параметрах макроса по лексике не подходили.

    Цитата Сообщение от cafedead Посмотреть сообщение
    Ну и да, у вас второй иф вложен в первый, ENDIFов нет.
    Видимо просто схематично изобразил условия, ENDIFы в ' ; some code'е спрятались ))

    - - - Добавлено - - -

    Цитата Сообщение от CityAceE Посмотреть сообщение
    Ни одно из условий не выполнится. Я пробовал и кавычки и много чего ещё. Чаще всего получаю ошибку на отсутствующую метку.
    Ну ещё, если не юзать метки, то можно через lua решить вопрос, но телодвижений больше ))

  9. #689

    Регистрация
    24.07.2018
    Адрес
    г. Москва
    Сообщений
    83
    Спасибо Благодарностей отдано 
    34
    Спасибо Благодарностей получено 
    49
    Поблагодарили
    34 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от CityAceE Посмотреть сообщение
    Существует ли какой-нибудь метод, который позволяет автоматически развернуть все макросы, подставить все данные и удалить из несработавшие условия?
    Если честно, вы немного... непонятно формулируете вопрос и свою задачу, мне она не очень понятна. Впечатление, что проблемы именно с формулированием.

    Вызов макроса формирует код. В теле макроса у вас выполняются или не выполняются отдельные условия, формируется код, размещенный в сработавших ветвях, код из несработавших ветвей не формируется. Что значит "метод, который позволяет автоматически развернуть все макросы, подставить все данные и удалить из несработавшие условия"? Откуда чего вы хотите удалить?! Я вас не понимать.

    Добавил:
    Код:
    	DEVICE ZXSPECTRUM48
    
    	ORG 32768
    
    A      EQU 0
    и в конце:

    Код:
    rIX DEFW 0
    (А почему я это должен писать?!)

    В итоге, все нормально скомпилировалось, ваш макрос при таком вызове macro_ld_reg_ix_d A,99-100,0 сформировал вот такой код:

    Код:
             PUSH HL
             LD HL,(#8012) ; это адрес вашей переменной rIX
             PUSH BC
             LD BC,#FFFF ; это ваша минус единица, 99-100=-1
             ADD HL,BC
             POP BC
             LD A,(HL)
             LD (#8011),A   ; это не то, что вы хотели, но таков ваш макрос:
                                        ;if reg == 0    ; A
                                        ;     ld    (.tmp + 1), a
                                        ;endif
                                    ; исправляйте его, если хотите что-то другое
             POP HL
             LD A,0    ; это тоже не то, что вам нужно, но... вы же это написали в макросе
    И что вы хотите? Поконкретнее плз. Потому что

    Цитата Сообщение от CityAceE Посмотреть сообщение
    А нужно, чтобы он развернулся, подставились все необходимые значения и убрались все несработавшие условия.
    именно это и произошло.

    - - - Добавлено - - -

    Цитата Сообщение от CityAceE Посмотреть сообщение
    Вот так работает, но в итоге имеем лишних 7 байт на константы. Причём в конец кода их перекинуть нельзя, так как они должны находится перед первым вызовом макроса.
    Какие константы? Это реальные байты. Я не понимаю, зачем использовать для этого реальные байты памяти... Есть переменные. Вон я пример привел с EQU, определил A. Можете теперь сравнивать с A, а не с нулем. Ну вообще конечно плохо пересекаться с именами регистров, но если очень уж хочется, то можно. Но зачем?!

    Ну и я просто не вполне понимаю задачу, которую вы делаете. Я так понял, вы хотите реализовать инструкцию работы с индексным регистром, обходясь регистрами HL и BC, этим обеспечив совместимость с другим процессором без поддержки таких инструкций. Вы хотите какие-то исходники преобразовать в такой вот измененный код, переассемблировать, что-то куда-то портировать? На какую машину? Что и откуда вам нужно удалить?!

    И да, вам очень правильно указали, что ADD влияет на флаги, в отличие от загрузки в память/из памяти по адресу из индексного регистра плюс-минус смещение, вам придется об этом позаботиться.

    Регистры и регистровые пары логичнее было бы нумеровать так, как они пронумерованы в опкодах, чтобы затем по возможности по приходящему значению вычислять нужный опкод, а не городить многоэтажные IFы.
    Последний раз редактировалось cafedead; 04.07.2025 в 02:21.

  10. #690

    Регистрация
    24.07.2018
    Адрес
    г. Москва
    Сообщений
    83
    Спасибо Благодарностей отдано 
    34
    Спасибо Благодарностей получено 
    49
    Поблагодарили
    34 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    Кавычки в параметрах макроса по лексике не подходили.
    Ну вот я как раз и говорю о том, что у автора вопроса проблемы с формулированием целей и задачи. Чтобы его понять, приходится какое-то время вникать в его макрос, пытаться понять, что он там настроил, да и вообще, что у него в голове за поток сознания, а не просто прочитать комментарий, написанный нормальным языком, мол стоит задача такая-то такая-то, проблема такая-то такая-то.

    Посмотрел, что там у Интела с макросами, попробовал написать так же и тут, и это почти заработало, но, поскольку таких имен ни переменных, ни лейблов не существует, там специальный синтаксис для получения значений для сравнения таких вот псевдопеременных из имен регистров, и специальная директива для получения типа входящей переменной, чего в sjasm вроде бы нет. Не помешало бы добавить. Я немного взломал систему, если можно так выразиться, получилось вот так:

    Код:
    	macro load8 l8, h8
    	 display $h8
    	 display $l8
    	 ld l8, h8
    	 endm
    
    	macro load16 l16, h16
    	 display $h16
    	 display $l16
             if $h16 == $AF
               display "h16=AF"
             endif
             if $l16 == $BC
               display "l16=BC"
             endif
    	 push h16
    	 pop l16
    	endm
    
    	load8 B,C
    
    	load16 DE,AF
    Это почти работает, что-то можно сравнивать, но, понятное дело, только с теми регистрами и регистровыми парами, которые умещаются в 16-чную систему счисления. HL, SP, IX, IY, штрихи всякие в пролете. Но это чисто поржать, я не рекомендую так это использовать, т.к. явно тут вылезли какие-то недоработки в компиляторе, которые нужно устранить.

    Ну не знаю, может Ped7g прокомментирует, может быть там есть возможности, о которых мы не знаем.

    Upd: Хотя вот так все работает:
    Код:
    B	 equ 0
    C	 equ 1
    D	 equ 2
    E	 equ 3
    H	 equ 4
    L	 equ 5
    A	 equ 7
    b	 equ 0
    c	 equ 1
    d	 equ 2
    e	 equ 3
    h	 equ 4
    l	 equ 5
    a	 equ 7
    BC	 equ 0
    DE	 equ 1
    HL	 equ 2
    SP	 equ 3
    AF	 equ 3
    bc	 equ 0
    de	 equ 1
    hl	 equ 2
    sp	 equ 3
    af	 equ 3
    
    	macro ld8 dst, src
    	 display "LD8"
    	 display src
    	 display dst
    	 if dst == H
    	  display "dst = reg H"
    	 endif
    	 ld dst,src
    	 ld a,b ; это проставит инструкцию с реальными регистрами A и B
    	endm
    
          	ld8 B,C
    	ld8 H,E
    Код:
    SjASMPlus Z80 Cross-Assembler v1.21.0 (https://github.com/z00m128/sjasmplus)
    Pass 1 complete (0 errors)
    Pass 2 complete (0 errors)
    > LD8
    > 0x0001
    > 0x0000
    > LD8
    > 0x0003
    > 0x0004
    > dst = reg H
    Pass 3 complete
    Errors: 0, warnings: 0, compiled: 208 lines, work time: 0.000 seconds
    И никаких костылей, или байтов в памяти.
    Последний раз редактировалось cafedead; 04.07.2025 в 17:08.

Страница 69 из 70 ПерваяПервая ... 656667686970 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. SjASMPlus Z80 кросс ассемблер
    от Aprisobal в разделе Программирование
    Ответов: 1663
    Последнее: 19.06.2021, 01:36
  2. Исходники TR-DOS для SjASMPlus
    от Keeper в разделе Программирование
    Ответов: 20
    Последнее: 11.02.2011, 11:57
  3. Запуск STS из .sna, сгенерированного sjasmplus.
    от siril в разделе Программирование
    Ответов: 7
    Последнее: 11.10.2010, 21:33
  4. Breakpoints в связке Sjasmplus+UnrealSpeccy
    от Kurles в разделе Программирование
    Ответов: 19
    Последнее: 26.01.2009, 12:36
  5. Disturbed COverMAnia ( music disk with z00m music collection)
    от kyv в разделе Музыка
    Ответов: 10
    Последнее: 27.03.2008, 10:01

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •