Дизассемблер 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 »

если вдруг требования к точному наименованию инструкций нет, то у меня есть версия где 4-буквенные инструкции выводятся как 3-буквенные. 702 байта.
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
Mondx
Doomed
Posts: 528
Joined: 10 Aug 2022 07:27
Location: Crimea

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

Post by Mondx »

Это уже спорт.) Хотя, и это понятно.
b2m
Devil
Posts: 908
Joined: 26 May 2003 06:57

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

Post by b2m »

Если вдруг кому без расширенных команд 8085 надо, то у меня есть версия в 678 байт:

 

Code: Select all

OUT_STR			EQU	0F818h
OUT_ADDR		EQU	0FB78h
CMP_DE_HL		EQU	0F990h
CHECK_CTRL_C		EQU	0F9A4h
MONITOR_PROMPT		EQU	0F86Ch
CUR_PTR             EQU 7633h
DISASSM_BUFFER		EQU	7635h

.macro str3
    dw ((((%%1+0)&1Fh)*32+((%%2+0)&1Fh))*32+((%%3+0)&1Fh))*2
.endm

.macro opc
    db ((%%2+0)&1Fh)*8+%%1
    str3 %%3,%%4,%%5
.endm

;  =============================================================================
;  ДИЗАССЕМБЛИРОВАНИЕ БЛОКА КОДА  ______________________________________________
;  вход:  HL - начальный адрес блока
;         DE - конечный адрес блока

disassm:
	inx	d
	call	CMP_DE_HL
	jnc	MONITOR_PROMPT
	push	d
	push	h		;  addr of first byte
    mov c, m
    inx h
	shld CUR_PTR
	lxi h, disassm_opc
	push h
    mov a, c
    rlc
    jc dis80
    rlc
    jc dis40
    lxi d, part0
    call disassm_id
    lxi d, ops0
    ret
dis40:
    lxi d, ops1
    mov a, c
    sui 76h
    rz
    mvi a,1
    ret
dis80:
    rlc
    jc disC0
    rlc
    rlc
    rlc
    ani 7
    lxi d, ops2
    ret
disC0:
    lxi d, part3
    call disassm_id
    lxi d, ops3
    ret

add_de_a:
    add e
    mov e,a
    adc d
    sub e
    mov d,a
    ret

disassm_id:
    rlc
    rlc
    ani 3
    mov b,a
    mov a,c
    ani 0Fh
    call add_de_a
    ldax d
    ora a
    jm dis_id1
    add b
    call add_de_a
    ldax d
dis_id1:
    ani 7Fh
    ret

disassm_opc:
    mov b,a
    add b
    add b
    call add_de_a
    mov a,c
    rlc
    ldax d
    ral
    ani 0Fh
    push d
    lxi d, op_args
    call add_de_a
    ldax d
    mov b,a
    pop h
    mov a,m
    inx h
    mov e,m
    inx h
    mov d,m
    push d
    mov h,a
	lxi	d,  DISASSM_BUFFER + 10
    call    disassm_put_chr
    pop h
    call    disassm_put_str
    lxi h, disassm_opc2
    push h
    mov a,b
    lxi h, disassm_op_im8
    call push_if
    lxi h, disassm_op_im16
    call push_if
    lxi h, disassm_op_n
    call push_if
    lxi h, disassm_op_r8
    call push_if
    lxi h, put_comma
    call push_if
    lxi h, disassm_op_r8x
    call push_if
    lxi h, disassm_op_r16
    call push_if
    rrc
    cc disassm_op_ccc
put_spaces:
    mvi a,' '
    stax d
    inx d
    mov a,e
    cpi 45h        ; LOW DISASSM_BUFFER+16
    jc put_spaces
    lhld CUR_PTR
    ret
    
push_if:
    rrc
    rnc
    xthl
    pchl

disassm_opc2:
	xra	a
	stax	d
	mov	c, l
	xthl			;  hl = addr of first byte
	call	OUT_ADDR
	lxi	d, DISASSM_BUFFER
	push d
	call	disassm_dump
	call    put_2_spc
	pop h
	call	OUT_STR
	call	CHECK_CTRL_C
	pop	h
	pop	d
	jmp	disassm + 1

disassm_dump:
    call $+3
    call $+3
    mov a,l
    cmp c
    jnz disassm_op_im8
put_2_spc:
    mvi a,' '
    stax d
    inx d
    stax d
    inx d
    ret

put_comma:
    mvi a,','
    stax d
    inx d
    ret

disassm_put_str:
	call	$+6
	call	$+3
