nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 13 May 2024 08:11



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

Joined: 08 Jan 2003 23:22
Posts: 22730
Location: Silicon Valley
Reply with quote
Ну тогда скорее так:
Code:
;       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:
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 предложил, то будет сильно быстрее, но несколько жырнее по коду...

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


13 Feb 2024 05:59
Profile WWW
Maniac
User avatar

Joined: 14 Oct 2019 18:10
Posts: 327
Location: Tashkent
Reply with quote
vital72 wrote:
:ebiggrin:
У меня, кстати, старший бит тоже имеет свою функцию как флаг подавления операндов: В i8080 большинство инструкций имеет операнды и, у меня в частности, распаковка мнемоники завершает не RET'ом, а условным RET'ом с проверкой флага для вывода операндов и добавления четвёртой буквы (staX/ldaX/shlD/lhlD) автоматом. :roll:


13 Feb 2024 06:07
Profile WWW
Senior
User avatar

Joined: 17 Jun 2014 04:29
Posts: 138
Location: 93.80.157.217
Reply with quote
провёл небольшую оптимизацию версии 1.8 по примеру версии 1.9.2 -- удалось скинуть ещё 14 байт, теперь версия 1.8.1 весит 752 байта, вместо 766.
в процессе оптимизации обнаружилось, что в погоне за байтами в версии 1.9.2 была допущена ошибка -- коды 80-BF отображались неправильно, выкладываю исправленную версию -- 1.9.3


Attachments:
File comment: важные исправления
disassm.v1.9.3.zip [3.53 KiB]
Downloaded 28 times
File comment: 752
disassm.v1.8.1.zip [3.44 KiB]
Downloaded 26 times

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


Last edited by vital72 on 13 Feb 2024 08:49, edited 1 time in total.

13 Feb 2024 06:51
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22730
Location: Silicon Valley
Reply with quote
Shaos wrote:
Вот скажем если бы они были упакованы в другом порядке - не так:
Code:
dw      ((S_5BIT*2048)+(T_5BIT*64)+(A_5BIT*2)+1)        ;  STAX
а скажем так:
Code:
dw      (S_5BIT+(T_5BIT*32)+(A_5BIT*1024)+8000h)        ;  STAX
то первая буква вытаскивалась бы таким образом:
Code:
    mov a,m
    ani 1Fh
    adi 40h
а третья буква таким:
Code:
    inx h
    mov a,m
    rrc
    rrc
    ani 1Fh
    adi 40h
но вот со второй буквой есть сложности...

Можно перепаковать так, чтобы первая и вторая буквы вытаскивались легко, а третья была бы порезана:
Code:
dw      (S_5BIT+(T_5BIT*1024)+(A_5BIT*32)+8000h)        ;  STAX
тогда младшие 3 бита третьей буквы (сдвинутые в старшие биты первого байта) можно брать так:
Code:
    mov a,l
    rlc
    rlc
    rlc
    ani 7
а старшие 2 бита буквы (сдвинутые в младшие биты второго байта) так:
Code:
    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-ский вариант таки самый быстрый (там надо лишь переставить местами вычитку букв и вставить проверку третьей буквы на ноль с покиданием подпрограммы, чтобы не печатать @)

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


13 Feb 2024 06:55
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22730
Location: Silicon Valley
Reply with quote
vital72 wrote:
провёл небольшую оптимизацию версии 1.8 по примеру версии 1.9.2 -- удалось скинуть ещё 14 байт, теперь версия 1.8.1 весит 752 байта, вместо 766.
в процессе оптимизации обнаружилось, что в погоне за байтами в версии 1.9.2 была допущена ошибка -- коды 80-BF декодировались неправильно, выкладываю исправленную версию -- 1.9.3

тут я смотрю ещё коды мнемоник переставлены:

 diff
Code:
$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

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


13 Feb 2024 07:01
Profile WWW
Senior
User avatar

Joined: 17 Jun 2014 04:29
Posts: 138
Location: 93.80.157.217
Reply with quote
Shaos wrote:
тут я смотрю ещё коды мнемоник переставлены:

точно!
всё ради экономии байт, так сделано, чтобы вместо:
Code:
   mvi   b, xxxx
   ...
   mvi   b, yyyy

стало:
Code:
   mvi   b, xxxx
   ...
   inr   b

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


13 Feb 2024 07:06
Profile WWW
Maniac
User avatar

Joined: 14 Oct 2019 18:10
Posts: 327
Location: Tashkent
Reply with quote
Кстати, в 2016 я в рамках своего эмулятора вот здесь (нажмите F4 после полной загрузки) применил трюк с DAD (в цикле здесь) для вывода директивы целиком (при нажатии D выводится DUMP).


