Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 21 ноя 2017, 15:58

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
СообщениеДобавлено: 11 янв 2017, 04:32 
Не в сети
Аватара пользователя

Сообщения: 843
Откуда: Днепропетровская обл.
Закодировал альтернативную Laser графическую библиотеку Laser 2. Нововведения такие.

    • Изменён формат вывода спрайтов (познакоместно вместо построчно), разработан сырой конвертер для перегонки спрайтов из формата Laser в Laser 2 (конвертирует на уровне исходного текста), включён в репозиторий ZXDev.

    • Введена опция OUT_OF_SCREEN для вывода спрайта за пределами экрана. Отключение её (если все спрайты выводятся только в экран) даёт неплохой прирост памяти и скорости.

    • Добавлена процедура PTNV — вывод инвертированного спрайта. В Laser для этого нужно было инвертировать спрайт в памяти MIRM, PTBL и опять MIRM, чтобы привести его в исходное состояние. Или же вывод и — уже на экране — MIRV.

    • В Laser 2 использованы новые механизмы SDCC для передачи параметров — модели вызова __z88dk_fastcall и __z88dk_callee, а также модификатор __preserves_regs для использования неизменяемых подпрограммой регистров для дополнительных оптимизаций.

    • В Laser 2 можно иметь спрайты размером превышающие размер экрана.

    • Процедуры из пакета Laser 2 превосходят Laser компактности и скорости вывода. Также процедуры хорошо друг от друга изолированы, т.е. отдельно взятый вывод спрайтов или отдельный скроллинг не тянет с собой пол-движка (как в Laser).

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

    • Реализована работа с экраном, адрес которого задаётся произвольно (процедурой SetScreen).

    • Короткие имена-синонимы SCRL, SPRT и SCRN (в духе Laser Basic) для процедур InitScroll, InitSprites и SetScreen.

    • SDNV и SUPV с положительным числом пикселей для скроллинга вместо SCRV с положительным/отрицательным (так оптимальнее).

    • WU1V для циклического скроллинга вверх на 1 знакоместо вместо универсального WCRV. Симметричный WD1V и циклический скроллинг на произвольное число пикселей не реализованы (за ненадобностью).

    • Изменены имена процедур для циклического скроллинга атрибутов: AWLV и AWRV вместо ATLV и ATRV. В Laser Basic нет иного скроллинга атрибутов, кроме циклического. Мы зарезервировали имена ATLV и ATRV для нециклического скроллинга (не реализован за ненадобностью).

Ещё отличие Laser 2 от Laser: нет никакой проверки координат на выход за пределы экрана. Конечно при выводе спрайтов это учтено (в режиме OUT_OF_SCREEN спрайт может выходить за границы экрана), но во всех остальных случаях никаких проверок не производится. Это сделано для ускорения графического вывода.


