|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Author |
Message |
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22606 Location: Silicon Valley
|
| | | | vital72 wrote: покодил пару часов и получилось нописать дизассм в 1231 байт. мне интересно глянуть на код дизассма в 1 килобайт ... говнокодил не долго, на все инструкции не тестировал. использует внутренние вызовы Монитора, но это не должно быть проблемой, т.к. для Монитора и писалось. использует внутренний буфер Монитора для ввода стоки. сейчас нет обработки Ctrl+C, но проблем добавить быть не должно, код как раз писался как шаблон. логика полностью скопирована из моего же дизассма на JS. если что-то не компилируется: я использую немного модифицированный компилятор с сайта https://www.asm80.com/, пока свой компилер не написал, приходится использовать чужое. | | | | |
О - круто, спасибо! P.S. Спрятал простыню под спойлер
|
07 Feb 2024 13:31 |
|
|
vital72
Senior
Joined: 17 Jun 2014 04:29 Posts: 138 Location: 93.80.157.217
|
да, зобыл нописать. вход: HL -- адрес начала блока DE -- адрес конец блока вызов по метке disassm ну это по коду вроде понятно, вобщем, как параметры в Мониторе по регистрам раскладываются, так и тут.
_________________https://radio-86rk.ruкто я такой, чтобы спорить с самим собой
|
07 Feb 2024 13:35 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22606 Location: Silicon Valley
|
Да, хитро' написано Можно попробовать 135 байт сэкономить, храня слова по 5 бит на букву - это 4 символа в 20 битах (т.е. не кратно байту) вместо теперешних 32. А можно ещё и статистически подойти к вопросу поглядев на распределение вероятностей: Как можно видеть реально используются только 22 латинские буквы вместо 26 (плюс пробел) - если тупо математически, то это 22^4=234256, что умещается в 18 битах - уже экономия 157 байт (хотя тот факт, что оно не кратно байту добавит лишнего кода), а если ещё и отсортировать по частоте: то можно типа какого-то микрохаффмана организовать пользуясь этой информацией: | | | | Code: Space,10 C,1110 R,1101 L,0101 A,0100 I,0011 P,0001 D,0000 S,11111 N,11001 H,11000 M,01110 X,01101 J,01100 O,00100 T,111101 Z,111100 E,011111 U,001011 B,001010 V,0111101 K,01111001 G,01111000
| | | | |
что даст: однако из-за того, что нам надо одинаковое смещение между словами, то придётся брать максимум из получившегося, а это 22 бита - округляем до 24, что есть 3 байта на слово или 270 байт на весь словарь, что даёт выгоду только в 90 байт по сравнению с первоначальным вариантом. Можно комбинированный вариант сделать - быстро получаем доступ к коротким словам и чуть более долгий для длинных - скажем 20 бит и меньше храним вместе и 21-22 - храним отдельно. Выходит, что отдельно идут только: и этот вариант всё равно получается хуже, чем первый, значит нафиг микрохаффмана - проще всего пойти по 5-битному пути на букву (первый вариант). Однако если наплевать на быстродействие и просто расположить все мнемоники битовой цепочкой, то с использованием микрохаффмана они займут всего 179 байт т.е. экономя 181 байт - почти в 2 раза меньше! Однако ещё надо прикинуть сколько будет весить код, раскодирующий эти мнемоники деревом...P.S. Можно двух и трёх-буквенные мнемоники сделать "быстрыми", а четырёхбуквенные (18 штук) - медленными: в таком случае таблица быстрых мнемоник будет храниться в 3*5=15 битах на слово и 16-й бит будет означать, что нужно откуда-то вычитать четвёртую букву, т.е. это будет 90*2=180 байт плюс логика "дописывания" четвёртой буквы (надо прикинуть сколько байт она может занять и стоит ли оно вообще того). Четвёртых букв у нас только 9: и ещё у 8085-х инструкций надо пометочку поставить, что они не родные... P.P.S. Сложноватая логика потребуется, чтобы четвёртую букву программно дописывать: | | | | Code: STAX 02,12 LDAX 0A,1A SHLD 22 LHLD 2A PUSH C5,D5,E5,F5 SPHL F9 XCHG EB XTHL E3 PCHL E9 CALL CD DSUB 08 * ARHL 10 * RLDE 18 * LDHI 28 * LDSI 38 * RSTV CB * SHLX D9 * LHLX ED *
4th letter: L -> F9,E3,E9,CD,10 X -> 02,12,0A,1A,D9,ED I -> 28,38 D -> 22,2A V -> CB H -> C5,D5,E5,F5 G -> EB E -> 18 B -> 08
| | | | |
я там звёздочки поставил у четырёхбуквенных инструкций от 8085, а вот остальные:
|
07 Feb 2024 21:43 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22606 Location: Silicon Valley
|
Обработал исходник напильником (выкинув макрос), чтобы собиралось с помощью vinxru-шного pdp11asm (2017) - сейчас убедюсь, что работает и выложу... вроде работает Вот эту функцию ещё упростил, а то pdp11asm не понимает high/low - было: стало:
|
07 Feb 2024 23:47 |
|
|
vital72
Senior
Joined: 17 Jun 2014 04:29 Posts: 138 Location: 93.80.157.217
|
подумалось. если в таблице disassm_table_8085 вместо индекса мнемоники всунуть саму мнемонику, то можно сократить розмер примерно на 80 байт update тьфу ты не можно сократить. исчо не проснулсо
_________________https://radio-86rk.ruкто я такой, чтобы спорить с самим собой
|
08 Feb 2024 00:01 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22606 Location: Silicon Valley
|
саму мнемонику всмысле слово? по идее мой бредовый вариант туда можно попробовать воткнуть где в 2 байта уталкивается 3 буквы и битик говорящий, что есть четвёртая буква (которая добивается программно) P.S. pdp11asm вот так умеет: тут я слово MOV утолкал в 2 байта и +32768 ещё надо сделать для четырёхбуквенных слов
|
08 Feb 2024 00:04 |
|
|
vital72
Senior
Joined: 17 Jun 2014 04:29 Posts: 138 Location: 93.80.157.217
|
high/low можно заменить на это: или аналогичные операторы, которые есть в асме
_________________https://radio-86rk.ruкто я такой, чтобы спорить с самим собой
|
08 Feb 2024 00:13 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22606 Location: Silicon Valley
|
не - pdp11asm так не умеет /256 умеет, а >>8 или &255 - нет надо чтоли будет добавить это в мой форк, который pdp11asm85... P.S. Добавил 9 февраля 2024 года
|
08 Feb 2024 00:17 |
|
|
vital72
Senior
Joined: 17 Jun 2014 04:29 Posts: 138 Location: 93.80.157.217
|
добавление одно байта на строчку в таблицу disassm_table_8085 вздует эту таблицу на 256 байт, в то время как все мнемоники занимают 360 байт
_________________https://radio-86rk.ruкто я такой, чтобы спорить с самим собой
|
08 Feb 2024 00:21 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22606 Location: Silicon Valley
|
ну т.е. есть экономия? 360-256=104
|
08 Feb 2024 00:30 |
|
|
vital72
Senior
Joined: 17 Jun 2014 04:29 Posts: 138 Location: 93.80.157.217
|
это без учёта кода, который будет всё это обрабатывать.. как бы он не вышел больше
_________________https://radio-86rk.ruкто я такой, чтобы спорить с самим собой
|
08 Feb 2024 00:36 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22606 Location: Silicon Valley
|
да, тяжеловатый код получается
тогда можно оставить табличку мнемоник отдельно, но сохранять одну букву в 5 бит тогда 4 буквы займут 20 бит - с округлением до 24 бит это будет 3 байта - выгода в 90 байт плюс есть 4 бита на каждое слово куда можно дополнительные флаги положить (типа метка инструкции для 8085 и что-то для Human Readable объяснялок)
P.S. человеческие объяснялки, которые хотелось бы добавить как комментарий: 1) MVI r,n ; r = n ; char 2) MOV r1,r2 ; r1 = r2 3) LXI rr,w ; rr = w 4) STA w ; [w] = A 5) LDA w ; A = [w] 6) STAX rr ; [rr] = A 7) LDAX rr ; A = [rr] 8) SHLD w ; [w] = L ; [w+1] = H 9) LHLD w ; L = [w] ; H = [w+1] 10) SPHL ; SP = HL 11) XCHG ; DE <-> HL 12) XTHL ; HL <-> [SP] 13) PCHL ; PC = HL 14) INR r ; r = r + 1 15) DCR r ; r = r - 1 16) INX rr ; rr = rr + 1 17) DCX rr ; rr = rr - 1 18) CMC ; INVERT FC 19) STC ; SET FC 20) CMA ; A = ~A 21) ADD r ; A = A + r 22) ADI n ; A = A + n ; char 23) ADC r ; A = A + r + FC 24) ACI n ; A = A + n + FC ; char 25) SUB r ; A = A - r 26) SUI n ; A = A - n ; char 27) SBB r ; A = A - r - FC 28) SBI n ; A = A - n - FC ; char 29) ANA r ; A = A AND r 30) ANI n ; A = A AND binary 31) ORA r ; A = A OR r 32) ORI n ; A = A OR binary 33) XRA r ; A = A XOR r 34) XRI n ; A = A XOR binary 35) CPI n ; A == n ; char 36) CMP r ; A == r 37) RLC ; A LEFT CIRC 38) RAL ; A LEFT FC 39) RRC ; A RIGHT CIRC 40) RAR ; A RIGHT FC 41) RST n ; CALL n*8 42) xxxx ; 8085 43) нет объяснялки чото много получается...
P.P.S. Возможно надо исключить те инструкции, которые единичные (типа CMC или RLC) - по ним тип объяснялки будет "смотри по коду" - тогда укладываемся в 5 бит:
0) нет объяснялки (в этом случае даже ; не печатается) 1) "смотри по коду" (см. список таких инструкций ниже по тексту) 2) xxxx ; 8085 (специфичная для 8085 проца инструкция НЕ объясняется, а просто обозначается как чужеродная) 3) MOV r1,r2 ; r1 = r2 4) LXI rr,w ; rr = w 5) STA w ; [w] = A 6) LDA w ; A = [w] 7) STAX rr ; [rr] = A 8) LDAX rr ; A = [rr] 9) SHLD w ; [w] = L ; [w+1] = H 10) LHLD w ; L = [w] ; H = [w+1] 11) INR r ; r = r + 1 12) DCR r ; r = r - 1 13) INX rr ; rr = rr + 1 14) DCX rr ; rr = rr - 1 15) CMP r ; A == r 16) CPI n ; A == n ; char 17) MVI r,n ; r = n ; char 18) ADD r ; A = A + r 19) ADI n ; A = A + n ; char 20) ADC r ; A = A + r + FC 21) ACI n ; A = A + n + FC ; char 22) SUB r ; A = A - r 23) SUI n ; A = A - n ; char 24) SBB r ; A = A - r - FC 25) SBI n ; A = A - n - FC ; char 26) ANA r ; A = A AND r 27) ANI n ; A = A AND binary 28) ORA r ; A = A OR r 29) ORI n ; A = A OR binary 30) XRA r ; A = A XOR r 31) XRI n ; A = A XOR binary
(как можно видеть в первой половине таблицы есть только варианты со словами, регистрами и регистровыми парами, а во второй - с регистрами, с байтами выводимыми как символы либо выводимыми в бинарном виде)
Варианты для "смотри по коду" только статические: - SPHL ; SP = HL - XCHG ; DE <-> HL - XTHL ; HL <-> [SP] - PCHL ; PC = HL - CMC ; INVERT FC - STC ; SET FC - CMA ; A = ~A - RLC ; A LEFT CIRC - RAL ; A LEFT FC - RRC ; A RIGHT CIRC - RAR ; A RIGHT FC - RST 0 ; CALL #0000 - RST 1 ; CALL #0008 - RST 2 ; CALL #0010 - RST 3 ; CALL #0018 - RST 4 ; CALL #0020 - RST 5 ; CALL #0028 - RST 6 ; CALL #0030 - RST 7 ; CALL #0038
|
08 Feb 2024 00:57 |
|
|
b2m
Devil
Joined: 26 May 2003 06:57 Posts: 863
|
Заменить одну жирную таблицу 512 байт на две 256+89 (т.е. вынести атрибуты команды в отдельную таблицу). Экономия примерно 160 байт.
_________________Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
|
08 Feb 2024 00:59 |
|
|
b2m
Devil
Joined: 26 May 2003 06:57 Posts: 863
|
Усложнится код. Достаточно использовать для конца строки старший бит последнего символа (вместо пробела), уже 89 байт сэкономим.
_________________Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
|
08 Feb 2024 01:01 |
|
|
b2m
Devil
Joined: 26 May 2003 06:57 Posts: 863
|
Условия NZ,Z,NC,... тоже можно как параметр команды сделать, уменьшится количество опкодов на 21. С учётом всех таблиц примерно 180 байт. Кода добавится немного.
_________________Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
|
08 Feb 2024 01:05 |
|
|
|
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
|
|