Дизассемблер Yozh

Советский компьютер Радио-86РК (1986) и его клоны

Moderator: Shaos

User avatar
vital72
Senior
Posts: 181
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

Re: Дизассемблер Yozh

Post by vital72 »

я сделяль! 1021 байт.
используются грязные хаки -- строки disassm_reg8_8085 и disassm_reg16_8085 не должны пересекать 256-байтовую границу, но это не является проблемой. если в коде они попали на границу -- всегда можно перенести в другое место.
в исходнике я предусмотрел проверку на пересечение, используя директиву условия, но не в каждом компиляторе есть такие директивы, если нет, просто можно удалить из исходника проверку, а проверку осуществлять глазками.

на rk86.ru очень уж примитивный ассемблер, там не соберется.
я приаттачу скомпилированный RK-файл, чтобы его можно было загрузить на rk86.ru, код дизассма располагается с адреса 7000H, для вызова необходимо в регистры HL и DE загрузить адреса начала и конца блока соответственно и перейти по адресу 7000H.
для теста загрузите disassm.rk и просто наберите в Мониторе:

Code: Select all

-->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
You do not have the required permissions to view the files attached to this post.
Last edited by vital72 on 08 Feb 2024 15:03, edited 1 time in total.
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
User avatar
Shaos
Admin
Posts: 24067
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Дизассемблер Yozh

Post by Shaos »

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

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

я тоже буду учавствовать.
Ну компактнее уже вряд ли получится :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
vital72
Senior
Posts: 181
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

Re: Дизассемблер Yozh

Post by vital72 »

перезалил архив с исходником.
по коду ничего не поменялось абсолютно, изменил только именование макросов и некоторых меток.
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
User avatar
vital72
Senior
Posts: 181
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

Re: Дизассемблер Yozh

Post by vital72 »

дашоштакое.
тока зарелизю новую версию, как нахожу ещё возможность сократить код. щас получилось 1011
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
User avatar
vital72
Senior
Posts: 181
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

Re: Дизассемблер Yozh

Post by vital72 »

999
You do not have the required permissions to view the files attached to this post.
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
User avatar
Shaos
Admin
Posts: 24067
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Дизассемблер Yozh

Post by Shaos »

Хммм, а скорость не пострадала?…
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
vital72
Senior
Posts: 181
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

Re: Дизассемблер Yozh

Post by vital72 »

нет, скорее наоборот.
множество джампов убрано, код удачно стыкуется друг с другом, как пазл.
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
User avatar
Shaos
Admin
Posts: 24067
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Дизассемблер Yozh

Post by Shaos »

Ну тогда наверное в ущерб скорости ещё можно размер ужать? :lol:
Можно сделать условную компиляцию - чтобы собирала типа самый быстрый вариант и с другим ключом самый компактный :oidea:
А ещё будет самый жырный вариант от меня - с "объяснялками" :idea:

P.S. Смотрю последние варианты - я в своих экспериментах над первой версией кода по похожему пути пошёл :)

Code: Select all

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: Select all

disassm_disassm_str_8085_let4:
	db	"XXDDHGLLBLEIIVXXLL"
Я могу под pdp11asm85 опять напильником обработать чтобы без макросов стало :mrgreen:

P.P.P.S. А вот это никак нельзя упростить? Вроде как лишние 16 байт т.к один и тот же адрес повторяется 8 раз:

Code: Select all

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: Select all

        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: Select all

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: Select all

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:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
vital72
Senior
Posts: 181
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

Re: Дизассемблер Yozh

Post by vital72 »

а ты говоришь, меньше не получицца, а оказывается там ещё много чего можно повыкидывать.
как ещё ужать, даже в ущерб скорости, пока не представляю.
почистил, соптимизировал, добавил проверку CTRL+C, нашёл один недочёт -- дизассемблировал блок на 1 байт меньше.
989 байт

ПЫСЫ: "disassm_disassm" не сразу заметил
You do not have the required permissions to view the files attached to this post.
Last edited by vital72 on 09 Feb 2024 00:30, edited 4 times in total.
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
User avatar
Shaos
Admin
Posts: 24067
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Дизассемблер Yozh

Post by Shaos »

Нет предела совершенству :lol:
Я тут за главного - если что шлите мыло на me собака shaos точка net
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Re: Дизассемблер Yozh

Post by b2m »

Shaos wrote:Обработал исходник напильником ...
Вот эту функцию ещё упростил, а то pdp11asm не понимает high/low - было:

Code: Select all

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: Select all

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: Select all

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/
User avatar
vital72
Senior
Posts: 181
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

Re: Дизассемблер Yozh

Post by vital72 »

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 байт.
You do not have the required permissions to view the files attached to this post.
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
User avatar
vital72
Senior
Posts: 181
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

Re: Дизассемблер Yozh

Post by vital72 »

удалось добиться размера в 975 байт, но там пошло уже совсем ненормальное погромирование: старшие байты не учитываются, необходимо выполнить требование на непересечение 256-байтной границы.
ннннадо?
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
imsushka
Maniac
Posts: 233
Joined: 01 Jan 2022 04:34
Location: USSR, Tashkent

Re: Дизассемблер Yozh

Post by imsushka »

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

Re: Дизассемблер Yozh

Post by Shaos »

vital72 wrote:удалось добиться размера в 975 байт, но там пошло уже совсем ненормальное погромирование: старшие байты не учитываются, необходимо выполнить требование на непересечение 256-байтной границы.
ннннадо?
Давай :)

Главное все промежуточные версии иметь чтобы если что откатиться :)
Я тут за главного - если что шлите мыло на me собака shaos точка net