Возраст: 31 | | Сообщений: 377 Благодарности: 22 / 55 Репутация: 9 Предупреждений: 1
Друзья Тут: 16 лет 8 месяцев
А без етого не как не здалаешь хомбревку, посоветуйте хоть самый лучшие емулятор, так будет легче. И любую программу на зызу двух версий: старую,под ядро 1,5 и новую, котораю поддержует ядро 3,,, Так я смогу найти разницу, покрайней меры постараюсь
Возраст: 31 | | Сообщений: 377 Благодарности: 22 / 55 Репутация: 9 Предупреждений: 1
Друзья Тут: 16 лет 8 месяцев
Lide основан на языке LUA, то есть что проги написаны на зызу работают на етом языке!! Вот к ниму инструкция: 1) Среда и составные части
Все инструкции в Lua выполнены в глобальной среде. Эта среда будет инициализирована обращением к lua_open и сохранится до обращения к lua_close или до завершения ведущей программы. В случае необходимости программист может создавать много независимых глобальных сред и свободно переключаться между ними.
Глобальная среда может управляться Lua-кодом или ведущей программой, которая может читать и писать глобальные переменные, используя функции API из библиотеки, которая предоставлена Lua.
Глобальные переменные в Lua не должны быть объявлены. Любая переменная считается глобальной, пока не объявлена явно как локальная. Перед первым назначением, значение глобальной переменной nil (это значение по умолчанию может быть изменено, подробности в разделе 8). Таблица используется, чтобы хранить все глобальные имена и значения (таблицы объясняются в разделе 3).
Модуль выполнения Lua назван составной частью. Это просто последовательность инструкций, которые выполнены последовательно. Каждая инструкция может факультативно сопровождаться точкой с запятой:
chunk ::= {stat [`;']}
Инструкции описаны в разделе 4. Запись выше представляет собой обычный расширенный BNF, в котором {a} соответствует 0 или более объектов a [a] означает факультативный a, а (a)+ задает один или большее количество a. Составная часть (chunk) может быть сохранена в файле или в строке в ведущей программе. Когда chunk выполняется, сначала проводится прекомпиляция в байт-код для реальной машины, а затем инструкции будут выполнены в последовательном порядке, моделируя действительную машину. Все модификации глобальной среды сохраняются после окончания работы кода.
Chunk также может быть прекомпилирован в двоичную форму и сохранен в файле. Текстовые файлы с кодом и их двоичные прекомпилированные формы взаимозаменяемы. Lua автоматически обнаруживает тип файла и действует соответственно.
1) Lua в автономном режиме Хотя Lua был разработан как язык расширений, чтобы быть вложенным в ведущую программу на C, это часто используется как автономный язык. Интерпретатор для Lua, как автономного языка, называется просто lua. Эта программа может быть вызвана с любой последовательностью следующих параметров:
-sNUM Устанавливает размер стека в NUM (если используется, должно быть первой опцией). - Выполняет stdin как файл. -c Вызывает lua_close после обработки всех параметров. -e rmstat Выполняет строку stat. -f filename Выполняет файл filename с параметрами для таблицы arg. -i Вводит интерактивный режим с подсказкой. -q Вводит интерактивный режим без подсказки. -v Информация о версии пакета. var=value Устанавливает глобальную переменную var в строку "value". filename Выполняет файл filename. Когда вызван без параметров, lua ведет себя как lua -v -i, когда stdin представляет собой терминал, или аналогично lua - в противном случае. Все параметры обработаны по порядку, за исключением -c. Например, обращение, подобное:
$ lua -i a=test prog.lua
Сначала взаимодействует с пользователем до EOF в stdin, затем установит a в "test" и в заключение выполнит файл prog.lua. Здесь под $ понимается подсказка оболочки. Ваша подсказка может быть иной. Когда используется опция -f filename, все параметры в командной строке переданы программе Lua filename в таблице, названной arg. В этой таблице поле n получает индекс последнего параметра, а поле 0 получает "filename". Например,
$ lua a.lua -f b.lua t1 t3
интерпретатор сначала выполняет файл a.lua, затем создает таблицу: arg = {"t1", "t3"; n = 2, [0] = "b.lua"}
а в заключение выполняет файл b.lua. Автономный интерпретатор также обеспечивает функцию getargs, которая может использоваться, чтобы обратиться ко всем параметрам командной строки. Например, если Вы вызываете Lua строкой: $ lua -c a b
то обращение к getargs в a или в b возвратит такую таблицу: {[0] = "lua", [1] = "-c", [2] = "a", [3] = "b", n = 3}
В интерактивном режиме может быть написана многострочная инструкция. Для этого надо заканчивать промежуточные строки наклонной чертой влево (). Если глобальная переменная _PROMPT определена как строка, то ее значение используется как подсказка. Следовательно, подсказка может быть изменена непосредственно в командной строке. Например:
$ lua _PROMPT='myprompt> ' -i
Или в программе Lua, назначая новое значение переменной _PROMPT. В Unix Lua-скрипты могут быть переделаны в выполнимые программы, используя chmod +x и форму #! как в #!/usr/local/bin/lua или #!/usr/local/bin/lua -f, чтобы получить другие параметры.
| `=' | `==' | ` { '=} | and | or} unop ::= `-' | not
1) Введение
Что такое Lua? Сайт языка Lua: //www.lua.org/.
Lua представляет собой ядро языка, которое Вы можете внедрять в Вашу прикладную программу. Это означает, что, помимо синтаксиса и семантики, Lua имеет API, который позволяет прикладной программе обмениваться данными с программами на Lua и расширять Lua функциями на C. В этом смысле, Lua может быть расценен как некий базисный метаязык для формирования проблемно-зависимых языков программирования.
Lua был предоставлен первый приз (технологическая категория) в Second Compaq Award for Research and Development in Computer Science в 1997. Это вознаграждение было объединенным предприятием Compaq Computer Brazil, the Brazilian Ministry of Science and Technology и the Brazilian Academy of Sciences.
Lua использовался во многих различных проектах во всем мире. Краткий перечень есть на //www.lua.org/uses.html.
Lua объединяет простой процедурный синтаксис (подобный Паскалю) с мощными конструкциями описания данных, основанными на ассоциативных массивах и расширяемой семантике. Lua имеет динамические типы, интерпретируется из байт-кода и имеет автоматическое управление памятью.
Lua представляет собой мощный, легкий язык программирования расширений разработанный, чтобы поддерживать общее процедурное программирование для средств описания данных. Lua предназначен, чтобы использоваться как мощный и легкий язык конфигураций для любой программы, которая нуждается в этом, и для расширения прикладных программ. Lua также часто используется как автономный язык общего назначения.
Цели реализации: простота, эффективность, мобильность и низкая объемлющая стоимость. Результат: быстрое ядро языка с маленькими требованиями, что делает его идеальным также и во встроенных системах.
Lua написан как библиотека на C, написан на ANSI C и компилирует неизменяемый на всех известных платформах код. Будучи языком расширений, Lua не имеет никакого понятия главной программы: это работает только как вложение в некую ведущую программу. Эта ведущая программа может вызывать функции, чтобы выполнить часть кода в Lua, может писать и читать переменные Lua, и может регистрировать функции C, которые будут вызваны Lua-кодом. С помощью функций C, Lua может быть расширена, чтобы справиться с широким диапазоном различных областей, таким образом создавая настроенные языки программирования, совместно использующие синтаксические рамки.
Доступность
Lua свободно доступен для академических и коммерческих целей и может быть скачан с различных сайтов в сети:
Lua распространяется свободно. Реализация, описанная в этом руководстве, доступна по адресам: //www.lua.org/home.html
Связь с авторами
Lua был разработан и выполнен Waldemar Celes, Roberto Ierusalimschy и Luiz Henrique de Figueiredo. С ними можно входить в контакт по e-mail lua@tecgraf.puc-rio.br.
Шлите Ваши комментарии, вопросы и отчеты об ошибках на lua@tecgraf.puc-rio.br. Для сообщений об ошибках попробуйте также список рассылки lua-l@tecgraf.puc-rio.br. Для получения большего количества информации относительно этого списка, включая инструкции о том, как на него подписаться, обратитесь на //www.lua.org/mirrors.html.
Lua разработан в TeCGraf, the Computer Graphics Technology Group of PUC-Rio (the Pontifical Catholic University of Rio de Janeiro in Brazil). TeCGraf является лабораторией отдела информатики. Множество индустриальных программ, разработанных в TeCGraf, используют Lua.
1) 5) API
5. API Этот раздел описывает API для Lua, то есть набор функций C, доступных ведущей программе, чтобы связаться с Lua. Все функции API, связанные типы и константы объявлены в файле заголовка lua.h.
Даже когда используем термин "функция", любое средство в API можно обеспечить как макрокоманду. Все такие макрокоманды используют каждый из параметров точно однажды и не генерируют скрытые побочные эффекты.
5.1 Состояния Библиотека Lua полностью повторно используема: она не имеет никаких глобальных переменных. Все состояние интерпретатора Lua (глобальные переменные, стек, методы тэгов и т.д.) сохранено в динамически распределенной структуре типа lua_State. Это состояние должно быть передано как первый параметр каждой функции в библиотеке (за исключением lua_open).
Перед вызовом любой функции API, Вы должны создать состояние вызовом:
lua_State *lua_open (int stacksize);
Единственный параметр этой функции: размер стека для интерпретатора. Каждое обращение к функции нуждается в одной позиции стека для каждого параметра, локальной переменной и временного значения, плюс по одной позиция для бухгалтерии. Стек должен также иметь приблизительно 20 позиций дополнительного пространства доступными. Для очень маленьких реализаций, без применения рекурсивных функций, размер стека в 100 должен быть достаточным. Если параметр stacksize равен 0, то используется заданный по умолчанию размер в 1024. Чтобы освободить состояние, созданное lua_open, вызовите:
void lua_close (lua_State *L);
Эта функция уничтожает все объекты в данной среде Lua (вызывая соответствующие методы тэгов для уборки мусора, если они есть) и освобождает всю динамическую память, используемую этим состоянием. Обычно Вы не должны вызвать эту функцию потому, что все ресурсы естественно освобождены, когда Ваша программа заканчивается. С другой стороны, долго работающие программы должны бы освобождать ресурсы как только они становятся ненужными, чтобы не становиться слишком большими. За исключением lua_open все функции в Lua API нуждаются в состоянии как в первом параметре.
5.2 Стек и индексы Lua использует стек (stack), чтобы передавать значения в и из C. Каждый элемент в этом стеке представляет значение Lua (nil, число, строка).
Для удобства большинство операций запроса в API не следует за строгой дисциплиной стека. Вместо этого они могут обратиться к любому элементу в стеке, используя индекс: положительный индекс представляет абсолютную позицию стека (начиная с 1, а не с 0, как в C). Отрицательный индекс представляет смещение от верхней части стека. Более определенно, если стек имеет n элементов, индекс 1 представляет первый элемент (то есть, первый элемент, помещенный в стек), а индекс n представляет последний элемент. Индекс -1 также представляет последний элемент (то есть, элемент наверху), и индекс -n представляет первый элемент. Мы говорим, что индекс имеет силу, если он находится между 1 и верхней частью стека (то есть, если 1 10 20 30 40 30 lua_insert(L, 1) --> 30 10 20 30 40 lua_insert(L, -1) --> 30 10 20 30 40 (никакого эффекта нет) lua_settop(L, -3) --> 30 10 20 lua_settop(L, 6) --> 30 10 20 nil nil nil
5.4 Запросы к стеку Чтобы проверять тип элемента стека, следующие функции доступны:
int lua_type(lua_State *L, int index); int lua_tag(lua_State *L, int index); int lua_isnil(lua_State *L, int index); int lua_isnumber(lua_State *L, int index); int lua_isstring(lua_State *L, int index); int lua_istable(lua_State *L, int index); int lua_isfunction(lua_State *L, int index); int lua_iscfunction(lua_State *L, int index); int lua_isuserdata(lua_State *L, int index);
Эти функции могут быть вызваны с любым приемлемым индексом. lua_type возвращает одну из следующих констант, согласно типу данного объекта: LUA_TNIL, LUA_TNUMBER, LUA_TSTRING, LUA_TTABLE, LUA_TFUNCTION, LUA_TUSERDATA. Если индекс не имеет силу (то есть, если та позиция стека пуста), то lua_type возвращает LUA_TNONE. Эти константы могут быть преобразованы в строки с помощью вызова:
const char *lua_typename(lua_State *L, int t);
здесь t представляет собой тип, возвращенный lua_type. Строки, возвращаемые lua_typename: "nil", "number", "string", "table", "function", "userdata" и "no value", lua_tag возвращает тэг значения или LUA_NOTAG для не имеющего силу индекса.
Функция lua_is* возвращает 1, если объект совместим с данным типом, и 0 в противном случае. Всегда возвращается 0 для не имеющего силу индекса. lua_isnumber принимает числа и числовые строки. lua_isstring берет строки и числа и lua_isfunction воспринимает функции Lua и C. Чтобы различать между функциями Lua и функциями C, Вы должны использовать lua_iscfunction. Чтобы различать между числами и числовыми строками, Вы можете использовать lua_type.
API также имеет функции, чтобы сравнить два значения в стеке:
int lua_equal(lua_State *L, int index1, int index2); int lua_lessthan(lua_State *L, int index1, int index2);
Эти функции эквивалентны их дубликатам в Lua. Определенно, lua_lessthan эквивалентна lt_event. Обе функции возвращают 0, если любой из индексов не имеет силу. Чтобы транслировать значение в стеке к специфическому типу C, Вы можете использовать следующие функции преобразования:
double lua_tonumber(lua_State *L, int index); const char *lua_tostring(lua_State *L, int index); size_t lua_strlen(lua_State *L, int index); lua_CFunction lua_tocfunction(lua_State *L, int index); void *lua_touserdata(lua_State *L, int index);
Эти функции могут быть вызваны с любым приемлемым индексом. Когда вызваны с не имеющим силу индексом, они действуют так, как будто переданное им значение имело неправильный тип. lua_tonumber преобразовывает значение в данном индексе к числу с плавающей запятой. Это значение должно быть числом или строкой, обратимой в число. Иначе lua_tonumber возвращает 0.
lua_tostring преобразовывает значение Lua в строку (const char*). Это значение должно быть числом или строкой, иначе будет возвращен NULL. Эта функция возвращает указатель на строку внутри Lua-среды. Эти строки всегда имеют ноль (' ') после их последнего символа (как в C), но могут содержать другие ноли в их теле. Если Вы не знаете, может ли строка содержать ноли, Вы должны использовать lua_strlen, чтобы получить фактическую длину. Потому, что Lua имеет мусороуборщик, не имеется никакой гарантии, что указатель, возвращенный lua_tostring, будет иметь силу после того, как соответствующее значение удалено из стека.
lua_tocfunction преобразовывает значение в стеке к функции C. Это значение должно быть функцией C, иначе lua_tocfunction возвращает NULL.
lua_touserdata преобразовывает значение в void*. Это значение должно иметь тип userdata, иначе lua_touserdata вернет NULL.
5.5 Помещение значений в стек API имеет следующие функции, чтобы поместить значения C в стек:
Эти функции получают значение C, преобразовывают его в соответствующее значение Lua, и помещают результат в стек. В частности, lua_pushlstring и lua_pushstring делают внутреннюю копию данной строки. lua_pushstring может использоваться только, чтобы поместить соответствующие C-строки (то есть, такие строки, которые заканчиваются нолем и не содержат вложенные ноли), иначе Вы должны использовать более общую функцию lua_pushlstring, которая принимает явный размер данных.
5.6 Сборка мусора Lua использует два числа, чтобы управлять совокупностью мусора. Одно число рассчитывает, сколько байтов динамической памяти Lua использует, а другое задает порог. Это внутренний счетчик байтов, сохраняемый Lua не полностью аккуратно: это может отклоняться на 10% от реального положения дел в памяти. Когда число байтов пересекает порог, Lua выполняет цикл зачистки мусора, который исправляет память и стирает оттуда все отработавшие свое, но забытые там объекты (то есть объекты, больше доступные из Lua). Счетчик байтов будет исправлен, а затем порог сброшен к двойному значению счетчика байтов.
Вы можете обращаться к текущим значениям этих двух чисел через следующие функции:
int lua_getgccount (lua_State *L); int lua_getgcthreshold (lua_State *L);
Оба возвращают их соответствующие значения в килобайтах. Вы можете изменять пороговое значение с помощью: void lua_setgcthreshold (lua_State *L, int newthreshold);
Снова значение newthreshold задано в килобайтах. Когда Вы вызываете эту функцию, Lua устанавливает новый порог и проверяет счетчик байтов. Если новый порог меньше, чем счетчик байтов, то Lua немедленно выполняет cборку мусора. После нее новый порог будет установлен согласно предыдущему правилу. Если Вы хотите изменять поведение коллектора мусора адаптивно, Вы можете использовать метод тэга мусоросборщика для nil, чтобы установить ваш собственный порог (метод тэга будет вызван после того, как Lua сбрасывает порог).
5.7 Userdata и тэги Поскольку userdata представляют собой объекты, функция lua_pushusertag может создавать новые userdata. Если Lua имеет userdata с данным значением (void*) и тэг, то этот объект размещен. Иначе создается новый userdata с данным значением и тэгом. Если эта функция вызвана с тэгом, равным LUA_ANYTAG , то Lua пробует находить любой объект userdata с данным значением, независимо от его тэга. Если не имеется никакого userdata с этим значением, то новый объект будет создан с тэгом, равным 0.
Userdata может иметь различные тэги, чья семантика известна только ведущей программе. Тэги создаются функцией:
int lua_newtag (lua_State *L);
Функция lua_settag меняет тэг объекта в верхней части стека (без того, чтобы получить его): void lua_settag (lua_State *L, int tag);
Объект должен быть userdata или таблицей, данный тэг должен быть значением, созданным с помощью функции lua_newtag.
5.8 Выполнение Lua-кода Ведущая программа может выполнять Lua-chunk, записанные в файле или в строке, используя следующие функции: int lua_dofile(lua_State *L, const char *filename); int lua_dostring(lua_State *L, const char *string); int lua_dobuffer(lua_State *L, const char *buff, size_t size, const char *name);
Эти функции возвращают 0 в случае успеха, или один из следующих кодов ошибки, если они терпят неудачу: LUA_ERRRUN: ошибка при управлении chunk. LUA_ERRSYNTAX: ошибка синтаксиса в течение прекомпиляции. LUA_ERRMEM: ошибка распределения памяти. Для таких ошибок, Lua не вызывает _ERRORMESSAGE (подробности в разделе 4.7). LUA_ERRERR: ошибка при управлении _ERRORMESSAGE. Для таких ошибок Lua не вызывает _ERRORMESSAGE снова, чтобы избежать циклов. LUA_ERRFILE: ошибка открытия файла (только для lua_dofile). В этом случае Вы можете проверять errno, вызывая strerror или perror, чтобы сообщить пользователю, что пошло неправильно. Эти константы определены в lua.h. Когда функция lua_dofile вызвана с параметром NULL, она выполняет поток stdin. lua_dofile и lua_dobuffer способны выполнить прекомпилируемые объекты кода. Они автоматически обнаруживают, является ли кусок кода текстовым или двоичным, и загружают его соответственно. lua_dostring выполняет только исходный текст, заданный в простой текстовой форме.
Третий параметр для lua_dobuffer задает имя chunk, который используется сообщениях об ошибках и отладочных сообщениях. Если имя name равно NULL, то Lua дает заданное по умолчанию имя этому chunk.
Эти функции помещают в стек любые значения, в конечном счете возвращенные кодом. Код может возвращать любое число значений; Lua соблюдает осторожность, в том плане, что эти значения вписываются в размер стека, но после обращения ответственность переходит к Вам. Если Вы должны поместить другие элементы после вызова любой из этих функций, и Вы хотите работать спокойно, Вы должны или проверить место в стеке с помощью lua_stackspace, или удалять возвращенные элементы из стека (если Вы не нуждаетесь в них). Например, следующий код загружает код в файле и отбрасывает все результаты, возвращенные этим кодом:
{ int oldtop = lua_gettop(L); lua_dofile(L, filename); lua_settop(L, oldtop); }
5.9 Управление глобальными переменными в Lua Чтобы прочитать значение глобальной переменной Lua, надо:
Это помещает в стек значение данной переменной. Как в Lua эта функция может вызывать метод тэга для события getglobal. Чтобы читать реальное значение глобальной переменной без того, чтобы вызывать любой метод тэга, используют lua_rawget над таблицей глобальных переменных. Чтобы записать значение в глобальнукю переменную:
Это извлекает из стека значение, которое будет сохранено в данной переменной. Как в Lua эта функция может вызывать метод тэга для события setglobal. Чтобы устанавливать реальное значение глобальной переменной без того, чтобы вызывать любой метод тэга, используют lua_rawset над таблицей глобальных переменных (подробности приведены ниже). Все глобальные переменные сохраняются в обычной Lua-таблице. Вы можете получать ее вызовом:
void lua_getglobals (lua_State *L);
Это помещает текущую (актуальную) таблицу глобальных переменных в стек. Чтобы устанавливать другую таблицу глобальных переменных, используйте вызов: void lua_setglobals (lua_State *L);
Таблица, которую нужно использовать, извлекается из стека.
5.10 Управление таблицами в Lua Lua-таблицы могут также управляться через API. Чтобы читать значение в таблице, таблица должна находиться где-нибудь в стеке. Теперь вызовите
void lua_gettable (lua_State *L, int index);
где index относится к таблице. lua_gettable извлекает ключ из стека и возвращает (через стек) содержание таблицы для заданного ключа. Как в Lua эта операция может вызывать метод тэга для события gettable. Получать реальное значение любого ключа таблицы, без того, чтобы вызывать любой метод тэга, можно, используя void lua_rawget (lua_State *L, int index);
Чтобы сохранять значение в таблицу, которая находится где-нибудь в стеке, Вы помещаете ключ и значение в стек (именно в этом порядке!), а затем вызываете такое обращение:
void lua_settable (lua_State *L, int index);
здесь index относится к таблице. lua_settable извлекает из стека ключ и значение. Как и все в Lua, эта операция может вызывать метод тэга для события settable. Чтобы устанавливать реальное значение любого индекса таблицы без того, чтобы вызывать любой метод тэга, используют raw-версию: void lua_rawset (lua_State *L, int index);
В заключение, еще одна функция
void lua_newtable (lua_State *L);
создает новую, пустую, таблицу и помещает ее в стек.
5.11 Использование таблиц как массивов API имеет функции, которые помогают использовать таблицы Lua как массивы, то есть таблицы, индексированные только числами: void lua_rawgeti(lua_State *L, int index, int n); void lua_rawseti(lua_State *L, int index, int n); int lua_getn(lua_State *L, int index);
lua_rawgeti получает значение энного элемента таблицы в позиции index стека.
lua_rawseti устанавливает значение энного элемента таблицы в позиции index стека к значению наверху стека.
lua_getn возвращает число элементов в таблице в позиции index. Это число представляет собой значение поля n таблицы, если это имеет числовое значение, или самый большой числовой индекс со значением non-nil в таблице.
5.12 Вызов функций Lua Функции, определенные в Lua (и функции C, зарегистрированные в Lua), могут быть вызваны из ведущей программы. Это выполнено, используя следующий протокол: сначала, функция, которая будет вызвана, помещена в стек, затем, параметры функции помещены в прямом порядке, то есть первый параметр помещен в стек первым. В заключение, функция вызвана:
int lua_call (lua_State *L, int nargs, int nresults);
Эта функция возвращает те же самые коды ошибки, что и lua_dostring и другие (подробности в разделе 5.8). Если Вы хотите исследовать ошибку, вместо того, чтобы возвратить код ошибки, используйте: void lua_rawcall(lua_State *L, int nargs, int nresults);
В обеих функциях nargs задает число параметров, которые Вы поместили в стек. Все параметры и функциональное значение берутся из стека, а функциональные результаты помещены туда. Число результатов будет откорректировано до nresults, если nresults не LUA_MULTRET. В этом случае все результаты функции будут помещены в стек. Функциональные результаты помещены в прямом порядке (первый результат и помещен первым), чтобы после обращения последний результат оказался на самой вершине стека.
Следующий пример показывает, как ведущая программа может делать эквивалент коду на Lua:
a,b = f("how", t.x, 4)
Here it is in C: /* глобальная `t' (потом пригодится) */ lua_getglobal(L, "t"); /* функция, которая будет вызвана */ lua_getglobal(L, "f"); /* 1-ый параметр */ lua_pushstring(L, "how"); /* помещает в стек строку `x' */ lua_pushstring(L, "x"); /* помещает в стек результат t.x (2-ой аргумент) */ lua_gettable(L, -4); /* 3-ий параметр */ lua_pushnumber(L, 4); /* вызывает функцию с 3 параметрами и 2 результатами */ lua_call(L, 3, 2); /* устанавливает глобальную переменную `b' */ lua_setglobal(L, "b"); /* устанавливает глобальную переменную `a' */ lua_setglobal(L, "a"); /* удаляет из стека `t' */ lua_pop(L, 1);
Обратите внимание, что код выше сбалансированный: в конце стек обратен к первоначальной конфигурации. Это считается хорошей практикой. Некоторые специальные функции Lua имеют собственные интерфейсы C. Ведущая программа может генерировать ошибку Lua, вызывая функцию:
Эта функция никогда не возвращает ничего. Если lua_error вызвана из функции C, которая была вызвана из Lua, то соответствующий блок кода Lua завершается так, как будто ошибка произошла внутри кода Lua. Иначе вся ведущая программа завершается обращением exit(EXIT_FAILURE). Перед завершением выполнения, сообщение message будет передано функции драйвера ошибки _ERRORMESSAGE. Если message равно NULL, то _ERRORMESSAGE не вызывается. Методы тэгов могут быть изменены с
void lua_settagmethod (lua_State *L, int tag, const char *event);
Второй параметр задает тэг, а третий представляет собой имя события. Новый метод берется из стека. Чтобы получить текущее (актуальное) значение метода тэга используйте функцию void lua_gettagmethod(lua_State *L, int tag, const char *event);
Также возможно копировать все методы из одного тэга в другой:
int lua_copytagmethods (lua_State *L, int tagto, int tagfrom);
Эта функция вернет tagto. Вы можете пересекать таблицу с функцией:
int lua_next (lua_State *L, int index);
здесь index относится к таблице, которая будет пересечена. Функция берет ключ из стека и помещает туда пару "значение-ключ" из таблицы (следующую после данного ключа). Если не имеется больше элементов, то функция возвращает 0 (и не помещает в стек ничего). Типичный пример использования выглядит следующим образом: lua_pushnil(L); /* first key */ while (lua_next(L, t) != 0) { /* `key' is at index -2 and `value' at index -1 */ printf("%s - %sn", lua_typename(L, lua_type(L, -2)), lua_typename(L, lua_type(L, -1))); lua_pop(L, 1); /* removes `value'; keeps `index' for next iteration */ }
Функция
void lua_concat (lua_State *L, int n);
конкатенирует n значений сверху стека, извлекает их и оставляет результат наверху. Здесь n должно быть по крайней мере равно 2. Конкатенация выполнена по правилам обычной семантики Lua
5.13 Определение функций C Чтобы зарегистрировать функцию C в Lua, имеется следующая макрокоманда: #define lua_register(L, n, f) (lua_pushcfunction(L,f),lua_setglobal(L,n)) /* const char *n; */ /* lua_CFunction f; */
Которая получает имя, которое функция будет иметь в Lua, и указатель на функцию. Этот указатель должен иметь тип lua_CFunction, который определен так; typedef int (*lua_CFunction) (lua_State *L);
То есть, это указатель на функцию с целочисленным результатом и одиночным параметром, Lua-средой. Чтобы связываться правильно с Lua, функция C должна следовать следующему протоколу, который определяет путь, которым параметры и результаты переданы: функция C получает параметры от Lua в стеке, в прямом порядке (первый параметр помещен первым). Чтобы возвращать значения Lua, функция C только помещает их в стек в прямом порядке и возвращает число результатов. Подобно функции Lua, функция C, вызванная Lua, может возвращать много результатов.
Как пример, следующая функция получает переменное число числовых параметров, а возвращает их среднее и сумму:
static int foo (lua_State *L) { int n = lua_gettop(L); /* number of arguments */ double sum = 0; int i;
for (i = 1; i x="lua - 4.0" t = {n=0} gsub("first second word", "(%w+)", function (w) tinsert(%t, w) end) --> t={"first", "second", "word"; n=3}
Шаблоны Символьный класс: Символьный класс используется, чтобы представить набор символов. Следующие комбинации позволяются в описании символьного класса: x Здесь x любые волшебные символы: ^$()%.[]*+-?. Представляет непосредственно символ x. . (точка) Представляет все символы. %a Представляет все буквы. %c Представляет все спецсимволы. %d Представляет все цифры. %l Представляет все буквы в нижнем регистре. %p Представляет все символы пунктуации. %s Представляет все пробелы. %u Представляет все буквы в верхнем регистре. %w Представляет все алфавитно-цифровые символы. %x Представляет все шестнадцатеричные цифры. %z Представляет символ с представлением 0. %x Здесь x задает любой не алфавитно-цифровой символ. Представляет символ x. Это стандартный способ экранировки управляющих спецсимволов. Лучше следить за тем, чтобы любому символу пунктуации (даже не управляющему!) предшествовал %, когда символ применен в образце. [char-set] Представляет класс, который является объединением всех символов в char-set. Диапазон символов может быть определен, отделяя конечные символы диапазона тире (-). Все классы %x, описанные выше, могут также использоваться как компоненты в char-set. Все другие символы в char-set представляются как есть. Например, [%w_] (или [_%w]) представляет все алфавитно-цифровые символы плюс символ подчеркивания, [0-7] представляет восьмеричные цифры, а [0-7%l%-] представляет восьмеричные цифры плюс символы строчных букв плюс символ тире. Взаимодействие между диапазонами и классами не определено. Следовательно, образцы, подобные [%a-z] или [a-%%] не имеют никакого значения. [^char-set] Представляет дополнение char-set, где char-set интерпретируется как выше. Для всех классов, представляемых одиночными символами (%a, %c, ...), соответствующая прописная буква представляет дополнение класса. Например, %S представляет все не пробелы.
Определения символа, пробела и т.д. зависят от текущего региона. В частности, класс [a-z] не может быть эквивалентен %l. Вторая форма должна быть предпочтительней для переносимости.
Элемент образца: Элементом образца может быть: Одиночный символьный класс, который соответствует любому одиночному символу в классе. Одиночный символьный класс, сопровождаемый *, что соответствует 0 или большему количеству повторений символов в классе. Эти элементы повторения будут всегда соответствовать самой длинной возможной последовательности. Одиночный символьный класс, сопровождаемый +, что соответствует 1 или большему количеству повторений символов в классе. Эти элементы повторения будут всегда соответствовать самой длинной возможной последовательности. Одиночный символьный класс, сопровождаемый -, что также соответствует 0 или большему количеству повторений символов в классе. В отличие от *, элементы повторения будут всегда соответствовать самой короткой возможной последовательности. Одиночный символьный класс, сопровождаемый ?, что соответствует 0 или 1 местонахождению символа в классе. %n, для n от 1 до 9. Такой элемент соответствует подстроке, равной n-й зафиксированной строке. %bxy, здесь x и y два различных символа. Такой элемент соответствует строкам, которые начинаются с x, заканчиваются на y, и в них сбалансированы x и y. Это означает, что, если читать строку слева направо, подсчитывая +1 для x и -1 для y, то последний y является первым y, для которого счетчик равен 0. Например, элемент %b() соответствует выражениям со сбалансированными круглыми скобками. Шаблоны: Шаблон представляет собой последовательность элементов образца. Циркумфлекс (^) в начале образца закрепляет соответствие в начале подчиненной строки. $ в конце образца закрепляет соответствие в конце подчиненной строки. В других позициях ^ и $ не имеют никакого специального значения и представляются как есть. Сборы данных: Образец может содержать подобразцы, включенные в круглые скобки, они описывают сборы данных. Когда соответствие выполнено, подстроки подчиненной строки, которые соответствуют сборам данных, сохранены для будущего использования. Сборы данных пронумерованы согласно их левым круглым скобкам. Например, в образце "(a*(.)%w(%s*))", часть соответствия строки "a*(.)%w(%s*)" сохранена как первый сбор данных (а, следовательно, имеет номер 1), символьное соответствие . зафиксировано с номером 2, а часть, соответствующая %s*, конечно, имеет номер 3. Образец не может содержать вложенные ноли. Используйте вместо этого %z.
6.3 Математические функции Эта библиотека предоставляет интерфейс к некоторым функциям стандартной математической библиотеки C. Кроме того, это регистрирует метод тэга для двоичного оператора ^, который возвращает x^y, когда применяется к числам x^y.
Библиотека обеспечивает следующие функции:
abs acos asin atan atan2 ceil cos deg exp floor log log10 max min mod rad sin sqrt tan frexp ldexp random randomseed
Плюс глобальная переменная PI. Большинство из них представляют собой только интерфейсы к функциям в C-библиотеке, за исключением того, что для тригонометрических функций все углы выражены в градусах, а не в радианах. Функции deg и rad могут использоваться для того, чтобы преобразовывать данные между радианами и градусами. Функция max возвращает максимальное значение числовых параметров. Точно так же min вычисляет минимум. Обе они могут использоваться с 1, 2 или большим количеством параметров.
Функции random и randomseed представляют собой интерфейсы к простому генератору случайных чисел, предоставляемому ANSI C (соответвенно функции rand и srand). Не может быть дпно никаких гарантий касательно их статистических свойств. Функция random при вызове без параметров возвращает псевдослучайное вещественное число в диапазоне [0,1). При вызове с параметром n, random вернет псевдослучайное целое число в диапазоне [1,n]. При вызове с двумя параметрами l и u, random вернет псевдослучайное целое число в диапазоне [l,u]. Границы всегда входят в диапазон.
6.4 Средства ввода-вывода Все операции ввода-вывода в Lua реализованы через два дескриптора файла, по одному на ввод и вывод. Эти дескрипторы сохранены в двух глобальных переменных Lua, названных _INPUT и _OUTPUT. Глобальные переменные _STDIN, _STDOUT и _STDERR инициализированы с описателями файлов для stdin, stdout и stderr. Первоначально Initially, _INPUT=_STDIN и _OUTPUT=_STDOUT.
Дескриптор файла представляет собой объект userdata, содержащий поток файла (FILE*) с отличительным тэгом, созданным библиотекой ввода-вывода (I/O).
Если иное не установлено, все функции I/O возвращают nil на сбое и некоторое значение, отличное от nil, при успехе.
openfile (filename, mode) Эта функция открывает файл в режиме, определенном в строке mode. Это возвращает новый дескриптор файла или, в случае ошибок, nil плюс строку, описывающую ошибку. Эта функция не изменяет _INPUT или _OUTPUT.
Строка mode может быть любой из следующего списка:
r Режим чтения. w Режим записи. a Режим добавления к концу. r+ Режим обновления, все ранее записанные данные сохраняются. w+ Режим обновления, все ранее записанные данные уничтожаются. a+ Режим модификации, предыдущие данные сохраняются, запись позволяется только в конце файла. Строка mode может также иметь в конце b, что необходимо в некоторых системах, чтобы открыть файл в двоичном режиме. Эта строка аналогична той, что используется в стандартной функции C fopen. closefile (handle) Эта функция закрывает файл. Это не изменяет _INPUT или _OUTPUT.
readfrom (filename) Эта функция может быть вызвана двумя путями. Когда она вызвана с именем файла, открывает именованный файл, устанавливает дескриптор как значение _INPUT и возвращает это значение. Это не закрывает текущий файл input. При вызове без параметров, она закрывает файл _INPUT и восстанавливает stdin как значение _INPUT. Если эта функция где-то не сработала, она возвращает nil плюс строку описания.
Если filename начинается с символа трубопровода |, открывается поточный ввод через функцию popen. Не все системы его выполняют. Кроме того, число файлов, которые могут быть открыты в то же самое время, обычно ограничивается и зависит от системы.
writeto (filename) Эта функция может быть вызвана двумя путями. Когда она вызвана с именем файла, открывает именованный файл, устанавливает дескриптор как значение _OUTPUT и возвращает это значение. Это не закрывает текущий выходной файл. Обратите внимание, что если файл уже существует, то он будет полностью уничтожен этой операцией. Когда функция вызвана без параметров, она закрывает файл _OUTPUT и восстанавливает stdout как значение _OUTPUT. В случае ошибки функция возвращает nil плюс строку, описывающую ошибку.
Если filename начинается с символа трубопровода |, открывается поточный ввод через функцию popen. Не все системы его выполняют. Кроме того, число файлов, которые могут быть открыты в то же самое время, обычно ограничивается и зависит от системы.
appendto (filename) Открывает файл, именованный filename и устанавливает это как значение _OUTPUT. В отличие от операции writeto, эта функция не стирает предыдущее содержание файла, вместо этого все, что пишется в файл, будет конкатенировано к концу. Если эта функция получила сбой, она вернет nil плюс строку, описывающую ошибку.
remove (filename) Удаляет файл с данным именем. Если эта функция получила сбой, она вернет nil плюс строку с описанием ошибки.
rename (name1, name2) Переименовывает файл name1 в name2. Если эта функция получила сбой, она вернет nil плюс строку с описанием ошибки.
flush ([filehandle]) Сохраняет любые записанные данные в заданный файл. Если filehandle не определен, то flush сбросит на диск все открытые файлы. Если эта функция получила сбой, она вернет nil плюс строку с описанием ошибки.
seek (filehandle [, whence] [, offset]) Получает позицию файла, измеряемую в байтах от начала файла, и меняет ее на позицию, данную смещением offset плюс ядром, определенным как строка whence следующим образом:
set Позиция 0 (начало файла). cur Текущая позиция. end Конец файла. В случае успеха функция seek возвращает конечную позицию файла, измеряемую в байтах от начала файла. Если эта функция получила сбой, она вернет nil плюс строку, описывающую эту ошибку. Значение по умолчанию для whence равно cur, а для offset это 0. Следовательно, вызов seek(file) возвращает текущую позицию файла без того, чтобы изменить это. Вызов seek(file, "set") устанавливает позицию на начало файла (и возвращает 0), а seek(file, "end") устанавливает позицию в конец файла и возвращает его размер.
tmpname () Возвращает строку с именем файла, которое может безопасно использоваться для временного файла. Файл должен быть явно открыт перед использованием и удален, когда больше не нужен.
read ([filehandle,] format1, ...) Читает файл _INPUT или filehandle, если этот параметр задан, согласно данным форматам, которые определяют, что читать. Для каждого формата, функция возвращает строку или число с прочитанными данными или nil, если не может читать данные с определенным форматом. Когда вызвана без форматов, эта функция использует заданный по умолчанию формат, который читает следующую строку.
Доступные форматы такие:
*n Читает число. Это единственный формат, который возвращает число вместо строки. *l Читает следующую строку (обходя концы строк) или nil в конце файла. Это и есть заданный по умолчанию формат. *a Читает целый файл, начинающийся в текущей позиции. На конце файла, возвращает пустую строку. *w Читает следующее слово (максимальная последовательность символов без пробелов. Пробелы обходит в случае необходимости. Замечу, что под пробелом здесь понимается не только собственно пробел, но и спецсимволы. В конце файла функция вернет nil. Число Читает строку до указанного числа символов в длину или nil на конце файла. write ([filehandle, ] value1, ...) Пишет значение каждого из параметров в файл _OUTPUT или в filehandle, если этот параметр задан. Параметры должны быть строками или числами. Чтобы писать другие значения, используйте tostring или format перед write. Если эта функция нарвалась на ошибку, она вернет nil и строку с описанием данной ошибки.
6.5 Средства системы clock () Возвращает приближение количество времени CPU, используемое программой (в секундах).
date ([format]) Возвращает строку, содержащую дату и время, форматируемую согласно данному формату format. Формат задается по тем же самым правилам, что и в функции ANSI C strftime. Когда вызвана без параметров, возвращает приемлемое представление даты и времени, которое зависит от ведущей системы и от текущего региона.
execute (command) Эта функция эквивалентна функции C system. Это передает команду command, которая будет выполнена оболочкой операционной системы. Возвращает код состояния, который является зависимым от системы.
exit ([code]) Вызывает C-функцию exit с факультативным кодом завершения программы code. Значение по умолчанию для code: код успешного завершения.
getenv (varname) Возвращает значение системной переменной процесса varname или nil, если эта переменная не определена.
setlocale (locale [, category]) Эта функция предоставляет интерфейс к функции ANSI C setlocale. locale представляет собой строку, определяющую регион, category факультативная строка, описывающая которую категорию изменить: "all", "collate", "ctype", "monetary", "numeric" или "time", заданная по умолчанию категория: "all". Функция возвращает имя нового региона или nil, если этот запрос не может быть выполнен.
1) Несовместимость с предыдущими версиями
Lua 4.0 представляет собой значительное изменение языка. Была проделана большая работа, чтобы избежать несовместимости с предыдущими общими версиями Lua, но некоторые различия нужно представлять. Есть список несовместимостей.
Несовместимости с version 3.2 Изменения в языке Все прагмы ($debug, $if, ...) удалены. for, break и in теперь зарезервированные слова. Методы тэгов уборки мусора для таблиц теперь устаревшие. Имеется теперь только один метод тэга для операторов порядка. Во вложенных обращениях к функции, подобно f(g(x)), все возвращаемые значения из g переданы как параметры f. Это случается только, когда g последний или единственный параметр для f. Предварительный компилятор может принимать, что некоторые операторы ассоциативны для оптимизации. Это может вызывать проблемы, если эти операторы имеют не ассоциативные методы тэгов. Старые прекомпилированные программы устарели, и должны быть перетранслирована. Изменения в библиотеках При пересечении таблицы с next или foreach таблица не может изменяться. Общие образцы чтения теперь устаревшие. Функции rawgettable и rawsettable теперь переименованы соответственно в rawget и rawset. Функции foreachvar, nextvar, rawsetglobal и rawgetglobal устаревшие. Вы можете получать их функциональные возможности, используя операции таблицы с таблицей глобальных переменных, возвращаемой globals. setglobal и sort больше не возвращают значение. Вызов type больше не возвращает второе значение. Опция p в функции call устарела. Изменения в API API был полностью переделан. Это теперь полностью повторно используемо и намного более ясно. Отладочный API был полностью переделан.
Возраст: 31 | | Сообщений: 377 Благодарности: 22 / 55 Репутация: 9 Предупреждений: 1
Друзья Тут: 16 лет 8 месяцев
Плагин для кастомной прошивки Прошивка: 3.80 M33-5 Поддержка Slim: да Описание: Вышла новая версия Custom Firmware Extender. Появилась возможность подключать жесткий диск компьютера к PSP через WiFi, оптимизировано использование памяти, и многое другое.
Для тех кто ещё не знает - Custom Firmware Extender это плагин для кастомной прошивки, который добавляет к функционалу PSP ряд полезных и не очень функций. Среди них: 1.выключение PSP с помощью кнопок, а не рычажком, 2.подключение к PSP жесткого диска компьютера через USB или WiFi, с которого можно запускать ISO и Homebrew, 3.возможность включить полную яркость подсветки без подключенной зарядки, 4.снятие скриншотов в меню и во время игры, и ещё ряд других функций ссылка 1,16мб
Сообщение отредактировано 14 февраля 2008 10:21. Редактировалось 1 раз(а)
Возраст: 31 | | Сообщений: 377 Благодарности: 22 / 55 Репутация: 9 Предупреждений: 1
Друзья Тут: 16 лет 8 месяцев
Снятие ISO образа с UMD диска:
Итак, первым делом вставляем диск в привод, с которого собираемся снимать образ(ДампDump). Заходим в меню "Игра" и запускаем приложение UMD DAX Dumper Beta 0.2. Видим следующую картинку:
Расшифрую, что означают эти строчки и какие действия они выполняют. 1. UMD Size = 888 MB - показывает объём диска. В данном случае у меня стоит диск "Need For Speed Most Wanted", объём которого 888 Мегабайт. 2. Dump to : Куда сохранять образ. Нажатием стрелок вправо-влево можно изменять этот параметр: а) usbhostfs0:/ISO - Здесь указывается на передачу по USB в папку ISO. а) ms0:/ISO - Сохранять образ на карточку памяти MemoryStick в корневую папку ISO. б) nethostfs:/ISO - Передавать образ по Wi-Fi - этот вариант мы рассматривать не будем. 3. Format : - Указывает на вывод в формат, в который хотите сохранить образ: а) ISO - Этот формат является не сжатым. Представляет точную копию всего диска в одном файле с расширением на конце ISO. б) GZIP - Очень компактный формат сжатия. На лету сжимает данные с диска в архив, но требует дополнительного времени. в) DAX - Названный в честь автора этого формата Darka Alexa, но к сожалению так и не был реализован им в этой программе. 4. Compression level : - Уровень сжатия. Указывает на степень сжатия в формате GZIP от 1 до 9. Чем выше степень сжатия, тем компактнее размер архива, но тем более продолжительнее будет происходить процесс дампинга. 5. Split size : - Размер части. При снятии образа, его ещё можно сразу разбивать по частям. Можно указать на размер каждой части по 400, 200, 100, 50, 20 Мегабайт. Переведу оставшиеся строчки в последнем абзаце: 6. Digital up/down : select option - стрелки вверх/вниз : выбор опции. 7. Digital left/right : change option - стрелки влево/вправо : изменение опции. 8. Press start to dump the UMD. Press select to load the USB Mass drivers - Нажмите "START" для дампа UMD. Нажмите "SELECT" для загрузки драйверов USB. 9. (DO NOT do it if you plan to dump via usb) - Не делайте этого, если вы планируете делать дамп посредством USB. Эта строчка относится только к последнему предложению из пункта 8, выделенному красным. Разобрав по полочкам все возможные пункты меню, продолжим дальше. Первым делом рассмотрим снятие дампа на карточку памяти MemoryStick, поскольку это является самой главной отличительной особенностью от программ подобного рода. Итак, программа у нас запущена. В первой строке опций "Dump to" выбираем "ms0:/ISO", что означает - сохранение образа на MemoryStick. Во второй строке опций "Format" выбираем "ISO", если вы сразу хотите начать играть с карточки памяти или хотите снять дамп как можно быстрее. Можете выставить формат "GZIP", что в пять раз компактнее, чем формат "ISO", но играть сразу вы не сможете и процесс снятия дампа будет длится значительно дольше. В следующей строчке "Compression level" оставьте максимальный уровень сжатия "9", чтобы компактнее сжать образ диска в формате "GZIP". В формате "ISO" уровень сжатия игнорируется, не взирая на то, какой уровень сжатия будет выставлен, так как сам по себе данный формат не является архивным. В последней строке опций "Split size" выберите, хотите ли вы разбить образ на части. Это может понадобится, если на одной карточке памяти недостаточно места для сохранения образа целиком. Например игра на UMD диске занимает 888 MB, а у вас только две карточки памяти по 512 MB, то можно выбрать размер части например в 400 MB. После создания каждой части на карточке памяти, процесс дампа будет приостанавливатся и вам будет предложено нажать Х для продолжения создания следующей части. Заменяете MemoryStick и нажимаете Х, следующая часть будет дампится на новую карточку памяти. Сохранив первую часть в 400 MB на одной карточке, затем вставив другую карточку, сохраняете на ней вторую часть в 400 MB и третью часть в 88 MB. Таким образом можно сохранить образ одной игры на нескольких карточках памяти. Имейте ввиду, что формат GZIP нельзя поделить на части. В результате настроек для сохранения дампа на MemoryStick с возможностью сразу начать играть без диска, у вас должна быть такая картинка:
Убедившись, что всё правильно сделали и не забыли вставить диск перед запуском программы, нажимаем на консоли на кнопку "START". Всё, процесс дампинга запускается и начинается отсчёт сдампенных секторов с интервалом в 2048. Вы должны увидеть такую картинку:
Сверху слева написано - Дампинг UMD, а правее - отсчёт сдампенных секторов из их общего количества. В нижней строчке написано "Нажмите квадрат для прекращения операции". После завершения снятия образа вы увидите следующее окно:
Сверху белыми буквами указывается, что все имеющиеся секторы сдампены. Ниже красными буквами сообщается, что Дамп завершен. И ещё ниже говорится, что если вы хотите снять дамп с другого диска UMD, то вставьте новый диск и нажмите клавишу Х. Если вы хотите выйти, нажмите клавишу "HOME" Теперь вы смело можете вынимать диск из привода и запускать игру из меню "Игра".
Возраст: 31 | | Сообщений: 377 Благодарности: 22 / 55 Репутация: 9 Предупреждений: 1
Друзья Тут: 16 лет 8 месяцев
Я знаю прогу для отката на 1,5
Timemachine - программадля загрузки предыдущих программ ис карты памяти, используя pandora. Подобно devhook, но создавая throgh pandora и ipls, это работало бы, даже если ipl зызе уничтожен. Timemachine полезен, чтобы управлять программным обеспечением, которое не поддерживается больше, а также как путь к psps, даже если внутренняя микропрограмма уничтожена. Может также быть полезно для разработчиков проверить их homebrew в различных микропрограммах. В настоящий момент timemachine может установить следующие микропрограммы: - Оригинал 1.50 (может только быть загружен на phat) - 1.50 с приблизительно 3.40 hw модули. Может быть загружен на обоих, phat и слим. - 3.40 OE (может только быть загружен на phat) - 3.60 M33 (может только быть загружен на слим) остальная Часть cfw будет добавлена в будущем. Requeriments машины времени: - timemachine непосредственно не требуют любую микропрограмму, только pandora батарейка. Timemachine в слиме, требует, 3.90 M33-2 или больше.
Инструкции: Копируйте папку TIMEMACHINE в /PSP/GAME и запускайте. На всех програмно-аппаратных обеспечениях может установиться любой PSP (слим или phat)
Сообщение отредактировано 16 февраля 2008 10:30. Редактировалось 8 раз(а)
Возраст: 31 | | Сообщений: 377 Благодарности: 22 / 55 Репутация: 9 Предупреждений: 1
Друзья Тут: 16 лет 8 месяцев
Сайт ExtremeTech предлагает всем желающим приобрести книгу Hacking the PSP, в которой довольной подробно изложены принципы взлома портативной консоли от Sony, запуск различных приложений, эмуляция РС, установка Linux и запуск Windows.
PSP - многофункциональное мультимедийное устройство, способное воспроизводить игры, фильмы, музыку, отображать фотографии и которое можно использовать для серфинга в Интернет, однако, этого недостаточно некоторым людям, которые хотят, чтобы на PSP можно было запускать приложения, такие же, как на домашнем РС.
Используя эмулятор Bochs и создав несколько образов с необходимым программным обеспечением на каждом из них, Вы сможете запускать оперционные системы Linux и Windows на вашей консоли PSP.
Перечень того, что Вам будет необходимо:
консоль PlayStation Portable; карта памяти Memory Stick, необходимая для файлов эмулятора Bochs и образов жестких дисков (512 MB должно хватить, однако 1Gb - предпочтительней); программа Virtual PC, необходимая для эмуляции РС; программа R-Drive Image, необходимая для создания образов; установочные диски с дистрибутивами операционных системам Windows 95 или Windows 98.
Существует также и эмулятор Macintosh, называемый Basilisk II, который можно скачать по этой ссылке. Эмулятор Basilisk II позволит Вам запускать на PSP операционные системы Mac OS версий от 7.5 до 7.6.1 (Mac OS X пока не поддерживается).
Добавлено спустя 7 минут 5 секунд:
Windows 98 на PSP Как правило, мы стараемся не писать о пиратской сцене, но раз в год и палка стреляет, верно? На этот раз речь пойдет о «хоумбрю» для PSP. Общеизвестный факт, что пользовательские программы для этой консоли – это очень распространенная практика, учитывая появление и широкое распространение «кастомных» прошивок.
На этот раз мы столкнемся с действительно необычной вещью. Хакер Xarro сумел инсталлировать и запустить операционную систему Windows 98 на PSP, используя эмулятор работы процессоров x86-семейсвта (то есть, стандартного PC-процессора). Кстати, достичь результатов ему удалось благодаря тому, что уже существует опыт запуска Windows 95 на PSP как раз с использованием эмулятора PC-процессора. Справедливости стоит сказать, что система работает медленно, но Xarro не собирается останавливаться на достигнутом, обещая и впредь продолжать свою работу. Уникальное видео перед вами.
Cегодня запустил это на PSP (с помощью Bochs) грузится 3 минуты. Опять проблемы с мышью она такая же, как и в WIN95. 3.11ый почти не тормозит, мне удалось поиграть в сапера и порисовать без проблем. A вот еще фотки WIN 3.11 for Work Group на PSP: фото 1 фото 2 смотреть фото 3
Вот сам архив с самим bochs for PSP: //rapidshare.com/files/13120015/Bochs-for-PSP.rar Образ c.img кидать в папку VM
Подробное описание: Windows 3.11 для PSP [build-0.0.1] Проект основан на эмуляторе DosBox 0.71 for PSP by CrasyC. В отличие от широко распространённых виртуальных машин с Linux, Mac и Windows 3.11 данное решение позволяет работать с РЕАЛЬНЫМИ документами и файлами. При запуске автоматически монтируется логический диск D:. Реально это папка Documents из ms0:. На этом диске (папке) можно совершенно спокойно работать с документами и т.д.
Данная сборка является в большей степени демонстрационной. Основа - DosBox+Имидж ОС Windows 3.11. Имидж необходим из-за того, что прошивка PSP не может работать более чем с 10 файлами одновременно.
Тестировалась на 3.51 M33 с ядром 3.x
Скачать тут //iso.pspinfo.ru/3464272 35 Мб
Благодарности CrasyC за DosBox for PSP //forums.ps2dev.org/ за полезную информацию по теме //www.fdd5-25.net/ за софт для Win 3.11 //pspinfo.ru
InstallUninstall Software Для того чтобы добавитьудалить ПО из данной сборки Вам требуется: 1. Распаковать имидж ms0:ISOWin311.iso 2. Запустить DosBox для Windows 3. Запустить Windows 3.11 4. Произвести необходимые манипуляции 5. Сделать новый имидж с таким же названием
Setup Распаковать архив Скопировать папки Documents, PSP, ISO в корень Memory Stik (ms0:/)
Start Запустить DosBox 0.71 значок "C:"
Controls Кнопки направление - лево, право, верх, низ Аналоговый джойстик - мышь RShift - левая кнопка мыши LShift - правая кнопка мыши Start - Enter Треугольник - Esc
SoftList - Exel 4.0 - Acrobat Reader 3.01 (немецкая версия - грузится долго) - Netscape Navigator 4.08 - Opera 3.51 - MS WinG (DirectX) - MS Word 2.0C - MS Works 2.0 - MS Word Viewer 97 - Win Play 3
FixList - поддержка Win32 Приложений - установлен драйвер VGA (версия 3) - добавлена экранная клавиатура при запуске ОС - изменён шрифт экранной клавиатуры - левая и правая кнопка мыши заменены местами (Левая верхняя кнопка - Правая кнопка мыши, Правая верхняя кнопка - левая копка мыши) - увеличена системная скорость мыши - Настроен звук (SB 220 - 7) - Переделан бутскрин
P.S.S. Проект будет развиваться если он понравится пользователем.
Mac OS 7.5.5 for PSP with Basilisk II
Я запустил Mac OS 7.5.5 на PSP проги я на нем не проверял. Но сам он работает отлично грузится минуту ,а может и меньше. Запускаю все это добро на эмуляторе Basilisk II for PSP. Этот Mac OS старый но работает быстро и возможно на нем можно будет работать серьезно. Кроме того Mac OS работает на весь экран. Мышка работает отлично. Управление: X : кнопка мыши Start : Enter Управление мышью кнопками или Аналоговым Стиком
ССЫЛКИ: Вот ссылка на MAC, распаковать в корень стика(для прошивки 1.5): //rapidshare.com/files/15718207/MACOS.rar.html Ссылка на Mac OS для прошивок Dark Alex'а (2.71SE, 3.03OE,3.10OE и т п): //rapidshare.com/files/15739212/MAC.rar
Возраст: 31 | | Сообщений: 377 Благодарности: 22 / 55 Репутация: 9 Предупреждений: 1
Друзья Тут: 16 лет 8 месяцев
У меня такоеже было!!!!!!!!! Возьми флеху, протри, проверь что бы в зызе там сухо было, потом возьми флеху вставь ее впрытык, и не закрывая крышкой, а дальше держа пальцем флеху (прижимай ее) включай зызу
Возраст: 31 | | Сообщений: 377 Благодарности: 22 / 55 Репутация: 9 Предупреждений: 1
Друзья Тут: 16 лет 8 месяцев
Здесь сказали, что ответ "ЗА глаЗА"! Глупо и не смешно! _________________________________________ А это из других источников с Ответов: "1. В орфографическом словаре русского языка есть только три слова, начинающиеся и заканчивающиеся на за: заноза, зараза и зализа (да, такое есть). Остальные будут либо вышедшими из употребления, либо узкоспециальными терминами. 2. На самом деле загадка звучит так: На одном суде один из судей решил, что называется прикальнутся над подсудимым. После того как был оглашён приговор на 15 лет судья у говорит ему, что если он сейчас назовёт 3 слова оканчивающееся и начинающееся на "ЗА", то за каждое слово он ему будет аннулироваться 5 лет. Подсудимый обрадовался и сказал что готов. Судья сказал «Начинай». - Зараза, - почти сразу произнёс подсудимый. - Принимается – согласился судья и списал ему 5 лет. - Заноза! - почти вскрикнул воодушевлённый подсудимый. - Добро. Принимается – сказал судья и снял ещё ему 5 лет. Над третьим словом подсудимый думал долго и когда истекло отведённое ему время, его отправил в камеру, где он честно отсидел 5 лет. Вернувшись домой и, увидев свою жену, он вдруг вспомнил слово и воскликнул: - Чёрт! И за это я отсидел 5 лет??? Итак, вопрос теперь вам. Что это было за слово? Заметим, что в загадке не сказано "вспомнил слово, загаданное судьей" и даже не сказано "вспомнил то самое слово", а просто "вспомнил слово". Таким образом, ничто не указывает на то, что слово, которое вспомнил осужденный должно начинаться и оканчиваться на за. Теперь перейдем к тому, что же спрашивается в загадке? Опять таки не сказано "Назовите слово, загаданное судьей" и даже не спрашивается "назовите третье слово" спрашивается просто "назовите ЭТО" слово. Под словом ЭТО можно понимать как "это, которое задумал судья", так и "это, которое вспомнил заключенный". Принимая во внимание тот факт, что судья не загадывал никаких слов, он просто назвал критерии, которым слова должны соответствовать, а осужденный как раз вспомнил какое-то определенное слово, заключаем, что у нас спрашивается: "Какое слово вспомнил заключенный в момент возвращения домой?" Как мы уже выяснили ранее, оно вовсе не обязательно начинается на за и оканчивается на за. 3. Слово, которое вспомнил заключенный должно удовлетворять двум критериям: 1 из-за этого он отсидел 5 лет и 2 он подумал об этом, глядя на женщину. Слово, идеально подходящее под эти критерии: "ЗАГАДКА". Именно из-за загадки он отсидел 5 лет вместо 15 и загадка есть в каждой женщине. 4. Почему-то люди склонны считать, что последнюю фразу осужденный произносит с горечью, типа, мог бы и вообще не сидеть, на самом деле он радуется, что отсидел так мало!"
Возраст: 31 | | Сообщений: 377 Благодарности: 22 / 55 Репутация: 9 Предупреждений: 1
Друзья Тут: 16 лет 8 месяцев
Забудьте про тупые проги!! Зарание извеяюсь за ошибки:) Сайт там где полно уроков и самодельные проги(англиский)тут
там всё по англиски так что читайте лучше мою статью:
Программируем для PSP: Часть I, настройка компилятора
Давайте условимся сразу: я следую паттерну "изучение обучением", т.е. учу, одновременно изучая, обгоняя читателей на 2-3 "шага" вперед. Однако это не значит, что я ничего не знаю и все, что говорю - обычные копипасты: я стараюсь разобраться в теме, прежде чем писать о ней. Поэтому смело задавайте вопросы, этим вы принесете пользу и себе, и мне: на вопросы, ответ на которые я не знаю, я буду его искать, осозновать и рассказывать вам.
Итак, в этом топике будет небольшой рассказ о том, как скомпилировать и запустить первую программу на своей приставке. Сразу предупреждение: статья мегатехнического плана, почти все содержание касается утомительной, но быстрой настройки компилятора, а в результате вы получите лишь банальный "Hello World". Однако без нее никак.
Будем предполагать как данность, что у вас есть приставка Sony PSP, перепрошитая до последней версии - 3.90 M33-3 (так называемая custom firmware, неофициальная прошивка). О том, как перепрошиваться, уже рассказывали многие, и останавливаться на этом я не буду. Так же будем считать, что в кирпич ваш вставлена флешка, на которой есть хотя бы 50кб свободного места, и вы имеете к ним доступ (например, через саму PSP).
Скажу сразу: я почти уверен, что ничего плохого с вашей приставкой не случится, если вы будете достаточно аккуратны, но никаких гарантий дать, к сожалению, не могу.
Используемый язык программирования -- Си, я буду использовать бесплатную IDE Code::Blocks под Windows XP. Пользователи других компиляторов или ОС могут попробовать настроить IDE сами, благо, настройки у всех похожи; я же использовал то, для чего нашел мануал ;)
Для начала, скачаем набор компиляторов, линкеров и библиотек для PSP под названием DevKitPSP. Распакуйте его куда-нибудь, я его распаковал в корень диска E: (теперь у меня есть папка E:devkitpsp).
Теперь откройте Code::Blocks. В меню выберите Settings→Compiler and Debugger, как Selected Compiler в открывшемся окошке выберите GNU GCC (он должен стоять по умолчанию), скопируйте его, назвав, например, DevKitPSP, и настройте его:
Вкладка Search Directories→Compiler (удалите все, что там есть, и нажимайте Add для добавления каждого из путей):
Compiler's installation directory: E:devkitPSP . Там есть примечание, что в этой папке должна быть подпапка bin, проверьте. C-compiler: psp-gcc.exe C++-compiler: psp-g++.exe Linker for dynamic libs: psp-g++.exe Linker for static libs: psp-ar.exe Еще три поля я оставил пустыми.
Теперь можно жать OK, и переходить к созданию нового проекта (File→New→Project..., слева в окошке жмем Projects и выбираем Empty). Заполняем Project Title (не играет роли, пусть будет PSPHelloWorld), не забываем поставить папку для сохранения проекта (я вон в первый раз забыл, и получил кучу глюков и ошибок); компилятор, разумеется, ставим свежесозданный нами.
Наш проект девственно пуст, создаем фаил (File→New→File..., на название наплевать, я выбрал main.c) -- не забудьте в мастере создания фаила выбрать как язык Си и поставить галочки "Add to current project", "Debug" и "Release" (почему они не стоят по умолчанию?).
В созданный фаил копируем код:
#include
#include
PSP_MODULE_INFO("Hello World", 0, 1, 1);
int ExitCallback(int Arg1, int Arg2, void *Common) { sceKernelExitGame(); return 0; }
int CallbackThread(SceSize Args, void *Argp) { int CallbackId; CallbackId = sceKernelCreateCallback("Exit Callback", ExitCallback, NULL); sceKernelRegisterExitCallback(CallbackId); sceKernelSleepThreadCB(); return 0; }
int SetupCallbacks(void) { int ThreadId = 0; ThreadId = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0); if (ThreadId >= 0) { sceKernelStartThread(ThreadId, 0, 0); } return ThreadId; }
Код писал не я, кстати: опыта пока-что маловато, хотя я вполне понимаю, что там происходит и как - в любом случае, в этом топике я останавливаться на этом не буду.
Теперь последние штрихи к настройке. Мы уже настроили то, с помощью чего будем компилировать, но не настроили, как и что у нас должно выходить. Поэтому жмем правой кнопкой на название проекта справа, выбираем Properties, а там -- Build targets. Снимаем галочку "Auto-generate filename extension", и правим в Output filename расширение "exe" на "elf". Выполняем тоже самое для конфигурации Release, жмем Ok.
Жмем правой кнопкой на название проекта опять, выбираем Build Options и, на вкладке Linker Options, вписываем в Other linker options:
Вроде всё (надеюсь, это последняя статья скучного технического плана). Теперь собираем проект (Build→Build или знакомое всем Ctrl-F9) -- если вдруг появились ошибки, то думаем, что же сделали не так, а потом спрашиваем в комментариях (может, я забыл чего).
Чтобы не настраивать потом заново, стоит сохранить проект как шаблон (File→Save Project as user-template...).
Итак, у нас есть elf-фаил нашей программы. Перед тем, как закидывать его на PSP, надо преобразовать его в EBOOT.PBP (название придумал не я, честно). Для этого у меня стоит такой bat-ник:
Он располагается у меня в директории pspprj, в которой я создаю по папке для каждого проекта. Используется он так: make_eboot.bat HelloWorld . Если у вас другая организация папок, или вы просто хотите его переписать или запускать каждую программу вручную -- просто запускайте по строчке, не забывая заменять %1 на названия или пути к фаилам. В результате у вас получится фаил EBOOT.PBP, его надо будет закинуть в папку /PSP/GAME150/HelloWorld (или другое название)/, а все остальное можно спокойно удалить. Теперь проверяйте (выход -- по кнопке Home).
Как "домашнее задание" -- сделайте так, чтобы все "хелловорлды" были с новой строки. До встречи!
P.S. Вырезал весь "юмор", который сначала вписывал. Всегда самого раздражали тупые шутки в такого рода постах, а в том, что мои шутки не тупы, я быть уверен не могу :)
Остальные части щя выложу:) , ток ошибки исправлю:)
Возраст: 31 | | Сообщений: 377 Благодарности: 22 / 55 Репутация: 9 Предупреждений: 1
Друзья Тут: 16 лет 8 месяцев
Чёт пришло в голову установит космических рейнджеров на psp, щя уже позно, так что начну роботу завра , отпишусь, и при успешном запуске разкажу, и покажу:)
Возраст: 31 | | Сообщений: 377 Благодарности: 22 / 55 Репутация: 9 Предупреждений: 1
Друзья Тут: 16 лет 8 месяцев
ждали:)
Программируем для PSP: Часть II. Тотальный контроль
В прошлом туториале мы разобрались с "хелловорлдом", теперь пришло время к следующей, не менее важной вещи: вводе информации. Умея выводить что-то на экран и узнавать, что нажал пользователь, уже можно сделать полезную программу. Фактически, после этого урока уже можно будет начинать что-то свое, однако я бы посоветовал дождаться, хотя бы, спрайтов.
Создадим проект по шаблону, описанному в первой части. Найдем в фаиле функцию main() -- основную функцию программы, а в ней главный цикл ( while(1) { ... } ). Кстати, насчет while(1): в программировании для psp не считается дурным тоном делать бесконечные циклы внутри программы, т.к. выход все равно осуществляется по кнопке HOME, и только так.
Сделаем стандартный цикл обработки сообщений: получение и переваривание. Первое, что нужно сделать -- определить переменную, в которой будет хранится состояние клавиатуры:
SceCtrlData pad; // переменная, где хранится информация о состоянии кнопок (нажаты/не нажаты).
Структура SceCtrlData хранит в себе TimeStamp - количество фреймов, похоже, от запуска программы (надо уточнить!), Buttons -- битовую маску состояния кнопок (учитываются кнопки Select, Start, крестик, треугольник, квадрат, шифты, стрелки, состояние Hold и Home. Все остальное учитывается только в Kernel Mode, за подробностями смотрите фаил devkitPSPpspsdkincludepspctrl.h) и координаты стика Lx и Ly. Поскольку она определена только в pspctrl.h, придется добавить в начало фаила
Эта функция заполняет структуру pad текущими значениями состояния кнопок и стика. Кстати, чтобы получить координаты стика удавалось, надо перед while'ом впихнуть 2 строки:
sceCtrlSetSamplingCycle(0); sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG); // настраиваем на прием информации о положении стика
Иначе джойстик так и застынет на положении (128:128) (это -- середина, сами координаты меняются от 0 до 255).
Итак, мы считали информацию, теперь нужно ее вывести. Вот что получилось у меня:
pspDebugScreenPrintf("TimeStamp %i | Pressed: ", pad.TimeStamp); // выводим TimeStamp if (pad.Buttons == 0) // ничего не нажато { pspDebugScreenPrintf("NONE "); } else { if (pad.Buttons & PSP_CTRL_TRIANGLE) pspDebugScreenPrintf("TRIANGLE "); if (pad.Buttons & PSP_CTRL_CIRCLE) pspDebugScreenPrintf("CIRCLE "); if (pad.Buttons & PSP_CTRL_CROSS) pspDebugScreenPrintf("CROSS "); if (pad.Buttons & PSP_CTRL_SQUARE) pspDebugScreenPrintf("SQUARE "); // какие кнопки нажаты? } pspDebugScreenPrintf("(%i) | Stick: %i:%in", pad.Buttons, pad.Lx, pad.Ly); // выводим координаты стика
Как видите, я учитываю только состояние кнопок с картинками (ну, треугольника, круга, квадрата и крестика), дописать поддержку остальных легко, за константами обращайтесь к devkitPSPpspsdkincludepspctrl.h. Код в цикле будет выводить нечто такое:
SceCtrlData pad; // переменная, где хранится информация о состоянии кнопок (нажаты/не нажаты).
int main(int argc, char ** argv) { pspDebugScreenInit(); SetupCallbacks();
sceCtrlSetSamplingCycle(0); sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG); // настраиваем на прием информации о положении стика
while(1) // главный цикл программы { sceCtrlReadBufferPositive(&pad, 1); // читаем содержимое буфера э-э клавиатуры pspDebugScreenPrintf("TimeStamp %i | Pressed: ", pad.TimeStamp); // выводим TimeStamp if (pad.Buttons == 0) // ничего не нажато { pspDebugScreenPrintf("NONE "); } else { if (pad.Buttons & PSP_CTRL_TRIANGLE) pspDebugScreenPrintf("TRIANGLE "); if (pad.Buttons & PSP_CTRL_CIRCLE) pspDebugScreenPrintf("CIRCLE "); if (pad.Buttons & PSP_CTRL_CROSS) pspDebugScreenPrintf("CROSS "); if (pad.Buttons & PSP_CTRL_SQUARE) pspDebugScreenPrintf("SQUARE "); // какие кнопки нажаты? } pspDebugScreenPrintf("(%i) | Stick: %i:%in", pad.Buttons, pad.Lx, pad.Ly); // выводим координаты стика }
sceKernelSleepThread();
return 0; }
Теперь преобразовывайте в EBOOT, закидывайте на приставку и наслаждайтесь. Как домашнее задание можно попробовать сделать бродилку, или еще какую-нибудь невероятно полезную штуку; я думаю, что посвящу третюю часть всяким прочим фичам text mode, а потом перейду к графике. Удачи!
Возраст: 31 | | Сообщений: 377 Благодарности: 22 / 55 Репутация: 9 Предупреждений: 1
Друзья Тут: 16 лет 8 месяцев
ну лад:))) 1 камп: Intel Core 2 Extreme QX9650 3.0GHz/1333MHz/12MB (BX80569QX9650SLAN3) s775 Box Asus EN8800GTX/HTDP/768M PCI-Ex 768MB Windows XP и Windows VISTA HDD 1160гб 2камп Pentium 4 3.0GHz Asus Gforce 5700 Windows XP HDD 200гб
Возраст: 31 | | Сообщений: 377 Благодарности: 22 / 55 Репутация: 9 Предупреждений: 1
Друзья Тут: 16 лет 8 месяцев
mixalch, я не про манитор, ты оборудование правильно написал????
у мня был почти такой, ток малёха хуже: камп згорел спустя месец , дело в том что кулер вешфлся тока ззаде, так везде доступ воздуха был ограничен, оборудование не обветривалось, и он сгорел:((((
А мой друг придурок купил на выставке такой:
купил за 900долл, корпус конечно супер, хотя я думаю что тратить такие деньги на корпус не стоит, да и если уже купил так надо ставить посреди комнаты чтоб все видели, а не в одделение для PC (в компьютерном столе)
Сообщение отредактировано 26 мая 2008 18:01. Редактировалось 1 раз(а)
Возраст: 31 | | Сообщений: 377 Благодарности: 22 / 55 Репутация: 9 Предупреждений: 1
Друзья Тут: 16 лет 8 месяцев
Заказуйте фильмы! Зделаю в отличном качестве!!! Я в свою очередь качаю в качетсве HD 1080p (лучшее качетво), и колирую его под psp. Делаю в 3 вариантах: 1) pmp-супер качество!!! Но и размер не малый:(. Зато качество даже и на плазме отличное:) 2) mp4-нормальное качество, малый размер:) 3) mp4 tv-качество получше предыдущего, разчитан на просмотр на TV (соответственно и разрешение больше)
заливаю на letitbit.net, depositfiles.com и vip-file.com. На другие сервера такие как народ, ifolder и т.д. договариваемся по асе 9287678
"" and "PlayStation" are registered trademarks of Sony Computer Entertainment Inc. "", PSP and "UMD" are trademarks of Sony Computer Entertainment Inc. "", "XMB", "Memory Stick Duo" and the "Memory Stick Duo" logotype are trademarks of Sony Corp. All product titles, publisher names, trademarks, artwork and associated imagery are trademarks, registered trademarks and/or copyright material of the respective owners. All rights reserved.