Интерфейс для работы с Laser 2 на языке Оберон:
Код: "OBERON"
  1. DEFINITION Laser2; (* non-portable *)
  2.  
  3. (***************************)
  4. (* LASER 2 Graphic Engine *)
  5. (* Coded by Oleg N. Cher *)
  6. (* zx.oberon2.ru/forum *)
  7. (***************************)
  8.  
  9. TYPE
  10. ADR = LONGINT;
  11. BUFFER = ARRAY OF CHAR;
  12. SPRITES = ARRAY OF CHAR;
  13. UBYTE = INTEGER;
  14.  
  15. (* New procedures: *)
  16.  
  17. PROCEDURE SCRL * (adr: ADR) (* Set WU1V's scroll buffer *) ;
  18. PROCEDURE SCRLv * (adr: ADR) (* in variable *) ;
  19. PROCEDURE SCRLa * (buf: BUFFER) (* in array *) ;
  20. PROCEDURE SPRT * (adr: ADR) (* Set address of sprites *) ;
  21. PROCEDURE SPRTv * (adr: ADR) (* in variable *) ;
  22. PROCEDURE SPRTa * (sprites: SPRITES) (* in array *) ;
  23. PROCEDURE SCRN * (adr: ADR) (* Set address of screen *) ;
  24.  
  25. (* Synonyms for the new procedures: *)
  26.  
  27. PROCEDURE InitScroll * (adr: ADR) (* WU1V's scroll buf *) ;
  28. PROCEDURE InitScrollV * (adr: ADR) (* in variable *) ;
  29. PROCEDURE InitScrollA * (buf: BUFFER) (* in array *) ;
  30. PROCEDURE InitSprites * (adr: ADR) (* Set sprites adr *) ;
  31. PROCEDURE InitSpritesV * (adr: ADR) (* in variable *) ;
  32. PROCEDURE InitSpritesA * (sprites: SPRITES) (* in array *) ;
  33. PROCEDURE SetScreen * (adr: ADR) (* Set screen adr *) ;
  34.  
  35. (* Sprite engine (in OUT_OF_SCREEN the coords can be outside the screen): *)
  36.  
  37. PROCEDURE ATOF * ;
  38. PROCEDURE ATON * ;
  39. PROCEDURE INVM * (spn: UBYTE) ;
  40. PROCEDURE PTBL * (col, row: SHORTINT; spn: UBYTE) ;
  41. PROCEDURE PTND * (col, row: SHORTINT; spn: UBYTE) ;
  42. PROCEDURE PTNV * (col, row: SHORTINT; spn: UBYTE) ;
  43. PROCEDURE PTOR * (col, row: SHORTINT; spn: UBYTE) ;
  44. PROCEDURE PTXR * (col, row: SHORTINT; spn: UBYTE) ;
  45.  
  46. (* Screen windows processing (coordinates CANNOT be outside the screen): *)
  47.  
  48. PROCEDURE CLSV * (col, row, len, hgt: SHORTINT) ;
  49. PROCEDURE INVV * (col, row, len, hgt: SHORTINT) ;
  50. PROCEDURE MIRV * (col, row, len, hgt: SHORTINT) ;
  51. PROCEDURE SDNV * (col, row, len, hgt: SHORTINT; npx: UBYTE) ;
  52. PROCEDURE SUPV * (col, row, len, hgt: SHORTINT; npx: UBYTE) ;
  53. PROCEDURE SL1V * (col, row, len, hgt: SHORTINT) ;
  54. PROCEDURE SL4V * (col, row, len, hgt: SHORTINT) ;
  55. PROCEDURE SL8V * (col, row, len, hgt: SHORTINT) ;
  56. PROCEDURE SR1V * (col, row, len, hgt: SHORTINT) ;
  57. PROCEDURE SR4V * (col, row, len, hgt: SHORTINT) ;
  58. PROCEDURE SR8V * (col, row, len, hgt: SHORTINT) ;
  59. PROCEDURE WL1V * (col, row, len, hgt: SHORTINT) ;
  60. PROCEDURE WL4V * (col, row, len, hgt: SHORTINT) ;
  61. PROCEDURE WL8V * (col, row, len, hgt: SHORTINT) ;
  62. PROCEDURE WR1V * (col, row, len, hgt: SHORTINT) ;
  63. PROCEDURE WR4V * (col, row, len, hgt: SHORTINT) ;
  64. PROCEDURE WR8V * (col, row, len, hgt: SHORTINT) ;
  65. PROCEDURE WU1V * (col, row, len, hgt: SHORTINT) ;
  66.  
  67. (* Attribute windows processing (coordinates CANNOT be outside the screen): *)
  68.  
  69. PROCEDURE AWLV * (col, row, len, hgt: SHORTINT) ;
  70. PROCEDURE AWRV * (col, row, len, hgt: SHORTINT) ;
  71. PROCEDURE MARV * (col, row, len, hgt: SHORTINT) ;
  72. PROCEDURE SETV * (col, row, len, hgt: SHORTINT) ;
  73.  
  74. END Laser2.

На данный момент работу над этой библиотекой считаю замороженной. Все процедуры из набора Laser Basic реализовывать не планирую, сделал только нужные (мне) для порта игры «Дурак».

У меня просьба. Если будете что-то делать в этом направлении, давайте скоординируем все изменения. Если будете применять Laser 2 в своих проектах, напишите мне. Это же интересно, в конце концов. :-)

Самая свежая версия библиотеки Laser 2 живёт здесь:



Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


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

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Тех.поддержка phpBB