Просмотр полной версии : Обфускация кода / Плюшки команды RST 7
Радио-86РК
09.12.2019, 01:31
Привeтствую!:v2_dizzy_heart:
Ужe создавал тему (https://zx-pk.ru/threads/29170-idealnyj-%C2%ABusr%C2%BB-vektor-ili-probivaem-%C2%ABkrasivye%C2%BB-nomerochki-%C2%ABabonentu-usr%C2%BB.html), но стоит подойти к вопросу под другим углом…
Если брать дамп оригинального «МОНИТОРа» и попытаться найти в нём все коды «FF» для «RST 7», то их насчитывается не так уж и мало:
FA56 FAB7 FAB9 FAC9 FACB FBF6 FC05 FDC3
.... .... .... .... .... ....-1019 -573
FDE7 FE4D FEB0 FEDD FF0F FF15 FF20 FF26
-537 -435 -336 -291 -241 -235 -224 -218
FF2F FF35 FF4D FFD5 FFEC FFFC FFFE FFFF
-209 -203 -179 -43 -20 -4 -2 -1Причём, чем короче числовой индекс, тем легче его запомнить.
Так, в Бейсиках часто использовались функции МОНИТОРа «F803» и «F81B» с обращением к ним через «usr(-2045)» и «usr(-2021)» соответственно…
И я задумался, а что если пропатчить Бейсик так, чтобы по адресу «0038» располагалась особая процедура, которая будет использовать ближайший адрес возврата за опциональный индекс?
Или же вот так:
org 00100h
; Если за RST 7 следует КОИ-7 - просто печатаем текст
db 0FFh,'ПРИВЕТ!',0
; Если за RST 7 следует код 80h-91h - переходим на адрес
; jmp (0F800h + 3 * (код - 128))
db 0FFh,81h ; Вызов 0F803h
P.S.: Если тема интересна, обсудим всё более подробнее…;)
HardWareMan
09.12.2019, 06:15
А что если мы пользовались подобными методами в своих программах еще 30 лет назад? Да и сами не придумали их - подсмотрели в ED^7000 для Специалиста.
https://pbs.twimg.com/media/EE6dhBjW4AADB4R.jpg:large
NEO SPECTRUMAN
09.12.2019, 08:01
мне еще все время попадается вариация подобного
в виде
call procedure_1
defb data4procedure_1
- - - Добавлено - - -
А так rst это хорошо...
но почамуто часто на месте обработчиков рстов лежит чьето унылое пзу...
HardWareMan
09.12.2019, 18:41
NEO SPECTRUMAN, потому, что есть XTHL, про которую мало кто знает и тем более использует. А по сути она просто волшебная палочка.
Spectramine
09.12.2019, 19:41
На Спектруме это стандартный прием. Несколько RST читают данные в коде после их вызовов. Ну и в играх CALL тоже часто.
NEO SPECTRUMAN
10.12.2019, 03:30
что есть XTHL
при мне просьба не выражаться
а употреблять понимаемое обычными людьми EX (SP),HL :)
которое несет СУТЬ в отличии от vjxhdsbc
(кстате в мануале на всякие ia64 по моему тонны именно таких команд)
Так в ia64 команд уже столько, что алфавит закончился, пора на иероглифы переходить.
NEO SPECTRUMAN
10.12.2019, 06:11
Так в ia64 команд уже столько, что алфавит закончился
если думать головой то алфавит не кончится
ну а если для каждого
ld a,nn
ld a,r
ld a,(**)
ld a,(**+nn)
ld a,(**+r)
ld a,(**+(**))
ld (**),r
ld (**),nn
выдумывать свою уникальную мнемонику
типа
ldai nn
mov a,r
ldax
ldaxdi nn
ldaxdr r
ldaxdx **
strx r
strxi nn
то никаких вам иероглифов не хватит...
конечно в сравнении 6502 со своим "все мнемоники должны быть длиной 3 буквы"
вообще садомазо
HardWareMan
10.12.2019, 08:02
при мне просьба не выражаться
а употреблять понимаемое обычными людьми EX (SP),HL :)
которое несет СУТЬ в отличии от vjxhdsbc
(кстате в мануале на всякие ia64 по моему тонны именно таких команд)
Что не так с EXchange Top with HL? А, нуда, английский для нас не родной. Тогда всё норм.
- - - Добавлено - - -
выдумывать свою уникальную мнемонику
***
то никаких вам иероглифов не хватит...
:v2_dizzy_facepalm: Ты бы хоть ознакомился с базовыми знаниями, например тут (https://zxpress.ru/book_articles.php?id=1100). Ну и если такой хейт к английскому то пиши на русском:
ЗАГР А,ПП
СОХР ПП,А
СРАВ А,Р
ПРЫГ ААА
И тому подобное, табличный ассемблер же позволяет. Не следует путать ассемблер и ЯВУ, не обязан ассемблер быть похожим на ЯВУ. Тем более что ты по любому используешь С и выше и этот самый ассемблер видишь только в листингах.
В многочисленных версиях микрософтовского бейсика 3.2 (оригинал 1975), в т.ч. для микро-80 и в микроне одна из самых используемых процедур - RST 1. Она проверяет, совпадает ли следующий символ в программе с символом после RST 1.
HardWareMan
10.12.2019, 11:19
ivagor, бейсики в принципе юзают практически полный набор из RST. Но они и загружаются в 0000.
Варианты basic 3.2 используют в качестве процедур RST1-RST6. RST0 обычно рестарт, RST7 или резерв или обработка аппаратного прерывания, если оно есть. RST 1 я упомянул т.к. именно эта процедура использует идею с размещением аргумента процедуры после команды ее вызова, про которую написал топикстартер (и сделано это было в 1975). Все эти бейсики условно можно поделить на 2 части: 1) оригинальную микрософтовскую, в которой код очень плотный и 2) машиннозависимую, которая обычно довольно рыхлая и ее при наличии желания можно оптимизировать и по скорости и по размеру. Микрософтовскую часть тоже можно оптимизировать, но в основном по скорости, по размеру гораздо сложнее.
- - - Добавлено - - -
Уточню, условная вторая часть ("не микрософтовская") не всегда полностью машиннозависимая, там еще бывают сервисные возможности.
NEO SPECTRUMAN
10.12.2019, 13:19
Ты бы хоть ознакомился с базовыми знаниями,
да боже
те что я не знаю (из мануала)
сам и так догадался из сокращения...
а иметь на каждый пчих свою уникальную мнемонику это аутизм
Что не так с EXchange Top with HL?
что за топ?
есть топ стека
хорошо а теперь расшифруй где здесь HL а где здесь DE
XCHG
теперь представь что нужно придумать мнемоники для команд в новой версии проца
EX BC,HL
EX BC,DE
EX AF,SP
да хоть
EX B,E
EX BD,AH
EX CD,(AB) (Не пришлось выдумывать ничего нового. Смысл команд прекрасно понятен)
сделай по аналогии с 8080 ересью варианты этих команд
не высасывая х****ы из пальца
конечно в z80 есть тоже редкостный бред
типа
EXX
JP (HL) (который по факту JP HL а jp (HL) должна быть совершенно другой командой)
итд
в новомодных ez80 местами берут пример с 8080 и городят херню...
...
- - - Добавлено - - -
еще мне нравиться вот это
MOV A,M LD A,(HL)
LDAX B LD A,(BC)
LDAX D LD A,(DE)
тоесть из BC DE мы загружаем
а из HL которое почему то зовется M мы перемещаем (не надо мне еще рассказывать что такое М тк и так есно)
про нелогичность самого MOV говорить не буду
тк по идеи если мы перемещаем из одного места в другое
то на месте от куда мы переместили по идеи ничего быть уже не должно...
Опять и снова по 100500-ому кругу https://vk.com/emoji/e/f09f9988.png
NEO SPECTRUMAN
10.12.2019, 13:36
Опять и снова по 100500-ому кругу
Доа так и есть
тяжело быть злостным ненавистником мнемоник и8080 :)
- - - Добавлено - - -
И тому подобное, табличный ассемблер же позволяет. Не следует путать ассемблер и ЯВУ, не обязан ассемблер быть похожим на ЯВУ. Тем более что ты по любому используешь С и выше и этот самый ассемблер видишь только в листингах.
нет С я не использую
слегка про него читал...
...хотя нужно приобщаться
тк нужно вправлять мозги некоторым софтварям...
...да и кодить не на асме
меня просто коробит от того что в этих ваших яву нет аналогов jp nz jp c
когда нужно ими(яву) пользоваться
и что нужно городить какуето городуху для подобного
что то сравнивать итд...
ну и вообще как можно без флагов?...
Для вектора человек утомленный мнемониками 8080 написал альтернативный ассемблер с алгебраическим синтаксисом. В частности XTHL там HL.(SP) а XCHG - HL.DE
Споры про мнемоники похоже будут всегда, хотя мне кажется, что полная свобода по этому вопросу давно наступила. Можно программировать для 8080 с мнемониками z80 или даже наоборот. Для счастья не хватает только удобных и полнофункциональных конвертеров исходников 8080<->z80. Есть несколько вариантов, частично решающих данные задачи, но имхо идеального нет.
OrionExt
10.12.2019, 14:23
Обфуска́ция (от лат. ... obfuscate -делать неочевидным, запутанным, сбивать с толку) или запутывание кода - приведение исходного текста или исполняемого кода программы к виду, сохраняющему её функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции.
Чет не понял об чем тема. ТС решил запутать понятный код? RST для 8080 это классика. Или ТС решил потролить с железякой - обфускацией?
Не документированные команды - кому масло в коде. По мне бочка дегтя.
CP/M отлично работает на Z280. Придет время и стандартный биос MSX запущу на Z280 (c фиксами железной шины Z280).
Это споры из той же серии: какой язык лучше, русский или английский? Кто к какому привык.
Для меня совершенно бессмысленны портянки из однотипных унылых LD, мозгу не за что "зацепиться" при анализе такого листинга. Интеловский вариант более "человечный", мне одного взгляда на страницу с кодом достаточно для понимания "где мы находимся" и "о чём тут речь".
У кого-то "мышление робота" и ему понятнее чёткие монотонные конструкции "LD xx,yy" - здоровья на.
Только к чему споры-то эти все? LD'шники лучше программируют или что?
Зачем спорить о мнемониках ассемблера? Напишите свой с собственной мнемоникой и своими макро и пользуйтесь на здоровье. Процессор понимает и выполняет КОДЫ! Как вы их обзовете ему вообще фиолетово. Кстати, ничто не мешает написать для любого проца и ассемблер с русской мнемоникой. По моему скромному разумению "Прыг" это прикольно :)
Единобразие нужно как раз ЯВУ. И вот здесь проблема в том, что они генерят разные строки и поэтому один и тот же компилятор нельзя использовать для разных архитектур( об оптимизации скромно умолчим, она конечно не может быть единобразной). А два разных компилятора одного ЯВУ могут генерить совершенно различный код. Человеческие языки в дискуссию не втягиваем, у них функции в разы разнообразней.
Зачем спорить о мнемониках ассемблера?
Простые задачки решать проще, чем сложные. Поэтому километры форумов и ноль строчек кода..(
Радио-86РК
10.12.2019, 15:59
Кaк-то уже писал свой транслятор с ассемблера, в котором опкод - i8080, а мнемоника - x86.
И знаете что? Отлаживать свои программы стало легче!
Так как я их стал писать в MSVC внутри «_asm {…}», а потом копировал и транслировал в код ВМ80:
mov al,[bx] === mov a,m
xchg bx,[sp] === xthl
jmp bx === pchl
add bx,dx === dad de
Кстати, вот накидал тут кода:
prompt equ 0F86Ch
puta equ 0F815h
puts equ 0F818h
THE_PSW EQU 07FFEH
THE_HL EQU 07FFCH
JRNZ EQU 0C7H
JRZ EQU 0CFH
JRNC EQU 0D7H
JRC EQU 0DFH
org 0
; Эта крошечная утилита с оригинальным трюком
; использования RST-команд.
; Возможность выбора точки старта программы посредством
; директивы <G0>..<G38>-МОНИТОРа.
; Возможность вызова нужной подпрограммы при помощи
; функции <USR(0..56)>-БЕЙСИКа.
; Вызов дополнительного API из любой части остального
; приложения посредством <RST 0>..<RST 7>
ORG 00000H
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
; Здесь располагается обработчик программных прерываний и системных вызовов.
; Через "МОНИТОР" из-вне имеется 57 точек входа директивой G0-G38 для запуска
; программы в различных режимах.
; Внутри программы эти вызовы дублируют API "МОНИТОРа" и дополняют его.
ORG 00038H
SHLD THE_HL ; Сохраняем HL-пару
PUSH PSW ; Затем, посредством
POP H ; регистровой пары HL
SHLD THE_PSW ; сохраняем и PSW
LXI H,08A00H; Проверяем указатель стека:
DAD SP ; Предустановил ли его МОНИТОР?
POP H
JC START ; Значит это "холодный старт"
MOV A,H
ADD A ; Проверим, прикладной ли вызов?
JNZ THE_APP ; Приложение вызывает наш API
JC MON_RST ; Значит один из FF МОНИТОРа
MVI A,TAPIS ; Table of APIs
ADD L ; Иначе - это USR-вызов
MOV A,M
INX H
MOV H,M
XTHL
LHLD THE_PSW
PUSH H
POP PSW
LHLD THE_HL
RET
THE_APP:MOV A,M ; Вызов из приложения
XRI 080H ; Если укладывается в KOI-7
JM PRINT ; Просто печатаем сообщение
INX H
PUSH H ; Сейчас проверим следующий байт
SUI 012H ; Одна из стандартных 18 точек
JC THE_MON ; МОНИТОРа?
ADD A
MVI H,THE_API >> 8
MOV L,A
MOV A,M
INX H
MOV H,M
MOV L,A
XTHL
RET
THE_MON:CMA
MOV L,A
ADD A
ADD L
MOV L,A
MVI H,0F8H
THE_RET:PUSH H
LHLD THE_PSW
PUSH H
POP PSW
LHLD THE_HL
RET
PRINT: PUSH H
PUSH B
CALL PUTS
POP B
INX H
JMP THE_RET
TAPIS: DW PROMPT
DW 0,0,0,0,0,0,0
DW 0,0,0,0,0,0,0,0
DW 0,0,0,0,0,0,0,0
DW 0,0,0,0,0,0,0,0
DW 0,0,0,0,0,0,0,0
DW 0,0,0,0,0,0,0,0
DW 0,0,0,0,0,0,0
START: LXI SP,075FFH
MOV C,L
DB 0FFH,1FH,'START:',0
MOV A,C
DB 0FFH,08AH
DB 0FFH,092HФокус в том, что при запуске через «G0…G38» указатель стека SP установлен в служебную область МОНИТОРа и программно легко это определить.
А вот при «CALL 00000h…00038h» указатель стека уже в области пользователя и получается, что и «RST 0» тоже работает как особая подпрограмма.
На ZX-Spectrum этот трюк не сработает, так как при СБРОСе SP никак не изменяется.
Но вот кодом «FF» я заполнял все 256 ячеек (исключения - 00038h и 00098h, где нужно вставить «JR»), а сам код начинался с 00100h.
OrionExt
10.12.2019, 16:16
Видимо автор не читал свой заголовок темы, критику и посты по теме. Или попутал в запале со своей соседней темой. А теперь в стиле зх.пк обсуждает чего-то другое.
Как нам было бы хорошо, если бы команды да для меня лично на понятном языке.
Гугл ассистент еще вспомним, и Эллочку-людоедку.
Кaк-то уже писал свой транслятор с ассемблера, в котором опкод - i8080, а мнемоника - x86.
Например Веремеенко (который еще писал про Dendy+спек) в zx-ревю писал про систему Трамплин, если не путаю.
; Возможность вызова нужной подпрограммы при помощи
; функции <USR(0..56)>-БЕЙСИКа.
1. Для какого бейсика это применимо, если у практически всех РКшных по этим адресам свои бейсиковские процедуры?
2. Что это дает? Экономию 2-3 байт на каждом вызове из программы на бейсике? Можно сделать еще лучше (проще и короче) если просто хакнуть usr или даже добавить специальный оператор или функцию. И главный вопрос - кто будет это использовать? Не припомню выкладывания новых программ на бейсике для РК за все время существования форума, хотя возможно я просто пропустил.
Даже если отвлечься от бейсика, то программа скорее похожа на троллинг. Если это было целью тогда поздравляю, получилось.
- - - Добавлено - - -
Например Веремеенко (который еще писал про Dendy+спек) в zx-ревю писал про систему Трамплин, если не путаю.
Похоже спутал, Веремеенко писал про мнемоники x86 для трансляции в код z80, не 8080. А про трансляцию мнемоник x86 в код 8080 возможно писали на форуме.
Радио-86РК
10.12.2019, 17:09
Видимо автор не читал свой заголовок темы, критику и посты по теме. Или попутал в запале со своей соседней темой.Ничегo не попутал. Просто проводил достаточно опытов на разных архитектурах.
1. Для какого бейсика это применимо, если у практически всех РКшных по этим адресам свои бейсиковские процедуры?Можно отследить, откуда вызов идёт. А в идеале - сам Бейсик хорошенечко подкорректировать.
2. Что это дает? Экономию 2-3 байт на каждом вызове из программы на бейсике? Можно сделать еще лучше (проще и короче) если просто хакнуть usr или даже добавить специальный оператор или функцию. И главный вопрос - кто будет это использовать? Не припомню выкладывания новых программ на бейсике для РК за все время существования форума, хотя возможно я просто пропустил.В ZX-Spectrum RST-фишки реализованы не совсем оптимально.
Оно и видно - начало 80-х. Сейчас Демо-сцена вытворяет вещи, невообразимые для тех лет.
https://youtu.be/oohkJ-Uc4tk
И Бейсики (всех архитектур) можно было переписать на уровне XXI века с куда широкими трюками.
Даже если отвлечься от бейсика, то программа скорее похожа на троллинг. Если это было целью тогда поздравляю, получилось.Вот уж не хотел троллить.
Видимо, когда одновременно занимаешься смежным кодом, он из смежного становится смешанным и всех путает.
В ZX-Spectrum RST-фишки реализованы не совсем оптимально.
Оно и видно - начало 80-х. Сейчас Демо-сцена вытворяет вещи, невообразимые для тех лет.
И Бейсики (всех архитектур) можно было переписать на уровне XXI века с куда широкими трюками.
Если это серьезный ответ, то я зря влез в обсуждение.
OrionExt
10.12.2019, 19:12
Чего меня беспокоить (движок форума)? ivagor?
Радио-86РК
12.12.2019, 21:27
Пo теме…
Не так давно использовал RST для необычной задачи…
Немногo оффтопа…
71002
Легенда
Никакие микросхемы не могут быть исправными на все 100%.
Соответственно, какие-то и греются сильнее. А в микросхемах ОЗУ это также может приводит к аномально быстрой потере заряда ячейками запоминающей матрицы…
Так как РУ6/РУ3 - матрицы 128×128, то достаточно регенерировать 128 ячеек перебором по RAS, что давно всем известно.
И пришла одна идейка, чтобы написать утилиту, которая отключает циклы ПДП на продолжительный, но управляемый период времени. Всё это время процессор активно регенерирует только 28 ячеек, считывая из них коды команд циклической задержки.
Как Вы уже догадываетесь, сложность вся заключалась в том, чтобы весь код программы размещался короткими секциями по 28 байт каждые 128 байт. Тем самым, код программы всегда будет храниться надёжно именно во всех каждых 28 байтах. Тогда как остальные 100 ячеек на всей протяжённости адресного пространства будут тихонечко разряжаться…
Утилита
Максимально компактно и писалась специально под все эти условия. С помощью RST-трюков удалось добиться её максимальной(относительно) плотности.
После запуска «G0»-директивой она:
Очищает экран и выводит содержимое буфера 50×25
Выводит текущее значение задержки
Позволяет пользователю курсорными клавишами настроить величину задержки
Нажатием на «ПРОБЕЛ» можно очистить буфер
Нажатием «ВК» отключается ПДП на период выбранной величины
Восстанавливает синхронизацию и переходит к шагу №1
При «0000» задержки никакой нет - минимальна.
При «FFFF» задержка максимальна, длительностью до десятка секунд…
P.S.: Если кому-то нравятся необычные программы, это - от меня…:v2_dizzy_indy:
NEO SPECTRUMAN
13.12.2019, 04:10
Можно программировать для 8080 с мнемониками z80
ну дык за это я и агитирую :)
У кого-то "мышление робота" и ему понятнее чёткие монотонные конструкции "LD xx,yy" - здоровья на.
это у 8080тчиков мышления робота
они умножают на $8 в шестнадцетиричной системе в голове
для них же просто очевидно что обработчик RST 5 лежит по адресу $28
в х86 асме тоже гафно
а там int-ов заметно побольше...
почему некоторые с "мышлением робота" додумались писать rst 28
а некоторые с мышлением человеков не додумались?
Утилита
А назначение-то утилиты какое? )
- - - Добавлено - - -
Оно и видно - начало 80-х. Сейчас Демо-сцена вытворяет вещи, невообразимые для тех лет.
Сейчас демо-сцена ничего такого не вытворяет) 90-е годы особо не переплюнуты)
Радио-86РК
13.12.2019, 05:03
А назначение-то утилиты какое? )Утилитарноe!:v2_dizzy_botan:
Жалко, эмуляторы не достаточно развиты в этом плане: Циклы регенерации памяти им не нужны и разработка программ под эмуляцию несколько отличается в плане упрощения…
А утилита эта написана и отлажена онлайн-эмулятором (http://rk86.ru/), но предназначается именно для реального «РАДИО-86РК» в железе. Помнится, на кассете у меня были программа теста ОЗУ и определения скорости по пилотону.
Вот эта утилита производит обратное: Она отключает ПДП нарочно, чтобы потом отобразить картину обрушения данных на физических микросхемах (не эмулируемых).
На самом деле, я пытался её писать десятилетиями!:v2_dizzy_vodka2:
Но не знал, как подойти. Дамп уж слишком большой получался - около килобайта. Тяжело было и визуально охватывать, и отлаживать…
А вот с помощью «RST» нашёл выход: Вместо «JMP» между секциями вставляю «RST», которая прыгает через 100 байтов вперёд.
Интересно то, что лет 20 тому назад опыта у меня не было для подобных трюков. А вот в этом году за ночь написал и отладил!:)
(Лет 15 назад для PC написал подобную утилиту с отображением графика биения частот компонентов ПК. К сожалению, только в чистейшем DOS работает и не терпит никаких эмуляций или виртуализации. То есть, сейчас её нормально запустить - проблема…)
P.S.: То есть, продолжаю на РАДИО-86РК писать программы в XXI веке!:v2_dizzy_sleep2:
P.S.: То есть, продолжаю на РАДИО-86РК писать программы в XXI веке!:v2_dizzy_sleep2:
Класс! Респект!
п.с. значит всё таки они существуют :)
HardWareMan
13.12.2019, 10:55
почему некоторые с "мышлением робота" додумались писать rst 28
а некоторые с мышлением человеков не додумались?
Потому-что с мышлением человеков поддерживают свой мозг в тонусе, а у с мышлением роботов он либо не имеет нужного функционала, либо уже жиром заплыл. Это самое логичное объяснение.
CodeMaster
13.12.2019, 11:36
чтобы потом отобразить картину обрушения данных на физических микросхемах
Зачем? (подвопрос: она это как-то графически отображает, помикросхемно?)
для PC написал подобную утилиту с отображением графика биения частот компонентов ПК
Тот же вопрос.
К сожалению, только в чистейшем DOS работает и не терпит никаких эмуляций или виртуализации. То есть, сейчас её нормально запустить - проблема…
На этом форуме этим не напугать.
либо уже жиром заплыл.
Машинным маслом же.
HardWareMan
13.12.2019, 14:23
Машинным маслом же.
Ну оно же жирное?
Радио-86РК
13.12.2019, 15:54
Зачем? (подвопрос: она это как-то графически отображает, помикросхемно?)A Вы шутник!
Программа - около 256 байтов: Желаете-с с музыкальным сопровождением-с и с аниме?;)
Тот же вопрос.Увлекался «торсионными полями» и решил написать программный аналог этой схемы (http://jnaudin.free.fr/html/tsd.htm)… Любой PC - и так куча кварцев же. Вот я тактовый генератор VGA с тактами процессора и попытался программно сплести в режиме реального времени. Типа, аналог биолокационных рамок в ноутбуке, только никаких внешних устройств не нужно. Когда её писал (около года), под рукой ноутбука не было. А потом и хард полетел. А месяц назад я эту программу всё-таки нашёл в своём профайле в одном из форумов: 11 лет считал утерянным свой труд!
Только вот запустить тяжело.
(На одном форуме один гражданин ею интересовался. И он далёк от кодинга.
То есть, копаться в её внутренностях не будет…)
Вот и под РАДИО-86РК тоже попытался написать подобное…
На этом форуме этим не напугать.
Это я знаю…:)
Класс! Респект!
Сейчас работаю над оконной подпрограммой.
Фокус в том, чтобы саму подпрограмму по адресам FCBA…FE00 переписать так, чтобы поддерживала произвольный размер оконной области.
То есть, это - не очередная библиотека со страниц журнала. И не переделка МОНИТОРа.
Даже «генератор бипа» на своём месте - FD27…FD37. Что очень сложно.
Производительность всей подпрограммы в целом - хуже. Это и так должны понимать.
Но вот мозги - реально работают намного сильнее, чем во всяких Питонах и в Си.
Если кому-то любопытно: Выложу в своей соседней теме код.
(Это не «торсионный» визуализатор - там скрывать нечего;))
Сейчас работаю над оконной подпрограммой.
Фокус в том, чтобы саму подпрограмму по адресам FCBA…FE00 переписать так, чтобы поддерживала произвольный размер оконной области.
То есть, это - не очередная библиотека со страниц журнала. И не переделка МОНИТОРа.
Я под РК мало программировал, не в курсе. Для РКшки есть оконный интерфейс?!
Там же памяти очень мало, некуда сохранять содержимое экрана под окнами....
CodeMaster
13.12.2019, 17:32
Желаете-с с музыкальным сопровождением-с и с аниме?
Желаю понять для чего она нужна, кроме самого факта использования хаков при программировании.
написать программный аналог этой схемы
Тут понятно что, не понятно правда зачем, но это уже не интересно.
HardWareMan
13.12.2019, 17:41
Я под РК мало программировал, не в курсе. Для РКшки есть оконный интерфейс?!
Там же памяти очень мало, некуда сохранять содержимое экрана под окнами....
Был, в журнале печатался. А мы его набирали на кружке на Специалистах. Я так и не понял зачем. Статья вроде "Монитор открывает окна".
"Монитор открывает окна".
Видимо, окна могут только открываться :)
Радио-86РК
13.12.2019, 23:18
Там же памяти очень мало, некуда сохранять содержимое экрана под окнами....Чтo Вы, сударь!
Даже в Windows имеются флаги стиля, чтобы принудительно сохранять содержимое окна. Хотя на практике, всеми этими WM_ERASE/WM_PAINT окна просто сами себя перерисовывают и не забивают память своей чепухой.
Не так давно я написал вариант оконной подпрограммы на РК в тех же FCBA, но она имеет защиту от дурака и использует дополнительную подпрограмму умножения на 78, которая хранится на месте кода многострадальной директивы «X»…
И её производительность меня сильно разочаровала, так как каждый символ там выводится после вычисления адреса по координатам.
(Естественно, на 78 умножал не циклом, а стопкой «DAD»-команд…)
И Escape-последовательность там демократична и поддерживает почти ANSI-формат вида «Esc+m,n,v+C», позволяя подгружать в ОЗУ свои библиотеки и через МОНИТОРную подпрограмму рисовать эскейпами псевдографические линии.
Желаю понять для чего она нужна, кроме самого факта использования хаков при программировании.Ну так интересно же из архитектуры выжимать максимум!
Тут понятно что, не понятно правда зачем, но это уже не интересно.Видно, эзотерика совсем не интересует?
Как тот же Befunge и BrainF*ck…:v2_dizzy_vodka2:
LeoN65816
14.12.2019, 00:38
(Естественно, на 78 умножал не циклом, а стопкой «DAD»-команд…)
Быстрое умножение на 78: 78*x=2*(2*2*2*(2*2*x+x)-x), умножение на два - арифметический/логический (не циклический!) сдвиг влево.
HardWareMan
14.12.2019, 08:26
Быстрое умножение на 78: 78*x=2*(2*2*2*(2*2*x+x)-x), умножение на два - арифметический/логический (не циклический!) сдвиг влево.
DAD H так и делает сразу для 16 бит. :)
Радио-86РК
14.12.2019, 12:07
Быстрое умножение на 78: 78*x=2*(2*2*2*(2*2*x+x)-x), умножение на два - арифметический/логический (не циклический!) сдвиг влево.Вoт так?
MUL_78: PUSH H ; (11 тактов)
MOV L,H ; ( 5 тактов)
MOV C,H ; ( 5 тактов)
XRA A ; ( 4 такта)
MOV H,A ; ( 5 тактов)
MOV B,H ; ( 5 тактов)
MVI D,0FFH ; ( 7 тактов)
MOV A,C ; ( 5 тактов)
CMA ; ( 4 такта)
MOV E,A ; ( 5 тактов)
INX D ; ( 5 тактов)
DAD H ; Y x 2 (10 тактов)
DAD H ; Y x 4 (10 тактов)
DAD B ; Y x 5 (10 тактов)
DAD H ; Y x 10(10 тактов)
DAD H ; Y x 20(10 тактов)
DAD H ; Y x 40(10 тактов)
DAD D ; Y x 39(10 тактов)
DAD H ; Y x 78(10 тактов)
POP C ; (10 тактов)
MVI B,0 ; ( 7 тактов)
DAD B ; Y + X (10 тактов)
RET ; 24 инструкции - 169 тактов
Традиционный (без вычитаний) аналог процедуры у меня получился на байт короче и на 2 такта быстрее. И не портит регистры A, B, C. Если портить A, то еще -1 байт.
- - - Добавлено - - -
А если портить и BC, то еще -1 байт и -16 тактов
- - - Добавлено - - -
И это не предел, еще получается оптимизировать и по размеру и по скорости.
blackmirror
14.12.2019, 16:50
Если этот код используется для текстового режима и есть ограничения на X и Y, то можно обойтись без 16 разрядных команд. К примеру, если X<78 а Y<36 (потому что 37*7>255), можно сделать примерно такой вариант(от START до RET самая длинная ветка):
START: A = Y
A /= 2
JNC Y_20
Y_31: A /= 2
H = A ;Y/4
A = X
JNC Y_20
Y_3: A += 192
JNC Y_0
H +=1
Y_0: L = A ;HL = X+Y*64
A = Y
A *= 2
A += Y
A *= 2
A += Y ;A=7*Y
A *=2
JNC Z_1
H += 1
Z_1: A += L
JNC Z_2
H += 1
Z_2: L = A ;HL = X+Y*64+Y*14
RET
Y_1: A += 64
JMP Y_0
Y_20: A /= 2
H = A ;Y/4
A = X
JNC Y_0
Y_2: A +=128
JMP Y_0
blackmirror, чтобы оценить скорость надо переводить в код, но размер можно и так прикинуть. Получается в 2-2.5 раза больше процедур с dad h.
Радио-86РК
14.12.2019, 20:06
Если этот код используется для текстового режима и есть ограничения на X и Y, то можно обойтись без 16 разрядных команд. К примеру, если X<78 а Y<36 (потому что 37*7>255), можно сделать примерно такой вариант(от START до RET самая длинная ветка):Мы тут в соревновашках что ли? ;)
Вот этот код:
L0: MVI H,29
L1: MVI L,77
L2: PUSH H
CALL MUL_78
LXI B,076D0H
DAD B
MVI A,02AH
XRA M
MOV M,A
POP H
DCR L
JP L2
DCR H
JP L1
JMP L0
;;;;;;;;;;;;;;;;;;;;;;;;
MUL_78: PUSH H ; (11 тактов)
MOV L,H ; ( 5 тактов)
MOV C,H ; ( 5 тактов)
MVI H,0 ; ( 7 тактов)
MOV B,H ; ( 5 тактов)
MVI D,0FFH ; ( 7 тактов)
MOV A,C ; ( 5 тактов)
CMA ; ( 4 такта)
MOV E,A ; ( 5 тактов)
INX D ; ( 5 тактов)
DAD H ; Y x 2 (10 тактов)
DAD H ; Y x 4 (10 тактов)
DAD B ; Y x 5 (10 тактов)
DAD H ; Y x 10(10 тактов)
DAD H ; Y x 20(10 тактов)
DAD H ; Y x 40(10 тактов)
DAD D ; Y x 39(10 тактов)
DAD H ; Y x 78(10 тактов)
POP B ; (10 тактов)
MVI B,0 ; ( 7 тактов)
DAD B ; Y + X (10 тактов) - 21:166 тактов
RET ; (11 тактов) - 22:177 тактов
; 25 байтовПолностью перемещаемый, так как не использует ветвлений.
В эмуляторе (т.е. - не точно) он показывает скорость около 88 кадров в минуту: 1,47 FPS - 3432 символа/сек.
То есть, для заполнения/сколлинга экрана никак не годится.
Правда, у меня были ещё процедурки рисования линии псевдографики, которые разово её используют.
Но они заполняют экран за 5 секунд (156×60).
И Бейсиком - за 5 секунд (128×50).
Графику тяжело оптимизировать (Брезенхэма).
Самое большее, что более-менее оптимизировал - перевод координат в псевдосимвол:
; D - Y, E - X
MOV A,D
RRC
SBB A ; проверяем, чётная ли строка?
XRI 003H ; нечётные пиксели - 08 / 04
ANI 00FH ; чётные пиксели - 01 / 02
MOV B,A
MOV A,E
RAR
MOV C,A
SBB A ; проверяем, чётный ли столбец?
XRI 009H ; нечётные пиксели - 02 / 04
ANI 00FH ; чётные пиксели - 01 / 08
ANA B ; маскируем 01/02 или 08/04
MVI B,0
DAD B ; приращиваем горизонталь
ADI 008H
ORA M
ANI 017H
MOV M,A ; ставим пиксель на экранНе знаю, имеются ли процедурки оптимальнее (перемещаемые - без таблиц)… :)
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot