Важная информация

User Tag List

Страница 4 из 13 ПерваяПервая 12345678 ... ПоследняяПоследняя
Показано с 31 по 40 из 121

Тема: Конструктор (ZX SDK)

  1. #31
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    К сожалению, у меня нет мыслей по поводу всякого рода вызовов, так как мой опыт программирования слишком небольшой. Но у меня есть другая мысль...

    Наверное слишком мало интереса в отдельных процедурах. Чтобы быстрее начать создавать ZX SDK я предлагаю сделать программу, например, игру "Сапёр". Игра достаточно проста в реализации и вместе с тем она может использовать много полезных процедур: вывод окон, вывод текста, работа с мышью/джойстиком, работа с клавиатурой, работа со звуком и др. Итак, берём эту игру и раскладываем её на процедуры. Большинство из этих процедур уже давным давно написаны и наверняка подборка таких присутствует на дисках многих спектрумовских программистов... Определившись со списком нужных процедур мы раздаём реализацию этих процедур разным людям. В конце концов, я думаю, мы придём к общему знаменателю. Если таким образом мы коллективно сделаем программу, то это будет неким началом. У нас будет какой-то набор процедур, который уже можно будет смело расширять. Кроме того, на этой программе можно поэксперементировать сделав управление от мыши, клавиатуры или джойстика, вывод звука на бипер, AY или GS, вывод графической информации на стандартный экран, расширенный экран ATM и т.д. То есть можно обкатать технологию. По ходу написания обязательно будут возникать какие-то проблемы, которые мы будем коллективно решать. То есть я предлагаю начать реализовывать конкретную задачу! Почему нет?
    С уважением, Станислав.

  2. #31
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #32
    Veteran Аватар для Sinus
    Регистрация
    29.01.2005
    Адрес
    Belarus, Grodno
    Сообщений
    1,279
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    мона и так.
    [target] [zemu] [js8x] [pouet] KAY-1024, 5''FDD, 3''FDD, HDD

  4. #33
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Что касается вызова процедур, я всё же подумал и мне кажется, что наиболее универсально будет передавать данные в процедуры таким образом:

    CALL PROC
    DB VAR1
    DW VAR2

    Это медленнее, но за то не привязываемся к регистрам!
    С уважением, Станислав.

  5. #34
    Activist Аватар для fk0
    Регистрация
    18.02.2005
    Адрес
    St. Petersburg
    Сообщений
    415
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от CityAceE
    Сейчас у этой идеи есть шанс воплотиться в жизнь благодаря современным средствам коммуникации, я имею ввиду этот форум.
    Догадайся сколько стоит в у.е. почитать форум через GPRS? А по-другому
    как-то не получается (ну кроме как с работы). Фидо в том же виде карман
    не сильно оттягивает...

  6. #35
    Activist Аватар для fk0
    Регистрация
    18.02.2005
    Адрес
    St. Petersburg
    Сообщений
    415
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sinus
    Вы ещё с нами?
    Тогда давайте быстренько прийдём к соглашению о вызовах (что и куда пихать, и откуда резалт забирать) и к описаниям (ZX48, ZX128, etc)

    по поводу описания области применимости я уже высказал своё мнение.
    по соглашениям о вызовах пока мыслей нет.
    http://spbzxnet.org.ru/cdwalk/ide-driver.html#hitech-c:
    Интерфейс с компилятором языка C

    В этом разделе описывается интерфейс компилятора языка C фирмы HiTech Software (http://www.htsoft.com) с программой на языке ассемблера.
    Передача аргументов

    Функция может принимать некоторое число аргументов передаваемых вызывающей программой. Аргументами функции могут быть переменные (значения) любых типов.

    Для функций, объявленных в стиле K&R, когда аргументы функции не входят в её прототип, все аргументы передаются через стек как описано ниже. Для функций объявленных в стиле ANSI-C, когда в прототип функции входит информация о аргументах функции, передача аргументов осуществляется через регистры микропроцессора DE, BC и через стек. В любом случае, все 8-разрядные значения предварительно расширяются до 16-и разрядов, старшие разряды при этом никак не используются.

    Если функция объявлена в стиле ANSI-C, первый аргумент функции, в том случае, если он является 8-и или 16-разрядным значением, передаётся в регистре DE микропроцессора. В регистре E передаётся 8-разрядный аргумент. В противном случае, первый аргумент передаётся через стек.

    Если функция объявлена в стиле ANSI-C, второй аргумент функции, в том случае, если он является 8-и или 16-разрядным значением, передаётся в регистре BC микропроцессора. В регистре E передаётся 8-разрядный аргумент. В противном случае, второй аргумент передаётся через стек.

    Третий и остальные аргументы функции всегда передаются через стек. Аргументы функции размещаются на стеке в обратном порядке, то-есть последний аргумент помещается на стек в первую очередь, а третий аргумент, в случае если оба первых аргумента передаются через регистры DE и BC, помещается на стек в последнюю очередь. Аргументы, занимающие в памяти один байт (8-разрядные), как уже говорилось, обязательно всегда расширяются до 16-и разрядов и следовательно на стеке занимают по два байта. Аргументы, занимающие в памяти 3 байта, расширяются до 32-х разрядов и помещаются на стек в 4 байта. Аргументы большей разрядности занимают на стеке ровно столько байт, сколько требуется для их сохранения, то-есть, например, если есть некий тип данных занимающий в памяти ровно 5 байт то он и на стеке займёт 5 байт если будет передан аргументом функции.

    В случае, если функция объявлена в стиле ANSI-C и хоть один аргумент был передан через стек, то вызываемая функция обязана снять со стека все аргументы перед возвратом, а вызывающая программа может об этом не беспокоиться. В случае, когда функция объявлена в стиле K&R, вызывающая программа обязана извлечь из стека все аргументы переданные через стек.
    Возврат результата

    Функция может возвращать результат. Результатом может быть одна переменная (значение) любого типа. Способ, каким результат возвращается в вызываемую функцию определяется типом переменной результата. Все 8-разрядные значения предварительно расширяются до 16-разрядов, старшие разряды при этом не используются и могут содержать произвольное значение. Если результат умещается в 16 разрядов, то он возвращается в регистре HL. Если результат умещается в 32 разряда, то он возвращается в регистрах HL и DE: в регистре DE младшие разряды, а в регистре HL старшие. Результат большей разрядности (например массив или структура) помещается в статическую временную переменную, и в регистре HL возвращается указатель на эту переменную (нетрудно заметить, что в данном случае функция не может быть «реентрантной»).
    Регистры микропроцессора

    Функция может изменить содержимое любых регистров микропроцессора кроме SP и IX. Регистр SP всегда увеличивается на 2 при возврате из функции за счёт извлечения со стека адреса возврата. Дополнительно он может быть изменён в случае, если функция обязана извлечь аргументы из стека («Передача аргументов»). В регистре IX хранится указатель кадра стека вызывающей функции, поэтому вызываемая функция перед возвратом обязана восстановить содержимое регистра IX.
    Прототипы на C вот так просто и можно записывать. Можно из
    C и из асма пользовать. Отступать, с моей точки зрения, можно
    лишь в случае:

    * когда использование из языка C не имеет смысла
    (например, для функции быстрого умножения --
    в библиотеке C есть собственная);

    * при работе с ОО-функциями, которые из C не вызовешь --
    всё равно обёртку писать, хотя тут желательно слишком
    сильно не отходить;

    * когда ОЧЕНЬ ВАЖНА СКОРОСТЬ. _ОЧЕНЬ_ -- это не означает
    экономию 10 тактов из 1000. Даже не 10 из 100. Даже 100 из 10,
    если время выполнения совершенно некритично.

    Почему это важно -- это позволяет использовать C-компилятор
    без оборачивания абсолютно каждой функции ассемблера. Только
    имена нужно давать начиная с '_'. И прототип приложит.

    Может возникнуть вопрос почему HiTech. Ну... пусть будет потому,
    что он и на спектруме (в CP/M) запускается и в интернете CP/M версия
    (ей как раз UZIX собирают) свободно лежит. SDCC и Z88DK по-моему
    ещё не доросли. Остальное за деньги и под Windows -- не интересно.

    Другие альтернативы?

    По-умолчанию модель памяти плоская, без переключаемых банок.
    С прерываниями никак ничего не взаимодействует, доступны порты
    режима "Бейсик". В случае переключения банок, видимо, следует
    завести макрос сигнализирующий фактом своего наличия о возможных конфликтах. Равно как при использовании прерываний,
    переключения в TR-DOS и т.п.

    Что касается выбора ZX48/128/etc то тут можно поступить как это
    обычно делается при компиляции на несколько платформ: завидится
    платформенно-зависимый макрос, которым (ifdef) и определяется
    участвующий в компиляции код и прототипы. Библиотеки (двоичные)
    изначально делятся по платфромам, каждой своя.

  7. #36
    Activist Аватар для fk0
    Регистрация
    18.02.2005
    Адрес
    St. Petersburg
    Сообщений
    415
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В догонку: для OO функций принимается, что указатель на объект передаётся обязательно в регистре HL, остальное как описано выше. Первые два байта в области памяти, на которую указывает регистр HL -- таблица JP xxx виртуальных функций, далее собственно данные.

  8. #37
    Activist Аватар для fk0
    Регистрация
    18.02.2005
    Адрес
    St. Petersburg
    Сообщений
    415
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от CityAceE
    Что касается вызова процедур, я всё же подумал и мне кажется, что наиболее универсально будет передавать данные в процедуры таким образом:

    CALL PROC
    DB VAR1
    DW VAR2

    Это медленнее, но за то не привязываемся к регистрам!
    Ага. А все аргументы: исключительно константы... Или там где DW -- это ссылка? По сложности проще будет машину тьюринга запрограммировать...

    Если не привязываться: стек, как компилятор умеет.


    push argument
    push argument
    call function ; -> hl=result
    pop xx
    pop xx
    Только опыт подсказывает: через регистры заметно быстрей.
    (а что HL из использования выпадает, так это исправляется в
    4 такта ex hl, de -- зато сразу есть свободный 16-разрядный
    регистр который может использоваться для арифметики. С
    регистром A -- аналогично, не сохраняется и нигде не
    используется для передачи ничего, кроме как для вычислений)

  9. #38
    Activist
    Регистрация
    23.03.2005
    Адрес
    г. Чернигов, Украина
    Сообщений
    477
    Спасибо Благодарностей отдано 
    15
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А не громоздко ?

    Ну вот надо мне символ печатнуть
    Что мне для этого надо
    адр шрифта, xy pix, код символа.

    Т.е. через регистры. Многим вещам надо 1-2 регистра на входе и 1-2 значения на выходе.

    Насчет изучения чужого и "нового языка": а где там разбираться ?
    Вот берем MAC lib (см. выше)
    -------------------
    PR_ATTR (-) (call pr_attr)
    - fill окна атрибутами (40 b)

    LD HL,tabl
    CALL pr_attrs
    ...
    tabl DB x,y,w>,h^,цвет

    если "-" то
    CALL pr_attrs
    DB x,y,w>,h^,цвет

    Требует at_attr DE,HL
    -----------------------

    Ну вот что тут не ясно/сложно ?

    Проблемы могут быть с запряганием глобальных вещей типа интерфейса оконного с мышой и прибамбасами. Ну и то...

  10. #39
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,258
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    84
    Поблагодарили
    36 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Знахарь
    В случае, если функция объявлена в стиле ANSI-C и хоть один аргумент был передан через стек, то вызываемая функция обязана снять со стека все аргументы перед возвратом, а вызывающая программа может об этом не беспокоиться. В случае, когда функция объявлена в стиле K&R, вызывающая программа обязана извлечь из стека все аргументы переданные через стек
    имхо первый вариант очень уж опасен. лучше остановиться на втором (когда стек очищает вызывающая процедура).иначе такой вот вызов:
    printf("%i %i %i", param1, param2);
    рискует похерить стек- процедура будет определять число параметров по форматирующей строке...
    а если очистку стека будет выполнять вызывающая процедура, то вызываемая напечатает фигню, но вернется правильно и стек будет в правильном состоянии.

  11. #40
    Alexander Bondarenko (500:3432/3)
    Гость

    По умолчанию Конструктор (ZX SDK)

    *Здравствуй, Даниил!*

    Лови мои идеи по поводу сабжа "Конструктор (ZX SDK)", о котором трещала в 30 Nov 2005 твоя портянка к тов. All.

    и получиться очередной велосипед под названием Язык высокого уровня
    плюс компилятор на базе асма!
    А вот ты зpя этy штyкy велосиподем обзываешь. Я себе нечто подобное давно ещё оpганизовал, когда аласм появился 4.44... Очень yпpощает пpоцесс написания пpогpамм. Только я давно yже не кодил, эта штyка y меня лежит где-то и пылится.

    А пpедставляет оно из себя следyющее:

    1. MAIN_H - вставляется в начало пpоги, там нyжные макpосы и константы.
    2. MAIN_L - ядpо библиотек.
    х. ... - дальше пошли сами библиотеки.

    Такая система делает то, что считает, кyда сколько какой памяти yшло. Это необходимо, чтобы SAVE делать одним макpосом. Hy и ещё пpоцедypки динамически пpилинковываются.

    А в самом издохнике пpогpаммы я телько макpосами игpаюсь, да пpоцедypки нyжные мне вызываю обычным CALL'ом. Кстати, макpосы использyются очень-очень активно.

    Hо только я этy идею закопал давно yже. Hе очень-то комфоpтно кодить под омyлем, да ещё и в алясме. Лyчше yж на пэцее замyтить пyтёвый асм спеpва. А потом под него и сyпеp-пyпеp библиотеки мyтить.

    Хотя, опять же, если только кодить на pеале... %)

    /Вот и всё, Даниил, можешь листать дальше.../

    ... C миру по исходничку - и готова программка.

Страница 4 из 13 ПерваяПервая 12345678 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •