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

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

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Ну тогда скорее так:

Code: Select all

;       DE - TEXT BUFFER
;       HL - PACKED STR

	call	$+6
	call	$+3
	mvi   a,2 ; <<<<<
	dad	h
	ral
	dad	h
	ral
	dad	h
	ral
	dad	h
	ral
	dad	h
	ral
	stax	d
	inx	d
	ret
правда в реальном коде там ещё проверка на ноль была, а тут придётся сравнивать с 40h - один байт сэкономили потом один байт потеряли - то на то и выходит:

Code: Select all

0257 0080                               disassm_put_str:
0258 0080 D5                                    push    d
0259 0081 5F                                    mov     e, a
0260 0082 16 00                                 mvi     d, 0
0261 0084 19                                    dad     d
0262 0085 19                                    dad     d
0263 0086 5E                                    mov     e, m
0264 0087 23                                    inx     h
0265 0088 56                                    mov     d, m
0266 0089 EB                                    xchg
0267 008A D1                                    pop     d
0268 008B CD 91 00                              call    disassm_put_char
0269 008E CD 91 00                              call    disassm_put_char
0270 0091                               disassm_put_char:
0271 0091 3E 02                                 mvi     a,2
0272 0093 29                                    dad     h
0273 0094 17                                    ral
0274 0095 29                                    dad     h
0275 0096 17                                    ral
0276 0097 29                                    dad     h
0277 0098 17                                    ral
0278 0099 29                                    dad     h
0279 009A 17                                    ral
0280 009B 29                                    dad     h
0281 009C 17                                    ral
0282 009D FE 40                                 cpi     40h
0283 009F C8                                    rz
0284 00A0 12                                    stax    d
0285 00A1 13                                    inx     d
0286 00A2 C9                                    ret
по скорости получается так:
xra a заменили на mvi a,2 - 4 против 7
ana a заменили на cpi 40h - 4 против 7
ну и выкинули adi 40h - 7 против 0
выходит 15 тактов против 14 - на 1 такт быстрее :mrgreen:
однако если разбирать побуквенно, как я на прошлой странице думал и как Alikberov предложил, то будет сильно быстрее, но несколько жырнее по коду...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Alikberov
Doomed
Posts: 347
Joined: 14 Oct 2019 18:10
Location: Tashkent

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

Post by Alikberov »

vital72 wrote: :ebiggrin:
У меня, кстати, старший бит тоже имеет свою функцию как флаг подавления операндов: В i8080 большинство инструкций имеет операнды и, у меня в частности, распаковка мнемоники завершает не RET'ом, а условным RET'ом с проверкой флага для вывода операндов и добавления четвёртой буквы (staX/ldaX/shlD/lhlD) автоматом. :roll:
User avatar
vital72
Senior
Posts: 181
Joined: 17 Jun 2014 04:29
Location: 93.80.157.217

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

Post by vital72 »

провёл небольшую оптимизацию версии 1.8 по примеру версии 1.9.2 -- удалось скинуть ещё 14 байт, теперь версия 1.8.1 весит 752 байта, вместо 766.
в процессе оптимизации обнаружилось, что в погоне за байтами в версии 1.9.2 была допущена ошибка -- коды 80-BF отображались неправильно, выкладываю исправленную версию -- 1.9.3
You do not have the required permissions to view the files attached to this post.
Last edited by vital72 on 13 Feb 2024 08:49, edited 1 time in total.
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Shaos wrote: Вот скажем если бы они были упакованы в другом порядке - не так:

Code: Select all

dw      ((S_5BIT*2048)+(T_5BIT*64)+(A_5BIT*2)+1)        ;  STAX
а скажем так:

Code: Select all

dw      (S_5BIT+(T_5BIT*32)+(A_5BIT*1024)+8000h)        ;  STAX
то первая буква вытаскивалась бы таким образом:

Code: Select all

    mov a,m
    ani 1Fh
    adi 40h
а третья буква таким:

Code: Select all

    inx h
    mov a,m
    rrc
    rrc
    ani 1Fh
    adi 40h
но вот со второй буквой есть сложности...
Можно перепаковать так, чтобы первая и вторая буквы вытаскивались легко, а третья была бы порезана:

Code: Select all

dw      (S_5BIT+(T_5BIT*1024)+(A_5BIT*32)+8000h)        ;  STAX
тогда младшие 3 бита третьей буквы (сдвинутые в старшие биты первого байта) можно брать так:

Code: Select all

    mov a,l
    rlc
    rlc
    rlc
    ani 7
а старшие 2 бита буквы (сдвинутые в младшие биты второго байта) так:

Code: Select all

    mov a,h
    rlc
    rlc
    rlc
    ani 18h
и то, и другое занимает 24 такта - вместе 48, а три dad h с последующими mov a,h и ani 1Fh займут 42 такта (или mvi a,1Fh и ana h - 41), что чуть быстрее - видимо Alikberov-ский вариант таки самый быстрый (там надо лишь переставить местами вычитку букв и вставить проверку третьей буквы на ноль с покиданием подпрограммы, чтобы не печатать @)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

vital72 wrote:провёл небольшую оптимизацию версии 1.8 по примеру версии 1.9.2 -- удалось скинуть ещё 14 байт, теперь версия 1.8.1 весит 752 байта, вместо 766.
в процессе оптимизации обнаружилось, что в погоне за байтами в версии 1.9.2 была допущена ошибка -- коды 80-BF декодировались неправильно, выкладываю исправленную версию -- 1.9.3
тут я смотрю ещё коды мнемоник переставлены:

 diff

Code: Select all

$diff disassm.v1.8.asm disassm.v1.8.1.asm 
9,10c9,10
< ;  Version: 1.8
< ;  Date:    10.02.24
---
> ;  Version: 1.8.1
> ;  Date:    13.02.24
45,54c45,54
< MNEMO_HLT 		EQU	23
< MNEMO_NOP 		EQU	24
< MNEMO_CMC 		EQU	25
< MNEMO_STC 		EQU	26
< MNEMO_CMA 		EQU	27
< MNEMO_DAA 		EQU	28
< MNEMO_INR 		EQU	29
< MNEMO_DCR 		EQU	30
< MNEMO_INX 		EQU	31
< MNEMO_DCX 		EQU	32
---
> MNEMO_NOP 		EQU	23
> MNEMO_CMC 		EQU	24
> MNEMO_STC 		EQU	25
> MNEMO_CMA 		EQU	26
> MNEMO_DAA 		EQU	27
> MNEMO_INR 		EQU	28
> MNEMO_DCR 		EQU	29
> MNEMO_INX 		EQU	30
> MNEMO_DCX 		EQU	31
> MNEMO_HLT 		EQU	32
140,141c140,141
< 	db	@1
< 	db	(@2 << 3) | @3
---
> 	db	%%1
> 	db	(%%2 << 3) | %%3
145c145
< 	dw	((@1 + 0) & 1Fh << 11) | ((@2 + 0) & 1Fh << 6) | ((@3 + 0) & 1Fh << 1) | @4
---
> 	dw	((%%1 + 0) & 1Fh << 11) | ((%%2 + 0) & 1Fh << 6) | ((%%3 + 0) & 1Fh << 1) | %%4
149c149
< 	disassm_str @1, @2, @3, 1
---
> 	disassm_str %%1, %%2, %%3, 1
153c153
< 	disassm_str @1, @2, @3, 0
---
> 	disassm_str %%1, %%2, %%3, 0
157c157
< 	disassm_str @1, @2, 0, 0
---
> 	disassm_str %%1, %%2, 0, 0
189d188
< 	ani	00111000b
192a192
> 	ani	00000111b
217c217
< 	lxi	d, DISASSM_BUFFER + 2
---
> 	mvi	e, (DISASSM_BUFFER + 2) & 0FFh
222c222
< 	lxi	d, DISASSM_BUFFER + 10
---
> 	mvi	e, (DISASSM_BUFFER + 10) & 0FFh
363a364,365
> 	mvi	b, MNEMO_HLT
> 	lxi	d, disassm_op_none
365,367c367
< 	jz	disassm_hndlr_hlt
< 	adi	40h
< 	jm	disassm_hndlr_mov
---
> 	jz	disassm_lbl1
368a369,372
> 	inr	b
> 	mvi	e, disassm_op_r8_r8 & 0FFh
> 	cpi	0C0h
> 	jc	disassm_lbl1
375,387c379
< 	lxi	d, disassm_op_r8
< 	jmp	disassm_lbl1
< 
< disassm_hndlr_hlt:
< 	mvi	b, MNEMO_HLT
< 	lxi	d, disassm_op_none
< 	jmp	disassm_lbl1
< 
< disassm_hndlr_mov:
< 	ani	00111111b
< 	mov	c, a
< 	mvi	b, MNEMO_MOV
< 	lxi	d, disassm_op_r8_r8
---
> 	mvi	e, disassm_op_r8 & 0FFh
548d539
< 	disassm_str3	'H', 'L', 'T'	;  HLT
557a549
> 	disassm_str3	'H', 'L', 'T'	;  HLT
634c626
< 
---
> ;  end of file

Я тут за главного - если что шлите мыло на 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 »

Shaos wrote: тут я смотрю ещё коды мнемоник переставлены:
точно!
всё ради экономии байт, так сделано, чтобы вместо:

Code: Select all

	mvi	b, xxxx
	...
	mvi	b, yyyy
стало:

Code: Select all

	mvi	b, xxxx
	...
	inr	b
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
User avatar
Alikberov
Doomed
Posts: 347
Joined: 14 Oct 2019 18:10
Location: Tashkent

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

Post by Alikberov »

Кстати, в 2016 я в рамках своего эмулятора вот здесь (нажмите F4 после полной загрузки) применил трюк с DAD (в цикле здесь) для вывода директивы целиком (при нажатии D выводится DUMP).
Last edited by Alikberov on 13 Feb 2024 10:41, edited 1 time in total.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

vital72 wrote:
Shaos wrote: тут я смотрю ещё коды мнемоник переставлены:
точно!
всё ради экономии байт, так сделано, чтобы вместо:

Code: Select all

	mvi	b, xxxx
	...
	mvi	b, yyyy
стало:

Code: Select all

	mvi	b, xxxx
	...
	inr	b
А это в каком месте? Я чего-то в диффах такого не вижу.

Вот это чтоли?

Code: Select all

disassm_hndlr_40_BF:
        mvi     b, MNEMO_HLT
        lxi     d, disassm_op_none
        cpi     76h - 0C0h
        jz      disassm_lbl1
        mov     c, a
        inr     b
        mvi     e, disassm_op_r8_r8 & 0FFh
        cpi     0C0h
        jc      disassm_lbl1
        rrc
        rrc
        rrc
        ani     00000111b
        adi     MNEMO_ADD
        mov     b, a
        mvi     e, disassm_op_r8 & 0FFh
        jmp     disassm_lbl1
было:

Code: Select all

disassm_hndlr_40_BF:
        cpi     76h - 0C0h
        jz      disassm_hndlr_hlt
        adi     40h
        jm      disassm_hndlr_mov
        mov     c, a
        rrc
        rrc
        rrc
        ani     00000111b
        adi     MNEMO_ADD
        mov     b, a
        lxi     d, disassm_op_r8
        jmp     disassm_lbl1

disassm_hndlr_hlt:
        mvi     b, MNEMO_HLT
        lxi     d, disassm_op_none
        jmp     disassm_lbl1

disassm_hndlr_mov:
        ani     00111111b
        mov     c, a
        mvi     b, MNEMO_MOV
        lxi     d, disassm_op_r8_r8
        jmp     disassm_lbl1
Я тут за главного - если что шлите мыло на 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 »

метка disassm_hndlr_40_BF
было:

Code: Select all

mvi	b, MNEMO_MOV
стало:

Code: Select all

inr	b
https://radio-86rk.ru
кто я такой, чтобы спорить с самим собой
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Вроде понял :roll:

Code: Select all

MNEMO_HLT               EQU     32
MNEMO_MOV               EQU     33
P.S. Я хочу условную компиляцию сделать ключом ONLY8080 например. Для этого надо увести 8085 мнемоники на края таблицы - четырёхбуквенные в начало и 2-3 буквенные в конец (я там по ходу звёздочки уже расставил, чтобы было видно что надо уводить) - тогда можно условно их отрезать и программно корректировать смещение по таблице сжатых мнемоник с учётом отрезанного и для 8080 оно будет писать на пропущенные места DB с кодом - вобщем как-то так...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Alikberov
Doomed
Posts: 347
Joined: 14 Oct 2019 18:10
Location: Tashkent

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

Post by Alikberov »

Смотрю тут, Вы - макросами балуетесь!
У меня - жесть:

Code: Select all

RALS@T: DW      04983H  ; RLC   0_10010_01100_00011
        DW      04A43H  ; RRC   0_10010_10010_00011
        DW      0482CH  ; RAL   0_10010_00001_01100
        DW      04832H  ; RAR   0_10010_00001_10010
        DW      01021H  ; DAA   0_00100_00001_00001
        DW      00DA1H  ; CMA   0_00011_01101_00001
        DW      04E83H  ; STC   0_10011_10100_00011
        DW      00DA3H  ; CMC   0_00011_01101_00011
ALUS@I: DW      00489H  ; ADI   0_00001_00100_01001
        DW      00469H  ; ACI   0_00001_00011_01001
        DW      04EA9H  ; SUI   0_10011_10101_01001
        DW      04C49H  ; SBI   0_10011_00010_01001
        DW      005C9H  ; ANI   0_00001_01110_01001
        DW      06249H  ; XRI   0_11000_10010_01001
        DW      03E49H  ; ORI   0_01111_10010_01001
        DW      00E09H  ; CPI   0_00011_10000_01001
ALUS@T: DW      00484H  ; ADD   0_00001_00100_00100
        DW      00483H  ; ADC   0_00001_00100_00011
        DW      04EA2H  ; SUB   0_10011_10101_00010
        DW      04C42H  ; SBB   0_10011_00010_00010
        DW      005C1H  ; ANA   0_00001_01110_00001
        DW      06241H  ; XRA   0_11000_10010_00001
        DW      03E41H  ; ORA   0_01111_10010_00001
        DW      00DB0H  ; CMP   0_00011_01101_10000
Всякий раз, при добавлении очередной инструкции, приходится здорово мозгами проскрипеть! :roll:
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

yozh0004.asm на основе v1.8.1 от vital72 (обработано напильником до совместимости с pdp11asm85):
yozh0004.zip

Code: Select all

Archive:  yozh0004.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       24  2024-02-13 04:53   yozh0004-mk
    16145  2024-02-14 23:34   yozh0004.asm
      758  2024-02-14 23:34   yozh0004.bin
     4464  2024-02-14 23:38   yozh0004-i8080.rkr
      768  2024-02-14 23:34   yozh.rkr
    34818  2024-02-14 23:34   yozh.lst
---------                     -------
    56977                     6 files
Размер кода 758-6 = 752 байта

Ща попробую сделать условную компиляцию для отрезания инструкций 8085 :mrgreen:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

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

Image
Вот то же самое дизасемблировано урезанным до инструкций 8080 дизассемблером (в непонятных местах он ставит DB xx):
Screenshot from 2024-02-15 20-58-28.png
Размер получившегося кода - 731 байт, что на 21 байт меньше полновесного варианта (8085 и 8080 варианты собираются из одного и того же исходника с помощью отсутствия или наличия ключика ONLY8080 соответственно, что даёт бины с размерами 752+6 и 731+6, где 6 байт эта задавание HL и DE для тесту). Щас допишу батничек, чтобы собирал 2 варианта и выложу архив... вот:

Code: Select all

pdp11asm85 yozh0005.asm -DONLY8080
cp yozh0005.bin yozh0005-8080.bin
cp yozh.lst yozh8080.lst
cp yozh.rkr yozh8080.rkr
pdp11asm85 yozh0005.asm
yozh0005.zip

Code: Select all

Archive:  yozh0005.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
    35117  2024-02-15 21:10   yozh.lst
      768  2024-02-15 21:10   yozh.rkr
      737  2024-02-15 21:10   yozh0005-8080.bin
     4464  2024-02-15 20:44   yozh0005-i8080.rkr
     4464  2024-02-15 21:12   yozh0005-i8085.rkr
      143  2024-02-15 21:10   yozh0005-mk
    17529  2024-02-15 20:42   yozh0005.asm
      758  2024-02-15 21:10   yozh0005.bin
    33725  2024-02-15 21:10   yozh8080.lst
      747  2024-02-15 21:10   yozh8080.rkr
---------                     -------
    98452                     10 files
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
Mondx
Doomed
Posts: 500
Joined: 10 Aug 2022 07:27
Location: Crimea

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

Post by Mondx »

Тут прям сорева по дизасму. Типа, у кого блинк короче, на Ардуино.)
Так тогда может и для z80 нашрайбаете? А то у меня недокументированные копы не реализованы.)
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Mondx wrote:Тут прям сорева по дизасму. Типа, у кого блинк короче, на Ардуино.)
Так тогда может и для z80 нашрайбаете? А то у меня недокументированные копы не реализованы.)
Не - Z80 это как-нибудь сам :no:
Я тут за главного - если что шлите мыло на me собака shaos точка net