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

User Tag List

Страница 2 из 91 ПерваяПервая 123456 ... ПоследняяПоследняя
Показано с 11 по 20 из 907

Тема: Мощная среда ZXDev для разработки НА ПЯТИ ЯЗЫКАХ для ZX готова к тестированию

  1. #11
    Activist Аватар для Zorki-4k
    Регистрация
    26.10.2011
    Адрес
    г. Харьков, Украина
    Сообщений
    361
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Попытался написать что-то своё:
    MODULE DIC1;

    IMPORT B := Basic;

    PROCEDURE Main* ;
    VAR
    a,b : SHORTINT;
    x, h, w: SHORTINT;

    BEGIN
    B.Init;
    B.BORDER(B.Black); B.PAPER(B.Black); B.INK(B.White); B.CLS;
    h := 127; w := 127;
    B.OVER(B.On);
    FOR x := 0 TO 124 BY 2 DO
    B.PLOT(x, x); B.DRAW(h, 0); B.DRAW(0, w); B.DRAW(-h,0); B.DRAW(0, -w);
    h := h-4; w := w-4;
    END;
    B.OVER(B.Off);
    REPEAT
    FOR a := 0 TO 10 DO
    FOR b := 10 TO 0 BY -1 DO
    B.BEEP(100, a); B.BEEP(100,b);
    END;
    END;
    UNTIL TRUE;
    END Main;

    END DIC1.
    Как же так, что аргумент у B.DRAW типа SHORTINT, т.е. принимает значение +127 и я не могу линию на весь экран нарисовать длиной 255.
    TRD того, что получилось во вложении.
    Вложения Вложения
    • Тип файла: rar DIC1.rar (1.6 Кб, Просмотров: 183)
    Последний раз редактировалось Zorki-4k; 16.03.2012 в 20:57.
    ZXM-Phoenix 1024 rev04
    Leningrad-2012

  2. #12
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,593
    Спасибо Благодарностей отдано 
    2,158
    Спасибо Благодарностей получено 
    130
    Поблагодарили
    96 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Использованием типа SHORTINT {-128..127} вместо INTEGER {-32768..32767} Вы стараетесь сэкономить байт памяти, а здесь всё не так уж однозначно. Параметры в процедуры всё равно передаются через стек, и я точно не помню, но, кажется, передача двухбайтовых параметров даже создаёт более компактный код, а может даже и более быстрый. Попробуйте это сами проверить и сравнить. Я расчитываю на квалифицированную помощь опытных спектрумистов. По возможности не только обозначайте проблему, но и указывайте пути решения. Не стесняйтесь заглядывать в сгенерированные *.c и *.asm

    Объявляйте переменные как INTEGER.

    P.S. Ага, понял. Тут конечно надо исправить. Открываете File -> Open -> Basic.odc

    Было: PROCEDURE DRAW* (x, y: SHORTINT); BEGIN END DRAW;
    Стало: PROCEDURE DRAW* (x, y: Coords); BEGIN END DRAW;

    F11
    Последний раз редактировалось Oleg N. Cher; 17.03.2012 в 02:15.

  3. #13
    Activist Аватар для Zorki-4k
    Регистрация
    26.10.2011
    Адрес
    г. Харьков, Украина
    Сообщений
    361
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Бог с ними с переменными. Дело в том, что функция B.DRAW требует аргументом SHORTINT и нельзя сделать напрямую B.DRAW(255, 175);
    Очевидно, в файле Basic.odc нужно поправить строчку:
    PROCEDURE DRAW* (x, y: Coords); BEGIN END DRAW;
    ZXM-Phoenix 1024 rev04
    Leningrad-2012

  4. #14
    Veteran
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,053
    Спасибо Благодарностей отдано 
    218
    Спасибо Благодарностей получено 
    47
    Поблагодарили
    31 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Вы стараетесь сэкономить байт памяти, а здесь всё не так уж однозначно.
    Экономится не только байт памяти. Не следует забывать, что Z80 - 8-битный процессор без аппаратного умножения и деления, поэтому работа с 16-битными числами в нем в разы медленнее, чем с 8-битными. Логические операции медленнее в 2 раза, арифметические - меньше, чем в 2 раза, но все равно медленнее; умножение - в несколько раз. Не говоря уже о том, что регистров ограниченное количество. Работа с 16-битными числами без необходимости приводит к уменьшению количества доступных регистров, что еще больше замедляет код и увеличивает его размер. Такими вещами на Спектруме пренебрегать нельзя.
    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Параметры в процедуры всё равно передаются через стек, и я точно не помню, но, кажется, передача двухбайтовых параметров даже создаёт более компактный код, а может даже и более быстрый
    Если так - то это явно недостаток генератора кода. Даже если передавать параметры через стек обязательно по одному - то можно пожертвовать регистром и сгенерировать код для однобайтных параметров не хуже, чем для двухбайтных, как по размеру, так и по скорости.

  5. #15
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,593
    Спасибо Благодарностей отдано 
    2,158
    Спасибо Благодарностей получено 
    130
    Поблагодарили
    96 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я с Вами согласен, Barmaley_m. Просто советовал проверить и убедиться, как оно есть на самом деле. Конечно я завёл в Дураке тип Index (для индексации массивов) и старался использовать переменные этого типа везде, где подразумевается индекс массива. И что ж думаете. Когда Index был CARDINAL (2 байта без знака), код был на полкилобайта БОЛЬШЕ, чем когда он стал SHORTCARD (1 байт без знака), главное чтобы хватило разрядности индекса. Где массив <=256 байт, там это хорошо подходит. Вот вам пример кодовой оптимизации. Поэтому я призываю не писать SHORTINT где это явно указывает на что-то такое, чего можно обозвать другим словом (например, Coords, Mode или Color). Последнее: a) нагляднее; b) лучше поддаётся изучению "а что будет если я изменю этот тип на N? Как поведёт себя код и какой будет выйгрыш".

    Генератор кода ругать тоже не спешите, он там при передаче однобайтовых параметров даже лишний байт на стеке экономит. И спаривает параметры в регистровую пару, если таких параметра два. Я просто такты не считал. Думаете сам всё сделаешь? Руки ж блин до всего не доходят. Так что элементарно надо взять и проверить.

    ---------- Post added at 11:53 ---------- Previous post was at 11:38 ----------

    Zorki-4k, исправил обозначенные Вами проблемы с HelloWorld и неверное определение типов в Basic. Добавил символьные файлы Basic и Laser, чтобы можно было смотреть интерфейсы по Ctrl+D (http://zx.pk.ru/showthread.php?t=18489).

    - Add sym files for ZXDev/Basic and ZXDev/Laser.
    - Fix type declaration bugs in ZXDev/Basic.
    - Add to ZXDev/HelloWorld 'B.FLASH(B.Off)', 'B.WaitAKey', 'PRWORD -> PRCARD', 'Coords -> Coords/TextCoords'
    Если не владеете контролем версий, примеряйтесь. Чтобы всё заново не перекачивать, а только исправленные моменты.

    Типы – это самое слабое место в кроссплатформенности Оберон-программ, потому что на практике с типом связывают определённую разрядность. Уверенно советую пользоваться обёртками для типов. Оверхед нулевой. Наглядность повышается. А если вынести обёртки в другой модуль (скажем, Settings), то появляется возможность абстрагироваться в своих модулях от платформы, подставляя на другой платформе другую реализацию модуля Settings (с указанной другой разрядностью типов, более подходящих для другой платформы). Поэтому нас интересует минимальная разрядность (или диапазон значений), которой будет достаточно для реализации назначения данного типа, а прирост разрядности на других более мощных платформах будет им только на пользу, потому что, например, для Win32/Linux32 – 8 и 16-битная арифметика не имеет никаких преимуществ ни в скорости работы, ни в компактности кода. А ещё на мощных RISC-процессорах и платформах использование беззнаковых типов вцелом никак не более эффективно, чем знаковых. Вцелом. Придраться к моему высказыванию можно, но не нужно. А вот реальное смешивание знаковых и беззнаковых типов – часто излишний груз для компилятора и бедных мозгов программиста. Часто просто хочется указать, что это число (INTEGER), и поехали.

    Превратил PRWORD в PRCARD (вывести беззнаковое число). Развёл типы Coords и TextCoords, для наглядности, что это не одни и те же сущности. Coords задаётся в пикселях, TextCoords в знакоместах.
    Последний раз редактировалось Oleg N. Cher; 17.03.2012 в 15:01.

  6. #16
    Sinclair User Аватар для Eltaron
    Регистрация
    16.01.2005
    Адрес
    Ekaterinburg
    Сообщений
    2,045
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    143
    Спасибо Благодарностей получено 
    463
    Поблагодарили
    326 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    хм, а я точно помню, что не только через стек
    в функцию, у которой только один параметр, и он однобайтовый, sdcc передаст значение через аккумулятор
    Граф Дракула наш кумир, патамушта он вомпир!
    VKINK 9 : BORDER NOT PI

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

  8. #17
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,593
    Спасибо Благодарностей отдано 
    2,158
    Спасибо Благодарностей получено 
    130
    Поблагодарили
    96 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Eltaron, что-то в этом я сильно сомневаюсь. Но предлагаю Вам проверить, и если это и правда так, то предлагаю Вам заняться оптимизацией библиотеки Basic. Сделайте что-то мелкое, но хорошее, все скажут только спасибо.

  9. #18
    Sinclair User Аватар для Eltaron
    Регистрация
    16.01.2005
    Адрес
    Ekaterinburg
    Сообщений
    2,045
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    143
    Спасибо Благодарностей получено 
    463
    Поблагодарили
    326 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Eltaron, что-то в этом я сильно сомневаюсь. Но предлагаю Вам проверить, и если это и правда так, то
    Так проверял. Было б это не так, этот пример бы не работал - http://zx.pk.ru/showpost.php?p=471807&postcount=7
    Но это касается только единичного 8битного параметра. Во всех других случаях sdcc передает через стек.

    предлагаю Вам заняться оптимизацией библиотеки Basic. Сделайте что-то мелкое, но хорошее, все скажут только спасибо.
    У меня более глобальные планы
    Граф Дракула наш кумир, патамушта он вомпир!
    VKINK 9 : BORDER NOT PI

  10. #19
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,593
    Спасибо Благодарностей отдано 
    2,158
    Спасибо Благодарностей получено 
    130
    Поблагодарили
    96 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Eltaron Посмотреть сообщение
    Так проверял. Было б это не так, этот пример бы не работал
    Смотрите, Eltaron:

    Код:
    ;HelloWorld.c:15: Basic_BORDER(4);
    	ld	a,#0x04
    	push	af
    	inc	sp
    	call	_BORDER
    	inc	sp
    ;HelloWorld.c:16: Basic_PAPER(0);
    	ld	a,#0x00
    	push	af
    	inc	sp
    	call	_PAPER
    	inc	sp
    Если бы всё было так, как Вы утверждаете, то SDCC сгенерировал бы что-то вроде:

    Код:
    ;HelloWorld.c:15: Basic_BORDER(4);
    	ld	a,#0x04
    	call	_BORDER
    ;HelloWorld.c:16: Basic_PAPER(0);
    	ld	a,#0x00
    	call	_PAPER
    Вот если бы Вы сказали, что есть ключик, который включает безстековую передачу однобайтового параметра, с убиранием кода, генерирующего фрейм [push af : inc sp : call ... : inc sp], тогда другое дело, и Ваше утверждение было бы 100% корректно и имело бы больше смысла и пользы для нас. А Вы призываете пользоваться тем фактом, что параметр попадает в стек именно через регистр A. Это наведённый эффект, и если способ передачи параметров в SDCC изменят (а кодогенерация SDCC активно дорабатывается), например, начнут передавать через другой регистр, то у Вас всё перестанет работать. Я-то могу конечно убрать внутри процедур BORDER, PAPER и др. доставание параметров из фрейма в аккумулятор, но это такая мелочь, на которой много не выиграешь. А вот проблемы в будущем возникнуть могут. Предпочитаю кулхацкерству надёжное программирование. Хотя могу добавить включаемую ифдефом опцию, которая будет “оптимизировать” такие процедуры. Но она будет по умолчанию отключена.

    P.S. Настоящий прогресс у нас начнётся, когда кто-то из команды, занимающейся кодогенерацией SDCC, действительно добавит такой ключик. А заодно и превратит “ld a,#0x00” в “xor a” (или “sub a”) – (там, где это даст выигрыш). Или найдётся человек, который пропихнёт такие предложения Филиппу Краузе. Дело за малым. Не сидеть и мечтать об идеальном кодогенераторе, а что-нибудь для этого сделать, хотя бы маленький шаг.
    Последний раз редактировалось Oleg N. Cher; 29.03.2014 в 04:13.

  11. #20
    Guru
    Регистрация
    03.01.2006
    Адрес
    Рязань
    Сообщений
    2,935
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Реквестирую одной кнопкой компиляцию + сборку + запуск эмуля с автозапуском проги.

Страница 2 из 91 ПерваяПервая 123456 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. мощная игрушка
    от ZEman в разделе Игры
    Ответов: 129
    Последнее: 23.03.2024, 17:05
  2. Ответов: 5
    Последнее: 20.06.2011, 03:18
  3. Видеоконтроллер из пяти микросхем
    от zx-kit в разделе Изображение
    Ответов: 20
    Последнее: 31.03.2011, 14:48

Метки этой темы

Ваши права

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