nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 26 Apr 2024 22:47



Reply to topic  [ 165 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6, 7 ... 11  Next
Дизассемблер Yozh 
Author Message
Senior
User avatar

Joined: 17 Jun 2014 04:29
Posts: 138
Location: 93.80.157.217
Reply with quote
я сделяль! 1021 байт.
используются грязные хаки -- строки disassm_reg8_8085 и disassm_reg16_8085 не должны пересекать 256-байтовую границу, но это не является проблемой. если в коде они попали на границу -- всегда можно перенести в другое место.
в исходнике я предусмотрел проверку на пересечение, используя директиву условия, но не в каждом компиляторе есть такие директивы, если нет, просто можно удалить из исходника проверку, а проверку осуществлять глазками.

на rk86.ru очень уж примитивный ассемблер, там не соберется.
я приаттачу скомпилированный RK-файл, чтобы его можно было загрузить на rk86.ru, код дизассма располагается с адреса 7000H, для вызова необходимо в регистры HL и DE загрузить адреса начала и конца блока соответственно и перейти по адресу 7000H.
для теста загрузите disassm.rk и просто наберите в Мониторе:
Code:
-->M
    0000 00 21
    0001 00 6C
    0002 00 F8
    0003 00 11
    0004 00 FF
    0005 00 F8
    0006 00 C3
    0007 00 00
    0008 00 70
    0000 00 .
-->G


также я добавил файл i8080.bin.rk для проверки дизассемблирования всех инструкций, включая инструкции 8085, он загружается по адресу 1000H.
чтобы его дизассемблировать надо в HL загрузить 1000H, в DE 1163H


Attachments:
File comment: исходник
disassm.v1.4.zip [3.7 KiB]
Downloaded 22 times
File comment: бинарник для теста дизассма, включая инструкции 8085
i8080.bin.zip [529 Bytes]
Downloaded 19 times
File comment: RK-файл дизассма
disassm.zip [1.06 KiB]
Downloaded 18 times

_________________
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой


Last edited by vital72 on 08 Feb 2024 15:03, edited 1 time in total.

08 Feb 2024 13:57
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22591
Location: Silicon Valley
Reply with quote
Крут :esurprised:

Damir wrote:
Надо бы ещё сделать, что бы можно было компилировать на RK86.ru
у меня что то не получается, ругается на макросы и много другого. Или может bin файл выложите?

Для простых ассемблеров можно взять обработанный напильником вариант

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

Damir wrote:
Может обьявить конкурс на программу Дизассемблер для Радио 86 РК - программистов здесь много, будет чем заняться, что пообсуждать ?

я тоже буду учавствовать.

Ну компактнее уже вряд ли получится :)

_________________
:dj: https://mastodon.social/@Shaos


08 Feb 2024 13:59
Profile WWW
Senior
User avatar

Joined: 17 Jun 2014 04:29
Posts: 138
Location: 93.80.157.217
Reply with quote
перезалил архив с исходником.
по коду ничего не поменялось абсолютно, изменил только именование макросов и некоторых меток.

_________________
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой


08 Feb 2024 15:04
Profile WWW
Senior
User avatar

Joined: 17 Jun 2014 04:29
Posts: 138
Location: 93.80.157.217
Reply with quote
дашоштакое.
тока зарелизю новую версию, как нахожу ещё возможность сократить код. щас получилось 1011

_________________
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой


08 Feb 2024 15:13
Profile WWW
Senior
User avatar

Joined: 17 Jun 2014 04:29
Posts: 138
Location: 93.80.157.217
Reply with quote
999


Attachments:
disassm.v1.5.zip [3.67 KiB]
Downloaded 20 times

_________________
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
08 Feb 2024 15:47
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22591
Location: Silicon Valley
Reply with quote
Хммм, а скорость не пострадала?…

_________________
:dj: https://mastodon.social/@Shaos


08 Feb 2024 16:28
Profile WWW
Senior
User avatar

Joined: 17 Jun 2014 04:29
Posts: 138
Location: 93.80.157.217
Reply with quote
нет, скорее наоборот.
множество джампов убрано, код удачно стыкуется друг с другом, как пазл.

_________________
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой


08 Feb 2024 16:38
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22591
Location: Silicon Valley
Reply with quote
Ну тогда наверное в ущерб скорости ещё можно размер ужать? :lol:
Можно сделать условную компиляцию - чтобы собирала типа самый быстрый вариант и с другим ключом самый компактный :oidea:
А ещё будет самый жырный вариант от меня - с "объяснялками" :idea:

P.S. Смотрю последние варианты - я в своих экспериментах над первой версией кода по похожему пути пошёл :)
Code:
CHBASE      EQU   '@'
PLUS16      EQU   8000h
LETTER4_X   EQU   10h
LETTER4_L   EQU   20h
LETTER4_H   EQU   30h
LETTER4_I   EQU   40h
LETTER4_D   EQU   50h
LETTER4_V   EQU   60h
LETTER4_G   EQU   70h
LETTER4_E   EQU   80h
LETTER4_B   EQU   90h

disasm_mnemo_8085:
;   db   "MOV ","MVI ","STAX","LDAX","STA ","LDA "
   dw   (('M'-CHBASE)+(('O'-CHBASE)*32)+(('V'-CHBASE)*1024))
   db   3
   dw   (('M'-CHBASE)+(('V'-CHBASE)*32)+(('I'-CHBASE)*1024)+PLUS16)
   db   1 ; 17
   dw   (('S'-CHBASE)+(('T'-CHBASE)*32)+(('A'-CHBASE)*1024))
   db   LETTER4_X+7
   dw   (('L'-CHBASE)+(('D'-CHBASE)*32)+(('A'-CHBASE)*1024))
   db   LETTER4_X+8
   dw   (('S'-CHBASE)+(('T'-CHBASE)*32)+(('A'-CHBASE)*1024))
   db   5
   dw   (('L'-CHBASE)+(('D'-CHBASE)*32)+(('A'-CHBASE)*1024))
   db   6

P.P.S. Это последний вариант или ещё будешь чего подчищать? ;)
Code:
disassm_disassm_str_8085_let4:
   db   "XXDDHGLLBLEIIVXXLL"
Я могу под pdp11asm85 опять напильником обработать чтобы без макросов стало :mrgreen:

P.P.P.S. А вот это никак нельзя упростить? Вроде как лишние 16 байт т.к один и тот же адрес повторяется 8 раз:
Code:
disassm_op:
        dw      disassm_op_none, disassm_op_r8, disassm_op_r16, disassm_op_im8
        dw      disassm_op_im16, disassm_op_r8_im8, disassm_op_r16_im16, disassm_op_n
        dw      disassm_op_b_r8, disassm_op_c_r8, disassm_op_d_r8, disassm_op_e_r8
        dw      disassm_op_h_r8, disassm_op_l_r8, disassm_op_m_r8, disassm_op_a_r8
...
disassm_op_b_r8:
disassm_op_c_r8:
disassm_op_d_r8:
disassm_op_e_r8:
disassm_op_h_r8:
disassm_op_l_r8:
disassm_op_m_r8:
disassm_op_a_r8:
        mov     a, c
        rrc
        rrc
        rrc
        rrc
        call    disassm_op_r8
        ...
типа вот тут проверить, что если код операнда 8,9,10,11,12,13,14 или 15, то сделать его 8
Code:
        mov     c, m            ;  operands
        mov     a, c
        ani     0F0h
; тут проверить если A>=80h, то сделать A=80h
        cpi 80h
        jc $+2
        mvi a,80h
; и далее как было
        rrc
        rrc
        rrc
        mov     e, a
        lxi     h, disassm_op
        dad     d
        ...
и укоротить табличку disassm_op на 14 байт:
Code:
disassm_op:
        dw      disassm_op_none, disassm_op_r8, disassm_op_r16, disassm_op_im8
        dw      disassm_op_im16, disassm_op_r8_im8, disassm_op_r16_im16, disassm_op_n
        dw      disassm_op_any_r8 ; фсё
что вместе с увеличением кода на 7 байт приведёт к экономии в 7 байт, что уже даст 992 байта вместо 999 :mrgreen:

Подумал было, что можно поправить коды :)
Code:
MNEMO_OP_NONE           EQU     0
MNEMO_OP_R8             EQU     1
MNEMO_OP_R16            EQU     2
MNEMO_OP_IM8            EQU     3
MNEMO_OP_IM16           EQU     4
MNEMO_OP_R8_IM8         EQU     5
MNEMO_OP_R16_IM16       EQU     6
MNEMO_OP_N              EQU     7
MNEMO_OP_B_R8           EQU     8
MNEMO_OP_C_R8           EQU     8 ; !!!
MNEMO_OP_D_R8           EQU     8 ; !!!
MNEMO_OP_E_R8           EQU     8 ; !!!
MNEMO_OP_H_R8           EQU     8 ; !!!
MNEMO_OP_L_R8           EQU     8 ; !!!
MNEMO_OP_M_R8           EQU     8 ; !!!
MNEMO_OP_A_R8           EQU     8 ; !!!
чтобы не потребовалось вставки лишней проверки, что сэкономит ещё 7 байт, однако потом увидел по программе, что этот же код потом нужен для вытаскивания имени регистра, ну значит проверка необходима, что возвращает нас обратно к 992 :rotate:

_________________
:dj: https://mastodon.social/@Shaos


08 Feb 2024 22:00
Profile WWW
Senior
User avatar

Joined: 17 Jun 2014 04:29
Posts: 138
Location: 93.80.157.217
Reply with quote
а ты говоришь, меньше не получицца, а оказывается там ещё много чего можно повыкидывать.
как ещё ужать, даже в ущерб скорости, пока не представляю.
почистил, соптимизировал, добавил проверку CTRL+C, нашёл один недочёт -- дизассемблировал блок на 1 байт меньше.
989 байт

ПЫСЫ: "disassm_disassm" не сразу заметил


Attachments:
disassm.v1.6.zip [3.7 KiB]
Downloaded 15 times

_________________
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой


Last edited by vital72 on 09 Feb 2024 00:30, edited 4 times in total.

09 Feb 2024 00:00
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22591
Location: Silicon Valley
Reply with quote
Нет предела совершенству :lol:

_________________
:dj: https://mastodon.social/@Shaos


09 Feb 2024 00:05
Profile WWW
Devil

Joined: 26 May 2003 06:57
Posts: 863
Reply with quote
Shaos wrote:
Обработал исходник напильником ...
Вот эту функцию ещё упростил, а то pdp11asm не понимает high/low - было:
Code:
disassm_get_reg8:
   push   h
   adi   low (disassm_reg8_8085)
   mov   l, a
   mvi   a, 0
   aci   high (disassm_reg8_8085)
   mov   h, a
   mov   a, m
   pop   h
   ret
стало:
Code:
disassm_get_reg8:
   push   h
   push   b
   lxi   h, disassm_reg8_8085
   mov   c, a
   mvi   b, 0
   dad   b
   mov   a, m
   pop   b
   pop   h
   ret

Без потерь в размере:
Code:
disassm_get_reg8:
   push   h
   lxi   h, disassm_reg8_8085
   add   l
   mov   l, a
   adc   h
   sub   l
   mov   h, a
   mov   a, m
   pop   h
   ret

_________________
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/


09 Feb 2024 00:50
Profile WWW
Senior
User avatar

Joined: 17 Jun 2014 04:29
Posts: 138
Location: 93.80.157.217
Reply with quote
b2m, о, круто!
но я там ещё упростил одновременно с требованием не пересекать границу 256 байт.
----
немного причесал код, удалил константы LET_A, LET_B и т.д., вместо них использую обычные литеры 'A', 'B', ... для повышения читабельности.
это потребовало изменение макроса disassm_str, я так планировал сделать изначально, но НЕ мой компилятор упорно не хотел выполнять битовые операции над литерами, но арифметические операции выполняет! от этого макрос выглядит немного некузяво. ещё раз убеждаюсь, что надо писать свой компилятор.
----
немного статистики и описание внутренностей, для тех кто заинтересуется.
-- таблица disassm_table_8085 занимает 512 байт и содержит описание каждой процессорной команды, два байта на команду:
биты 6..0 первого байта содержат индекс текстового представления команды.
бит 7 не используется, можно использовать на своё усмотрение.
биты 7..4 второго байта содержат описание операндов команды, всего 16 значений.
биты 2..0 второго байта могут содержать дополнительный аргумент операндов.
бит 3 не используется, можно использовать на своё усмотрение.
-- таблица disassm_str_8085 занимает 89 * 2 = 178 байт и содержит сжатое текстовое представление команды, по 16 бит на команду, это позволяет кодировать только 2-х и 3-х буквенные команды, для 4-х буквенных команд используется дополнительно таблица disassm_str_8085_let4.
биты 15..11 -- первая буква команды.
биты 10..6 -- вторая буква команды.
биты 5..1 -- третья буква команды.
бит 0 -- признак 4-х буквенной команды.
таблица disassm_str_8085_let4 занимает 19 байт и содержит последнюю букву 4-х буквенной команды. для быстрого доступа к этой таблице все 4-х буквенные команды располагаются вначале таблицы disassm_str_8085 (и соответственно имеют минимальные индексы).
-- таблица disassm_reg8_8085 занимает 8 байт и содержит текстовое представление восьми 8-разрядных регистров.
-- таблица disassm_reg16_8085 занимает 10 байт и содержит сжатое представление 16-разрядных регистров.

итого, все таблицы занимают 512 + 178 + 19 + 8 + 10 = 727 байт.


Attachments:
disassm.v1.6.1.zip [3.58 KiB]
Downloaded 21 times

_________________
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
09 Feb 2024 01:59
Profile WWW
Senior
User avatar

Joined: 17 Jun 2014 04:29
Posts: 138
Location: 93.80.157.217
Reply with quote
удалось добиться размера в 975 байт, но там пошло уже совсем ненормальное погромирование: старшие байты не учитываются, необходимо выполнить требование на непересечение 256-байтной границы.
ннннадо?

_________________
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой


09 Feb 2024 09:03
Profile WWW
Senior

Joined: 01 Jan 2022 04:34
Posts: 172
Location: USSR, Tashkent
Reply with quote
vital72 wrote:
удалось добиться размера в 975 байт, но там пошло уже совсем ненормальное погромирование: старшие байты не учитываются, необходимо выполнить требование на непересечение 256-байтной границы.
ннннадо?

горшочек, не вари :mrgreen:


09 Feb 2024 10:17
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22591
Location: Silicon Valley
Reply with quote
vital72 wrote:
удалось добиться размера в 975 байт, но там пошло уже совсем ненормальное погромирование: старшие байты не учитываются, необходимо выполнить требование на непересечение 256-байтной границы.
ннннадо?

Давай :)

Главное все промежуточные версии иметь чтобы если что откатиться :)

_________________
:dj: https://mastodon.social/@Shaos


09 Feb 2024 11:34
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 165 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6, 7 ... 11  Next

Who is online

Users browsing this forum: Hammer and 58 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.