[SDK] Древняя тема про nedoPC SDK (август 2004)

Публичный форум для http://www.nedopc.org/nedopc

Moderator: Shaos

Post Reply
User avatar
Shaos
Admin
Posts: 23657
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Старая тема про nedoPC SDK (август 2004)

Post by Shaos »

Shaos wrote:А можно пойти по пути, по которому пошли другие продвинутые компиляторы сей для 8080 - пробегание специальным оптимизатором по сгенерённому ассемблерному исходнику с заменой распознанных последовательностей инструкций на более оптимальные эквиваленты (см. https://en.wikipedia.org/wiki/Peephole_optimization) - например xm=@hibyte(xm) сейчас скомпилируется вот в такой исходный код Robby:

Code: Select all

XM=(((XM)>>8) & #00FF)
который через Robby-байткод скомпилируется вот в такой 8080 код:

Code: Select all

\ *0x40
_j0024:
\ 0xF5
        PUSH_H
        LXI_H,  #0000
\ 0xF5
        PUSH_H
        LXI_H,  #0000
\ 0xF3
        CALL    _X_GET
\ 0xF5
        PUSH_H
        LXI_H,  #0008
\ 0xD0
        POP_D
        CALL SHIFTR
\ 0xF5
        PUSH_H
        LXI_H,  #00FF
\ 0xC0
        POP_D
        MOV_A,D
        ANA_H
        MOV_H,A
        MOV_A,E
        ANA_L
        MOV_L,A
\ 0xF4
        POP_D
        XCHG
        LXI_B, @BASE
        MVI_A,  #FF
        SUB_H
        JNZ     _l0004
        MOV_H,A
        LXI_B, @REGS
_l0004:
        CALL    _V_SET
        POP_H
тут например сразу же видно, что вот тут:

Code: Select all

        LXI_H,  #0000
\ 0xF5
        PUSH_H
        LXI_H,  #0000
можно опустить второй LXI_H, #0000 т.к. в HL уже 0 и далее:

Code: Select all

\ 0xF5
        PUSH_H
        LXI_H,  #00FF
\ 0xC0
        POP_D
        MOV_A,D
        ANA_H
        MOV_H,A
        MOV_A,E
        ANA_L
        MOV_L,A
можно заменить на

Code: Select all

MVI_H, 0
Первый PUSH_H и последний POP_H тоже можно убрать т.к. они бессмысленны...

P.S. Также можно опционально делать оптимизацию по размеру в ущерб скорости (скажем если надо утолкать большую программу Robby в небольшую память микрокомпьютера и на быстродействие наплевать), когда устойчивые конструкции типа:

Code: Select all

        MOV_A,D
        ANA_H
        MOV_H,A
        MOV_A,E
        ANA_L
        MOV_L,A
будут заменяться на вызов подпрограмм типа CALL HL_AND_DE

P.P.S. Хотя наверное будет проще научить ROBBYCC распознавать паттерны в длинных выражениях (коды операций не совпадают с кодами команд поэтому теоретически их можно отнести к одному классу и работать с ними единообразно), а для опциональной оптимизации по размеру добавить в __RULES условную компиляцию, чтобы для каждой команды одновременно описывались бы быстрая версия и компактная версия...
С другой стороны отдельная утилита для peephole-оптимизации выглядит интересным решением - вот ещё:

Code: Select all

        LXI_H,  #0000
\ 0xF3
        CALL    _X_GET
превращается в

Code: Select all

       LHLD @BASE+0 \ тут утилита может посчитать конкретный адрес и сразу вставить его в генерируемый код
а

Code: Select all

\ 0xF5
        PUSH_H
        LXI_H,  #0008
\ 0xD0
        POP_D
        CALL SHIFTR
в

Code: Select all

MOV_D,H
MOV_E,L
MVI_L,       8
CALL         SHIFTR
( а вот если бы это был сдвиг влево на 8 бит, то это можно было просто заменить на MOV_H,E и MVI_L, 0 : )

Вобщем интересно получается :)

P.S. По большому счёту такую оптимизацию логично применять только к длинным выражениям, которые в __RULES уже описаны отдельно от других команд RobbyVM и поэтому наверное можно этот самый peephole затолкать в ту же самую утилиту кросс-компиляции ROBBYCC, применяя оптимизацию каждый раз, когда очередное выражение готово, а правила конверсии завести в том же файле __RULES - так сказать всё в одном чтобы было (плюс эту оптимизацию можно включать специально с помощью новой опции -O).

P.P.S. Опция -O уже занята, так что пусть будет -T...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23657
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Старая тема про nedoPC SDK (август 2004)

Post by Shaos »

Да, вот он обработчик expr стоящий отдельно в ROBBYCC:

Code: Select all

  if(!strcmp(s,"expr"))
  {
     k = ro[cur++];
     for(i=0;i<k;i++)
     {
        j = ro[cur++];
        sprintf(str,"0x%2.2X",j);
        if(j==0xF5)
        {
           sh = (signed short*)&ro[cur];
           w[1] = *sh;
           cur += 2;
           i += 2;
        }
        l = Find("EXPR",str);
        if(l==NULL) return 0;
        Comment(str);
        if(Write(l->next)<0) return 0;
     }
     return 1;
  }
В случае включения оптимизации опцией командной строки -T (оптимизация по времени) можно вместо посылания в выходной файл через Write, накопить выхлоп в односвязном списке строк Text и пробежаться по нему ища паттерны из peephole, которые будут описаны в конце __RULES (держать всё в одном файле логично т.к. эти паттерны peephole будут зависеть от правил генерации кода находящихся в том же файле __RULES) и уже потом заслать результат на выход через Write...

P.S. Кстати вот эта фигня на big-endian машинах будет работать неправильно:

Code: Select all

sh = (signed short*)&ro[cur];
Чтобы работало везде надо заменить этот код на:

Code: Select all

sh = ro[cur] | (ro[cur+1]<<8);
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23657
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Старая тема про nedoPC SDK (август 2004)

Post by Shaos »

Вот примерно так будет выглядеть секция *PEEPHOLE в конце LIB/I8080/__RULES - правила разделяются строчками с минусами, а внутри каждого правила то, что было до и то, что будет после разделяются знаком равно:

Code: Select all

// Peephole optimization rules (Aug 2024)
*PEEPHOLE
--------
        LXI_H,  #FF0A
        CALL    _X_GET
=
        LHLD    @REG_A
--------
        LXI_H,  #FF0B
        CALL    _X_GET
=
        LHLD    @REG_B
--------
        LXI_H,  #FF0C
        CALL    _X_GET
=
        LHLD    @REG_C
--------
        LXI_H,  #FF0E
        CALL    _X_GET
=
        LHLD    @REG_L
--------
        LXI_H,  %w1p
        CALL    _X_GET
=
        LHLD    %base+%w1p+%w1p
--------
*END
%w1p будет означать слово, если оно положительное (если вдруг прочиталось отрицательное, то игнорируем и идём дальше)

P.S. Чото неохота мне делать арифметику в __RULES так что наверное опишу короткие варианты только для первых скажем 100 переменных...

P.P.S. Заодно у пользователей SDK появится возможность делать ассемблерные вставки без вычисления адреса переменной если это одна из первых 100 переменных - можно будет просто использовать LHLD @VAR_99 для чтения и SHLD @VAR_99 для записи (с номером от 0 до 99 - в сгенерённом ассемблерном коде будут 100 EQU с уже подсчитанными адресами)

P.P.P.S. А можно научить ассемблерные вставки понимать &VAR (по аналогии с SAY) - чтобы при кросскомпиляции оно подменялось на @VARn...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23657
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Старая тема про nedoPC SDK (август 2004)

Post by Shaos »

Добавил в репу Makefile и nedomake-скрипт Linux.N для сборки всего-всего под линух (но пока без peephole):

Screenshot from 2024-08-04 15-11-54.png
Screenshot from 2024-08-04 15-11-54.png (25.92 KiB) Viewed 1915 times

Теперь у кого есть желание может попробовать поиграться с nedoPC SDK, а мне наверное какую-никакую доку с туториалом надо начать писать потихоньку :rotate:

P.S. Немного упростил инструкцию по сборке - теперь предлагается клонировать репу в директорию с именем nedoPC.org :mrgreen:

P.P.S. Также сделал чтобы http://nedoPC.org/sdk форвардило на недовики-страничку http://www.nedopc.org/nedopc/SDK/About (на которой пока ничего нету), чтобы окончательно всех запутать...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23657
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Старая тема про nedoPC SDK (август 2004)

Post by Shaos »

Доку наверное надо городить на недовики - вот думаю по языку Robby и по самому SDK всё свалить в одну викигруппу SDK - типа будут статьи SDK/NEDOMAKE, SDK/ROBBYC, SDK/ROBBYCC, SDK/IF, SDK/FOR, SDK/RET и т.д. на двух языках (ENG и RUS) и с перекрёстными ссылками друг на друга, и, наверное, надо иметь страничку, где все эти мелкие статьи будут склеены вместе, чтобы можно было разом всё распечатать (для некоторых это всё ещё актуально?), типа вот такого: http://robots.chat.ru/rw1_r.html

P.S. Или всё-таки вики прям на гитлабе держать?...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23657
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Старая тема про nedoPC SDK (август 2004)

Post by Shaos »

Что-то запал на исходе похоже - надо что ли как-то по-быстрому закончить допиливание SDK и пойти заниматься другими вопросами:
Attachments

Screenshot from 2024-08-11 21-17-03.png
Screenshot from 2024-08-11 21-17-03.png (5.48 KiB) Viewed 1666 times

Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23657
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Старая тема про nedoPC SDK (август 2004)

Post by Shaos »

Уже 3 недели ничего не деланья...
Attachments

Screenshot from 2024-08-25 23-14-18.png
Screenshot from 2024-08-25 23-14-18.png (5.19 KiB) Viewed 1406 times

Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23657
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Старая тема про nedoPC SDK (август 2004)

Post by Shaos »

4 недели ничего не деланья...
Attachments

Screenshot from 2024-09-01 20-18-11.png
Screenshot from 2024-09-01 20-18-11.png (5.65 KiB) Viewed 1259 times

Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
shiny
Maniac
Posts: 324
Joined: 14 Oct 2023 13:59

Re: [SDK] Старая тема про nedoPC SDK (август 2004)

Post by shiny »

Кстати, а Millfork на форуме обсуждался?
User avatar
Shaos
Admin
Posts: 23657
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Старая тема про nedoPC SDK (август 2004)

Post by Shaos »

Вот тут немножко было: viewtopic.php?f=93&t=18842&p=173994&hil ... rk#p173994
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
shiny
Maniac
Posts: 324
Joined: 14 Oct 2023 13:59

Re: [SDK] Старая тема про nedoPC SDK (август 2004)

Post by shiny »

Кстати, однажды говорили за sjasmplus(не нашел этого сообщения). Yе надо указывать device, достаточно добавить OUTPUT filename
User avatar
Shaos
Admin
Posts: 23657
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Старая тема про nedoPC SDK (август 2004)

Post by Shaos »

Не надо ничего указывать, надо юзать ZMAC :lol:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
shiny
Maniac
Posts: 324
Joined: 14 Oct 2023 13:59

Re: [SDK] Старая тема про nedoPC SDK (август 2004)

Post by shiny »

ууу, это не наши методы(:
User avatar
Shaos
Admin
Posts: 23657
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Старая тема про nedoPC SDK (август 2004)

Post by Shaos »

Надо уже что-то поделать для SDK, а то пока я что-то непонятное рисую на графике активности GitLab, изредка пушая в другие репы:
Attachments

Screenshot from 2024-09-21 17-23-39.png
Screenshot from 2024-09-21 17-23-39.png (5.64 KiB) Viewed 920 times

Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23657
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: [SDK] Старая тема про nedoPC SDK (август 2004)

Post by Shaos »

Продолжаю рисовать прямые линии и яркие точки на диаграмме активности в гитлабе :lol:
Attachments

Screenshot from 2024-09-28 23-05-17.png
Screenshot from 2024-09-28 23-05-17.png (5.73 KiB) Viewed 752 times

Я тут за главного - если что шлите мыло на me собака shaos точка net
Post Reply