disassm_put_chr:
	xra	a
	dad	h
	ral
	dad	h
	ral
	dad	h
	ral
	dad	h
	ral
	dad	h
	ral
	ana	a
	rz
	adi	40h
	stax d
	inx	d
	ret

disassm_op_r8x:
	mov	a, c
	rrc
	rrc
	rrc
    db 0FEh    ; cpi xx
disassm_op_r8:
    mov a, c
	push	h
	lxi	h, disassm_reg8_8085
	ani	7
	add	l
	mov	l, a
	mov	a, m
	pop	h
	stax	d
	inx	d
	ret

disassm_op_r16:
    mov a, c
    cpi 0F0h
    mvi a, 20h
    jnc $+7
    mov a, c
    rrc
    ani 18h
	push    h
	lxi	h, disassm_reg16_8085
    jmp disassm_str3

disassm_op_ccc:
    mov a, c
	push	h
	lxi	h, disassm_cond_8085
disassm_str3:
    rrc
    rrc
    ani 0Eh
	add	l
	mov	l, a
	mov	a, m
	inx	h
	mov	h, m
	mov	l, a
	call	disassm_put_str
	pop	h
	ret

disassm_op_im8:
	mov	a, m
	inx	h
	push	psw
	rrc
	rrc
	rrc
	rrc
	call	$+4
	pop	psw
	ani	0Fh
	cpi	10
	sbi	'0' - 1
	daa
	stax	d
	inx	d
	ret

disassm_op_im16:
	inx	h
	call	disassm_op_im8
	dcx	h
	dcx	h
	call	disassm_op_im8
	inx	h
	ret

disassm_op_n:
    mov a, c
    rrc
    rrc
    rrc
    ani 7
	adi	'0'
	stax	d
	inx	d
disassm_op_none:
	ret

;  =============================================================================
;  CC RP R , r n W B

op_args:
    db 0,   0
    db 52h, 8
    db 40h, 1
    db 20h, 2
    db 31h, 40h
    db 2,   4
    db 38h, 80h
    db 0,   82h

part0:
db 80h
db 81h
db x02-$
db 82h
db 83h
db 84h
db 85h
db x07-$

db 80h
db 86h
db x0A-$
db 87h
db 83h
db 84h
db 85h
db x0F-$

x02: db 88h,88h,89h,8Ah
x0A: db 8Bh,8Bh,8Ch,8Dh
x07: db 8Eh,8Fh,90h,91h
x0F: db 92h,93h,94h,95h

ops0:
opc 0, 'N','O','P',0 ; 80h
opc 1, 'L','X','I',0
opc 2, 'I','N','X',0
opc 3, 'I','N','R',0
opc 3, 'D','C','R',0
opc 4, 'M','V','I',0
opc 2, 'D','A','D',0
opc 2, 'D','C','X',0
opc 2, 'S','T','A','X' ; 88h
opc 5, 'S','H','L','D'
opc 5, 'S','T','A',0
opc 2, 'L','D','A','X'
opc 5, 'L','H','L','D'
opc 5, 'L','D','A',0
opc 0, 'R','L','C',0 ; 8Eh
opc 0, 'R','A','L',0
opc 0, 'D','A','A',0
opc 0, 'S','T','C',0
opc 0, 'R','R','C',0
opc 0, 'R','A','R',0
opc 0, 'C','M','A',0
opc 0, 'C','M','C',0

ops1:
opc 0, 'H','L','T',0 ; 80h
opc 6, 'M','O','V',0

ops2:
opc 1, 'A','D','D',0 ; 80h
opc 1, 'A','D','C',0
opc 1, 'S','U','B',0
opc 1, 'S','B','B',0
opc 1, 'A','N','A',0
opc 1, 'X','R','A',0
opc 1, 'O','R','A',0
opc 1, 'C','M','P',0

part3:
db 80h
db 81h
db 82h
db xC3-$
db 83h
db 84h
db xC6-$
db 85h

db 80h
db xC9-$
db 82h
db xCB-$
db 83h
db xCD-$
db xCE-$
db 85h

xC3: db 86h,87h,88h,89h
xC9: db 8Ah,8Ah,8Bh,8Ch
xCB: db 86h,8Dh,8Eh,8Fh
xCD: db 90h,90h,90h,90h
xC6: db 91h,92h,93h,94h
xCE: db 95h,96h,97h,98h

ops3:
opc 6, 'R',0,0,0  ; 80h
opc 4, 'P','O','P',0
opc 7, 'J',0,0,0
opc 7, 'C',0,0,0
opc 4, 'P','U','S','H'
opc 5, 'R','S','T',0
opc 3, 'J','M','P',0 ; 86h
opc 2, 'O','U','T',0
opc 0, 'X','T','H','L'
opc 0, 'D','I',0,0
opc 0, 'R','E','T',0
opc 0, 'P','C','H','L'
opc 0, 'S','P','H','L'
opc 2, 'I','N',0,0 ; 8Dh
opc 0, 'X','C','H','G'
opc 0, 'E','I',0,0
opc 3, 'C','A','L','L' ; 90h
opc 2, 'A','D','I',0
opc 2, 'S','U','I',0
opc 2, 'A','N','I',0
opc 2, 'O','R','I',0
opc 2, 'A','C','I',0
opc 2, 'S','B','I',0
opc 2, 'X','R','I',0
opc 2, 'C','P','I',0

disassm_reg16_8085:
str3 'B',0,0
str3 'D',0,0
str3 'H',0,0
str3 'S','P',0
str3 'P','S','W'

disassm_cond_8085:
str3 'N','Z',0
str3 'Z',0,0
str3 'N','C',0
str3 'C',0,0
str3 'P','O',0
str3 'P','E',0
str3 'P',0,0
str3 'M',0,0

disassm_reg8_8085: db 'BCDEHLMA'


Таблицы минимизировал как мог, правда код распух. Если ограничить некоторые таблицы в пределах 256 байт, наверное можно ещё сократить.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
Shaos
Admin
Posts: 24097
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

vital72 wrote:если вдруг требования к точному наименованию инструкций нет, то у меня есть версия где 4-буквенные инструкции выводятся как 3-буквенные. 702 байта.
Не - это уже перебор :mrgreen:

Но до кучи можно и прицепить сюда - пусть будет :idea:
Я тут за главного - если что шлите мыло на 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 »

конкуренция -- это всегда круто.
я проверил, сколько будет весить моя версия только для 8080 -- получилось 702 байта, а я так надеялся :ebiggrin:
b2m, сделай под 8085, чисто из любопытства, сколько получится?
обновил код. обнаружил небольшой косяк в форматировании кода, "на скорость не влияет", компайлер, которым я сейчас пользуюсь, не умеет в перенос строк, приходится всё вытягивать в одну.
и смог ещё два байта сэкономить :esmile: .
You do not have the required permissions to view the files attached to this post.
Last edited by vital72 on 12 Feb 2024 09:35, edited 1 time in total.
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
Damir
Fanat
Posts: 88
Joined: 21 Feb 2017 06:54
Location: Казань

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

Post by Damir »

Да, круто я завел программистов на Дизассемблер, здорово получилось сократить, хотя это не самое главное. Ещё должно быть удобство при пользовании.
я тоже вот попытался вспомнить, как писать на ассемблере (понял, что давно этого не делал) пока на длину кода не обращал внимания, все делал в лоб, но добавил постраничный вывод ( в размер экрана), при нажатии на "точку" вывод прекращается.
Если по определенному адресу не нулевое значение, то выводит строки как данные до первого кода "00", вот так примерно
R86_dizass.jpg
правда по сравнению с Виталием у меня получилось много, более 1,5 кб, но это ещё не оптимизировано и есть небольшие куски отладочные и временные, кот надо убрать.
You do not have the required permissions to view the files attached to this post.
User avatar
Alikberov
Doomed
Posts: 355
Joined: 14 Oct 2019 18:10
Location: Tashkent

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

Post by Alikberov »

Идеальный дизассемблер - сам процессор!

Бóльшая часть программных затрат уходит на декодирование битовых полей, которые на уровне кристалла являются просто перестановкой отдельных сигналов и не требуют вообще никакой логической обработки.
(Вспомним, хотя бы, тот самый графический экран ZX-Spectrum с причудливым чредованием полей, которые всегда доставляли программистам достаточно хлопот!)

Вся проблема в том, что инженеры ни в какой из имеющихся на данный момент (на сколько мне известно) архитектур не предусмотрели чудо инструкции для распаковки кода команды.
Типа, передаёшь в Aккумулятор код команды, а в регистрах получаешь всю информацию о команде:
  • C - размер инструкции / количество байтов (1…3 или 0, если ошибка)
  • B - указатель памяти (0-BC; 1-DE; 2-HL; 3-SP; 4-PC)
  • D - регистр-приёмник / счётчик
  • E - регистр-источник
  • A - код инструкции
  • CF - регистр-счётчик (для DCR/DCX/INR/INX/LXI/MVI)
  • PF - пара регистров (только для MOV)
  • SF - операции контроля и ветвления
  • ZF - операции АЛУ (ADD/ADI/ANA/ANI и т.д.)
User avatar
Shaos
Admin
Posts: 24097
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

vital72 wrote:740 байт.
каждый байт даётся с большим трудом.
...
Вложения:
Комментарий к файлу: запускатель дизассма
disassm-launcher.rk.zip [202 байт]
Скачиваний: 7
Комментарий к файлу: исполняемый файл
disassm.v1.9.rk.zip [903 байт]
Скачиваний: 6
Комментарий к файлу: исходник
disassm.v1.9.asm.zip [3.5 КиБ]
Скачиваний: 6
поглядел - да, тут уже пошла эзотерика :o
пожалуй я возьму за основу Йожа версию 1.8 (766 байт) :wink:

P.S. вот этот кусок поди можно переписать без дадов?

Code: Select all

disassm_put_str:
	push	d
	mov	e, a
	mvi	d, 0
	dad	d
	dad	d
	mov	e, m
	inx	h
	mov	d, m
	xchg
	pop	d
	call	$+6
	call	$+3
	xra	a
	dad	h
	ral
	dad	h
	ral
	dad	h
	ral
	dad	h
	ral
	dad	h
	ral
	ana	a
	rz
	adi	40h
	stax	d
	inx	d
	ret
а то по-моему жырновато как-то выглядит...
Я тут за главного - если что шлите мыло на me собака shaos точка net
Mondx
Doomed
Posts: 528
Joined: 10 Aug 2022 07:27
Location: Crimea

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

Post by Mondx »

Давеча обнаружил в своём ассемблере что не работает rst. Полез и офигел. Ни каментов нормальных, ни логики... Пол дня потратил что бы в своей же писанине разобраться.( При том что там без особых трюков. И даже $-5 такого нет.) И пустые строки после jp.) Всё как учили в школе.)
User avatar
Shaos
Admin
Posts: 24097
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Почистил топик от лирических отступлений от темы :roll:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24097
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Shaos wrote: пожалуй я возьму за основу Йожа версию 1.8 (766 байт) :wink:
Вот - обработал напильником, выкинув макросы, чтобы собиралось последним pdp11asm85 - теперь можно навешивать опциональные фенечки :lol:
Screenshot from 2024-02-13 00-07-12.png
yozh0003.zip

Code: Select all

Archive:  yozh0003.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
    16211  2024-02-13 00:03   yozh0003.asm
       24  2024-02-07 22:53   yozh0003-mk
      772  2024-02-13 00:03   yozh0003.bin
    35126  2024-02-13 00:03   yozh.lst
      782  2024-02-13 00:03   yozh.rkr
---------                     -------
    52915                     5 files
772 байта BIN т.к. в начале программы добавлен 6-байтовый тест:

Code: Select all

; TEST BEGIN
        lxi     h,0F8C7h
        lxi     d,0F8FFh
; TEST END
Я уже придумал, как условно собирать версию только c 8080 инструкциями :mrgreen:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
Mondx
Doomed
Posts: 528
Joined: 10 Aug 2022 07:27
Location: Crimea

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

Post by Mondx »

Ассемблер без макро - это порнография.
Шаос, старайся писать красиво (и к тебе потянутся люди)), потому что коряво все умеют.
User avatar
Shaos
Admin
Posts: 24097
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

vital72 wrote:также я добавил файл i8080.bin.rk для проверки дизассемблирования всех инструкций, включая инструкции 8085, он загружается по адресу 1000H.
чтобы его дизассемблировать надо в HL загрузить 1000H, в DE 1163H
Вот вариант с этим тестом - нужные адреса уже прописаны, надо просто загрузить с запуском:
Screenshot from 2024-02-13 00-28-52.png
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24097
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Mondx wrote:Ассемблер без макро - это порнография.
Все вопросы по ассемблеру следует направлять к оригинальному автору - vinxru :mrgreen:
Я могу всякую мелочь исправить/добавить, но фундаментально я его переписывать не буду :ewink:
Mondx wrote:Шаос, старайся писать красиво (и к тебе потянутся люди)), потому что коряво все умеют.
А в каком месте я некрасиво написал? :lol:
Я тут за главного - если что шлите мыло на me собака shaos точка net
Mondx
Doomed
Posts: 528
Joined: 10 Aug 2022 07:27
Location: Crimea

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

Post by Mondx »

Shaos wrote:А в каком месте я некрасиво написал? :lol:
Я имею ввиду стиль. После ветвлений (jmp, ret) желательна пустая строка и т.п.
Это и к высокоуровневым языкам относится. А в Си вообще безобразие. Постоянно думаю о Пайтоне. Ну почему ведь основатели Си к этому не пришли!