Last edited by Alikberov on 13 Feb 2024 10:41, edited 1 time in total.



13 Feb 2024 09:40
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22730
Location: Silicon Valley
Reply with quote
vital72 wrote:
Shaos wrote:
тут я смотрю ещё коды мнемоник переставлены:

точно!
всё ради экономии байт, так сделано, чтобы вместо:
Code:
   mvi   b, xxxx
   ...
   mvi   b, yyyy

стало:
Code:
   mvi   b, xxxx
   ...
   inr   b

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

Вот это чтоли?
Code:
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:
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

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


13 Feb 2024 10:16
Profile WWW
Senior
User avatar

Joined: 17 Jun 2014 04:29
Posts: 138
Location: 93.80.157.217
Reply with quote
метка disassm_hndlr_40_BF
было:
Code:
mvi   b, MNEMO_MOV

стало:
Code:
inr   b

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


13 Feb 2024 10:29
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22730
Location: Silicon Valley
Reply with quote
Вроде понял :roll:
Code:
MNEMO_HLT               EQU     32
MNEMO_MOV               EQU     33

P.S. Я хочу условную компиляцию сделать ключом ONLY8080 например. Для этого надо увести 8085 мнемоники на края таблицы - четырёхбуквенные в начало и 2-3 буквенные в конец (я там по ходу звёздочки уже расставил, чтобы было видно что надо уводить) - тогда можно условно их отрезать и программно корректировать смещение по таблице сжатых мнемоник с учётом отрезанного и для 8080 оно будет писать на пропущенные места DB с кодом - вобщем как-то так...

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


13 Feb 2024 10:35
Profile WWW
Maniac
User avatar

Joined: 14 Oct 2019 18:10
Posts: 327
Location: Tashkent
Reply with quote
Смотрю тут, Вы - макросами балуетесь!
У меня - жесть:
Code:
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:


13 Feb 2024 14:06
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22730
Location: Silicon Valley
Reply with quote
yozh0004.asm на основе v1.8.1 от vital72 (обработано напильником до совместимости с pdp11asm85):
Attachment:
yozh0004.zip [13.53 KiB]
Downloaded 22 times

Code:
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:

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


15 Feb 2024 00:48
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22730
Location: Silicon Valley
Reply with quote
Shaos wrote:
vital72 wrote:
также я добавил файл i8080.bin.rk для проверки дизассемблирования всех инструкций, включая инструкции 8085, он загружается по адресу 1000H.
чтобы его дизассемблировать надо в HL загрузить 1000H, в DE 1163H

Вот вариант с этим тестом - нужные адреса уже прописаны, надо просто загрузить с запуском:

Image

Вот то же самое дизасемблировано урезанным до инструкций 8080 дизассемблером (в непонятных местах он ставит DB xx):

Attachment:
Screenshot from 2024-02-15 20-58-28.png
Screenshot from 2024-02-15 20-58-28.png [ 34.39 KiB | Viewed 501 times ]

Размер получившегося кода - 731 байт, что на 21 байт меньше полновесного варианта (8085 и 8080 варианты собираются из одного и того же исходника с помощью отсутствия или наличия ключика ONLY8080 соответственно, что даёт бины с размерами 752+6 и 731+6, где 6 байт эта задавание HL и DE для тесту). Щас допишу батничек, чтобы собирал 2 варианта и выложу архив... вот:
Code:
pdp11asm85 yozh0005.asm -DONLY8080
cp yozh0005.bin yozh0005-8080.bin
cp yozh.lst yozh8080.lst
cp yozh.rkr yozh8080.rkr
pdp11asm85 yozh0005.asm

Attachment:
yozh0005.zip [23.22 KiB]
Downloaded 21 times

Code:
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

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


15 Feb 2024 22:08
Profile WWW
Doomed

Joined: 10 Aug 2022 07:27
Posts: 364
Reply with quote
Тут прям сорева по дизасму. Типа, у кого блинк короче, на Ардуино.)
Так тогда может и для z80 нашрайбаете? А то у меня недокументированные копы не реализованы.)


15 Feb 2024 23:11
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22730
Location: Silicon Valley
Reply with quote
Mondx wrote:
Тут прям сорева по дизасму. Типа, у кого блинк короче, на Ардуино.)
Так тогда может и для z80 нашрайбаете? А то у меня недокументированные копы не реализованы.)
Не - Z80 это как-нибудь сам :no:

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


16 Feb 2024 00:45
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 165 posts ]  Go to page Previous  1 ... 5, 6, 7, 8, 9, 10, 11  Next

Who is online

Users browsing this forum: No registered users and 4 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.