почему в пентеве плохие 16-литровые банки

Postby fk0 » 15 Aug 2012, 18:07

Я что имею ввиду. Во-первых практически все операции трёхадресные.
A=B+C, например. И каждый аргумент может располагаться в своей банке.
Да, конечно, если банки по 16 килобайт каждая, то в четвёртой может
остаться и код... Но... см. ниже.

Во-вторых медленно. Переключаться банки будут постоянно, если работа
идёт с большими объёмами данных. И вариант типа LD BC, xxx: LD A, xxx:
OUT (C), A -- это ж 40 тактов где-то. Нужно что-то вроде OUT (#XX), A.
Разумеется, после разрешения этого порта каким-то битиком в каком-то
регистре... чтоб обычные программы не глючили. И, кстати, не факт, что
OUT. Можно подумать о недокументированной команде, например. Да что
угодно. Лишь бы аналогичное что-то можно было изобразить на мелкой
логике. LD B,B, LD C,C и т.п. даже без префикса по-моему вполне
вариант. Декодируется просто: 8-битный код в цикле М1. И скорость
космическая просто. Но скорей требования такие: во-первых возможность
работы из ПЗУ (не самомодифицирующийся код), во-вторых возможность
работать с переменным аргументом из регистра, в-третьих нужно порядка 16
переназначаемых окон по ~256 банок в каждом. Вопрос для обдумывания.

Теперь про код и память и данные. Какая может быть стратегия. Такая
как использовалась в своё время в старых макинтошах и вин-3.11. Т.е.
есть функция выделения памяти, например. Она выделяет. Где-то в банке,
но тебе отдаёт не ссылку, а ключ. Потом есть функция которая ключ
превращает в ссылку -- и в этот момент включается банка. Причём не факт,
что каждый раз в одном и том же месте или адресе (см. дальше). Потом
когда попользовался -- вызываешь функцию, которая отключает банку и
указатель тут перестаёт существовать. До следующего включения можно этот
кусок памяти как угодно по-памяти перемещать даже -- не важно. В
следующий раз по-ключу даст верный указатель, даже при перемещении
данных. Зачем так. Во-первых чтобы дать возможность переключать банки,
во-вторых чтобы дать возможность работать с более чем одним ключём
одновременно (тогда, при разных включениях, разные участки памяти в
разных страницах/адресах могут включаться, иначе ж никак). В-третьих
это собственно альтернатива ручному переключению, когда нужно не забыть,
со всеми последствиями.

Про код. С кодом та же история. Кода может быть больше, чем адресное
пространство. Это наверняка. И встанет вопрос как быть. Опять же есть
вариант руками включать банку и что-то там вызывать. Плохой вариант.
Можно поступить, как это делают в контроллерах профессионального уровня
-- proxy функцию для каждой C функции. Которая располагается во всегда
доступном сегменте кода и данных (вот уже аргумент, почему только 4
области памяти для банок -- мало). И эта прокси-функция включает нужную
банку и вызывает уже нужную функцию. При возврате возвращает всё на
место. Проблема с longjmp -- должен сохранять банку.

А из сказанного выше вытекают такие вещи, что ни выделяемая память, ни
код какой-либо функции не должны пересекать границы банки. Маленькие
банки невыгодны для больших объектов -- поэтому большие банки хороши.
Но совсем уж большие объекты можно вручную обрабатывать. А большинство
типовых объектов (данные и код функций) меньше 4-х килобайт -- практика
такова. А с другой стороны нужно где-то 3 банки под данные (а, на самом
деле, возможно и больше, потому, что не хочется оказаться в ситуации,
когда вызываеся подряд несколько функций и каждая получает банку с
адресом по-ключу, не высвобождает, и вызывает вложенную функцию...),
нужна банка под код текущей вызванной функции, нужна уже большая банка
под общий код и общие данные, включая стек. И с 16-килобайтовыми банками
становится сильно грустно. При наличии же 16шт 4-килобайтовых банок
гораздо веселее. Допустим, штук 8 уйдут под данные (до 8 разных объектов
с доступом через ключ, 3 вложенные функции например), 1-2 под текущую
функцию, 3 общий сегмент кода и 3-4 общий сегмент данных. Тогда как-то
можно вырваться за рамки 64кБайт и для кода и для данных более-менее
цивилизованным способом. Ну и, наконец, если окна для банок маленькие,
то можно выкрутиться и включать сразу по 2 шт. А наоборот уже никак.

Что я предлагаю. Сделать переключение 256шт (больше неудобно из-за
8-битности, да и мегабайта достаточно для ПО, остальное -- диск или
доступ вручную) банок по 4кБайта в окна соответствующего размера (16шт).
Переключение должно быть быстрое и не обязательно через OUT. Должно
работать из ПЗУ. Номер окна может быть фиксированный (выберется через
switch, если что, в функции переключения) в команде процессору, а номер
банки должен быть переменный из регистра. Каким методом это сделать не
знаю. OUT (#xx),A самый очевидный. Но не OUT (C) который аж три регистра
портит.

Зачем. Для программирования на языке C. С большими объёмами
(говно)кода, с большими объёмами данных, с динамически распределяемой
(стек и malloc() с учётом банок и доступа по-ключу) памятью.
* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1526
Joined: 07 Apr 2007, 01:08
Group: Registered users

Postby lvd » 15 Aug 2012, 19:02

fk0 wrote:Декодируется просто: 8-битный код в цикле М1.

Пиздунг. #CB #xx, #ED #xx, да и собственно #DD #xx, #FD #xx занимают каждый все 256 кодепоинтов. А ещё есть пиздец #DD #CB #data #opcode тоже с произвольным опкодом.

Теперь по существу. Это всё пока фантазии в стиле 'было бы хорошо, если'.
Но. Я готов сделать такой пейджинг ЕСЛИ ты готов потом запилить под него работающий компилятор, с кодом >64к и данными >64k. Ты готов? Думаю, что нет.
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7168
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby fk0 » 15 Aug 2012, 20:55

Ты не понял!!! В том-то и дело, что в такой системе компилятор годится обычный, делать ничего не нужно (кроме... см ниже). Всё дело только в библиотеках (распределение памяти) и технике программирования. От компилятора нужно только уметь создавать proxy-функции. Это вообще можно сделать без компилятора, внешней программой. Нужен не софт (кроме некоторых библиотеечных функций), а только методика, how to.
* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1526
Joined: 07 Apr 2007, 01:08
Group: Registered users

Postby fk0 » 15 Aug 2012, 21:10

Даже можно, если ACK говно, на hitech-c сделать (на нём даже, скорей, проще ибо он вдоль и поперёк изучен).
Только разумеется это не даст так просто готовый софт с PC тащить. Ибо функции memlock(), memfree() руками писать при каждом доступе к указателю. Адаптировать да, что-то можно так.

Ещё раз для понимания. Нужен аллокатор памяти, наподобии malloc, но с учётом банок. Он должен возвращать ключ. Нужна функция void* memlock(ключ) и memfree(ключ или void*) -- они переключают банки через функцию bank(pageaddr, bank) и одновременно помнят какие окна (не банки!) свободны для включения, какие нет. В исходниках помимо секции text заводится секция bank0, bank1.... В неё кладутся банкируемые функции. Для всех функций из этой секции имя подменяется на другое: _function --> _b_function. И делаются функции _function в всегда доступной секции, которые включают нужный банк через bank() в окне для функций и вызывают по истинному адресу, по возврату восстанавливают что было. Генератор proxy этих может быть отдельной программой, которая пофиксит *.as перед компиляцией в *.obj (поменяет имена в секциях bankX и допишет прокси в секции text). Ну и нужно написать функцию bank() -- это тривиально. Конкретно для hitech нужно написать другой "драйвер" который вызывает все программы компилятора (cpp.exe, cgen.exe, as.exe, copt.exe, hlink.exe) так, чтобы между кодогенератором (после оптимизатора) и ассемблером включить вызов программы генерации прокси-функций. Всё.

Вопрос. Эмулятор пентевы есть? Можно в нём это исправить для начала?
* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1526
Joined: 07 Apr 2007, 01:08
Group: Registered users

Postby fk0 » 15 Aug 2012, 21:13

Кстати в режиме Z180 hitech-c поддерживает банки для функций...
* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1526
Joined: 07 Apr 2007, 01:08
Group: Registered users

Postby lvd » 15 Aug 2012, 21:58

fk0 wrote:Вопрос. Эмулятор пентевы есть? Можно в нём это исправить для начала?

https://code.google.com/p/pentevo/sourc ... Ffix_build
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7168
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby нолька » 16 Aug 2012, 06:01

казалось бы при чем тут пентева?
<alone> предлагаю тслабсу дать транк, но с условием чтобы он впилил туда спрайтотайлы, но не трогал атм
<LordVader> alone: яготов всосать срайты от тслабса )
<LordVader> атм режимы это пиздец
User avatar
нолька
рОвный
 
Posts: 1200
Joined: 08 Apr 2007, 20:12
Group: Registered users

Postby lvd » 16 Aug 2012, 12:53

А я щитаю, что про 16к банки это демагогия. Всякие там трехадресные операции и проч. Вон в 51ых вообще дптр 1 шт, и всё в порядке с сикомпайлерами.

Про технологию. Если так делать, это уже не ц будет, а какая-то шняга типа промежутночного языка. Почему бы просто не сделать указатели 3байтовыми?
Как вызывать функцию по указателю, если 'прокси'?
F̞͖̭̿̔ͯu̐̅cͬ̑ͩk̨̤̳͇̮̭̪̠̽̿̓̆ͭͩ ̷̩̰͎̩͓̘̾̀ͬ̊ͭ͛ͅda̝̺͙̬͎̝̾͟ ̰̜̝̯͉̯̖̓̎́ͨ̽ͫ͟f̟͇̭̀ͬͨͭ̐̚u̹̼̹̗̞͑̔͂͐̚cͭ̅̊̆̒̆ǩ̝̩̯́ͥ̔̍̑ḭ͓͍̳̬ͦ̽͂n͍͎͈̈̅ͩͬ ̊ͫ̂̾̑̈́f̲͚͉͓͗̋́ͧͦ̅ȗ͇̲̻͈̲̅̎͗͒ͭ͡c̬̟̠̹̯̈́ͩ͘ͅk̫̠̻̋͜a̲͒̾̇!͙͕̺͉̗̩̲̂̏̄̀
User avatar
lvd
 
Posts: 7168
Joined: 07 Apr 2007, 21:28
Group: Registered users

Postby DimkaM » 17 Aug 2012, 09:12

4к банки довольно интересно, было несколько случаев нехватки окон. Но если надо подключать довольно большой кусок ОЗУ(те же 16к), то упаришся, поэтому смотрим ниже...

8битные порты тоже интересно. Но более интересно замапить порты в адресное пространство ОЗУ(в аврках помоему оно). Причём все порты, ну по возможности все.
Конечно 256 портов это просер куска адресного пространства в 256 единиц.
fk0 wrote:И, кстати, не факт, что OUT. Можно подумать о недокументированной команде, например.
вот это стрёмно, мне кажется. Заепёшся глюки при программировании вылавливать.

IM 0. Тоже может пригодится.Ибо пару таймеров бы надо или один хотя бы. И ещё всяких событий можно напридумывать.

64с графрежим.
И многослойный 16с, с битом просрачности. Щас же уже есть два экрана 16с, вот, единственное нужен бит в каком нить порте для йих какбы слияния. Вот тока раздельная поллитра невыйдет наверно.
N>"Идите нахуй" со своей политикой...
DimkaM
 
Posts: 1004
Joined: 24 Mar 2010, 12:42
Location: г.Щёлково М.О.
Group: Registered users

Postby jdigreze » 19 Aug 2012, 07:35

DimkaM wrote:Но более интересно замапить порты в адресное пространство ОЗУ(в аврках помоему оно). Причём все порты, ну по возможности все.Конечно 256 портов это просер куска адресного пространства в 256 единиц.
Не только avr но и вышеупомянутый x51. Правда у него, в отличии от zю, память кода отдельно от памяти данных, и sfr на 256, в котором и регистры и порты есть суть ячейка памяти. А идея портов в памяти - msx2 посмотри. И есть в портах на памяти некий шарм, например запись в порт по ld (ix-12),h...
Сколько меня не корми, волк всё равно в лес смотреть будет
jdigreze
 
Posts: 1478
Joined: 01 Aug 2008, 06:49
Location: Агбан
Group: Registered users

Next

Return to ZX Spectrum

Who is online

Users browsing this forum: No registered users and 1 guest

cron