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

User Tag List

Страница 7 из 7 ПерваяПервая ... 34567
Показано с 61 по 70 из 70

Тема: LASER BASIC 2

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

    По умолчанию

    Вот моя процедура зеркалирования окна. Если вы видите как её оптимизнуть (не для демостроя, без таблиц), то милости прошу. У нас техническая тема, так что по возможности без эмоций, ладно?

    Код:
    void Laser2_MIRV (unsigned char col, unsigned char row, unsigned char len, unsigned char hgt) __z88dk_callee
    {
      __asm
                      POP   DE
                      POP   BC              ; C = col; B = row
                      CALL  __Laser2_XYtoScr
                      POP   BC              ; C = len; B = hgt
                      PUSH  DE
                      LD    A, C
                      LD    (MIRV_WIDTH$+1), A
                      INC   A
                      SRL   A
                      LD    (MIRV_WIDTH_DIV2$+1), A
    MIRV_HLINE$:      PUSH  BC              ; Begin of loop on charlines
                      LD    A, #8
    MIRV_LINE8$:      EX    AF, AF
                      LD    (MIRV_SCR_ADR$+1), HL
                      LD    A, L
    MIRV_WIDTH$:      ADD   #0
                      LD    E, A
                      LD    D, H
    MIRV_WIDTH_DIV2$: LD    B, #0
    
    MIRV_COL_MIRROR$: DEC   E
                      LD    A, (DE)
                      LD    C, (HL)
    
                      ; ------------------
                      ; 2 bytes mirroring
                      ; ------------------
                      RLA
                      RR    C
                      RLA
                      RR    C
                      RLA
                      RR    C
                      RLA
                      RR    C
                      RLA
                      RR    C
                      RLA
                      RR    C
                      RLA
                      RR    C
                      RLA
                      RR    C
                      ; ------------------
    
                      RLA
                      LD    (DE), A
                      LD    (HL), C
                      INC   L
                      DJNZ  MIRV_COL_MIRROR$
    MIRV_SCR_ADR$:    LD    HL, #0
                      INC   H
                      EX    AF, AF
                      DEC   A
                      JR    NZ, MIRV_LINE8$
                      LD    A, L
                      ADD   #0x20           ; Next charline
                      LD    L, A            ; If carry then jump to next third of screen
                      JR    C, MIRV_CONT_1_3$
                      LD    A, H
                      SUB   #8              ; HL := HL - 0x0800
                      LD    H, A
    MIRV_CONT_1_3$:   POP   BC
                      DJNZ  MIRV_HLINE$     ; End of loop on charlines (the same third)
      __endasm;
    } //Laser2_MIRV

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

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

    По умолчанию

    Сделал вывод спрайта с отсечением невидимой части, не помещающейся на экране. Кода понадобилось дофига прилично (+ байт 300). В приложенном архиве чудик, выбегающий из-за экрана и убегающий туда же, и двигающийся большой спрайт, которым можно рулить QAOP.

    Laser2Demo.zip

    Дайте верт. скроллинг знакоместного окна на произвольное к-во пикселов, ну плиз! Так вломы писать! %) Может кто-то расковыривал SCROLL и SCROLLW из Mega Basic?

    - - - Добавлено - - -

    В Laser2 можно иметь спрайты размером превышающие размер экрана. Как с этим обстоят дела в оригинальном Laser Basic - не знаю. Скорее всего, тоже можно.

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

    По умолчанию

    Как может выглядеть PIXEL_ADD, адаптированный для работы с экраном (буфером), размещённым по произвольному адресу?

    Код:
    22B0	LD	B,A
    22B1	AND	A
    22B2	RRA	
    22B3	SCF	
    22B4	RRA	
    22B5	AND	A
    22B6	RRA	
    22B7	XOR	B
    22B8	AND	A,F8H
    22BA	XOR	B
    22BB	LD	H,A
    22BC	LD	A,C
    22BD	RLCA	
    22BE	RLCA	
    22BF	RLCA	
    22C0	XOR	B
    22C1	AND	A,C7H
    22C3	XOR	B
    22C4	RLCA	
    22C5	RLCA	
    22C6	LD	L,A
    22C7	LD	A,C
    22C8	AND	A,07H
    22CA	RET

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

    По умолчанию

    Искомый PIXEL_ADD, адаптированный для работы с экраном (буфером), размещённым по произвольному адресу.

    Код:
    ; Вычисляем в HL адрес байта в экранной области
                 ld    a,(_X1)      ; 13
                 ld    c,a          ;  4
                 rra                ;  4
                 rra                ;  4
                 rra                ;  4
                 and   #1F          ;  7
                 ld    l,a          ;  4
      
                 ld    a,(_Y1)      ; 13
                 ld    b,a          ;  4
                 and   #38          ;  7
                 rla                ;  4
                 rla                ;  4
                 or    l            ;  4
                 ld    l,a          ;  4
    
                 ld    a,b          ;  4
                 and   #07          ;  7
                 ld    h,a          ;  4
    
                 ld    a,b          ;  4
                 and   #C0          ;  7
                 rra                ;  4
                 rra                ;  4
                 rra                ;  4
                 or    h            ;  4
    ScrHighByte: or    #40          ;  7
                 ld    h,a          ;  4
                 ret                ; 10
    Старший байт адреса экрана (или буфера) пишется подпрограммой настройки по адресу ScrHighByte+1.

    В Laser2 я использую модифицированную версию этого кода, чтобы задавать Y в пикселях, а X в знакоместах, так что код получается проще.

    Благодарю AzAtom'а за эту процедуру.

  6. #65
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,746
    Спасибо Благодарностей отдано 
    256
    Спасибо Благодарностей получено 
    265
    Поблагодарили
    199 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Искомый PIXEL_ADD, адаптированный для работы с экраном (буфером), размещённым по произвольному адресу.

    Код:
    ; Вычисляем в HL адрес байта в экранной области
                 ld    a,(_X1)      ; 13
                 ld    c,a          ;  4
                 rra                ;  4
                 rra                ;  4
                 rra                ;  4
                 and   #1F          ;  7
                 ld    l,a          ;  4
      
                 ld    a,(_Y1)      ; 13
                 ld    b,a          ;  4
                 and   #38          ;  7
                 rla                ;  4
                 rla                ;  4
                 or    l            ;  4
                 ld    l,a          ;  4
    
                 ld    a,b          ;  4
                 and   #07          ;  7
                 ld    h,a          ;  4
    
                 ld    a,b          ;  4
                 and   #C0          ;  7
                 rra                ;  4
                 rra                ;  4
                 rra                ;  4
                 or    h            ;  4
    ScrHighByte: or    #40          ;  7
                 ld    h,a          ;  4
                 ret                ; 10
    Старший байт адреса экрана (или буфера) пишется подпрограммой настройки по адресу ScrHighByte+1.

    В Laser2 я использую модифицированную версию этого кода, чтобы задавать Y в пикселях, а X в знакоместах, так что код получается проще.

    Благодарю AzAtom'а за эту процедуру.
    выделенное жирным надо заменить на
    Код:
    ScrHighByte: add a,#40          ;  7
    иначе адрес не произвольный
    С уважением,
    Jerri / Red Triangle.

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

    По умолчанию

    Хочу подвести итоги по проекту.

    Проект Laser 2 успешно доведён до требуемой кондиции и показал себя в работе хорошо и стабильно. Я реализовал-таки вертикальный нециклический скроллинг вверх и вниз. И ещё циклический скроллинг вверх (с буфером) на 1 пиксель. Перевёл порт игры на Laser 2, и бинарь стал меньше примерно на килобайт.



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

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

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

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


  8. #67

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

    По умолчанию

    Благодарю! И спасибо всем, кто участвовал в обсуждении.
    Игорь, между прочим, именно ваш Laser и сподвиг меня в итоге на порт Дурака, из чего вылился проект ZXDev.

    А вот как выглядит интерфейс для работы с Laser 2 на языке Оберон:

    Код:
    DEFINITION Laser2; (* non-portable *)
    
    (***************************)
    (* LASER 2  Graphic Engine *)
    (*  Coded by Oleg N. Cher  *)
    (*   zx.oberon2.ru/forum   *)
    (***************************)
    
    TYPE
      ADR     = LONGINT;
      BUFFER  = ARRAY OF CHAR;
      SPRITES = ARRAY OF CHAR;
      UBYTE   = INTEGER;
    
    (* New procedures: *)
    
    PROCEDURE SCRL  (adr: ADR) (* Init sprites *)   ;
    PROCEDURE SCRLv (adr: ADR) (* in variable *)    ;
    PROCEDURE SCRLa (buf: BUFFER) (* in array *)    ;
    PROCEDURE SPRT  (adr: ADR) (* Init sprites *)   ;
    PROCEDURE SPRTv (adr: ADR) (* in variable *)    ;
    PROCEDURE SPRTa (sprites: SPRITES) (* array *)  ;
    PROCEDURE SCRN  (adr: ADR) (* Set screen *)     ;
    
    (* Synonyms for the new procedures: *)
    
    PROCEDURE InitScroll   (adr: ADR)               ;
    PROCEDURE InitScrollV  (adr: ADR) (* in var *)  ;
    PROCEDURE InitScrollA  (buf: BUFFER)            ;
    PROCEDURE InitSprites  (adr: ADR)               ;
    PROCEDURE InitSpritesV (adr: ADR) (* in var *)  ;
    PROCEDURE InitSpritesA (sprites: SPRITES)       ;
    PROCEDURE SetScreen    (adr: ADR)               ;
    
    (* Sprite manipulations: *)
    
    PROCEDURE ATOF                                  ;
    PROCEDURE ATON                                  ;
    PROCEDURE INVM (spn: UBYTE)                     ;
    PROCEDURE PTBL (col, row: SHORTINT; spn: UBYTE) ;
    PROCEDURE PTND (col, row: SHORTINT; spn: UBYTE) ;
    PROCEDURE PTNV (col, row: SHORTINT; spn: UBYTE) ;
    PROCEDURE PTOR (col, row: SHORTINT; spn: UBYTE) ;
    PROCEDURE PTXR (col, row: SHORTINT; spn: UBYTE) ;
    
    (* Screen windows processing: *)
    
    PROCEDURE CLSV (col, row, len, hgt: UBYTE)      ;
    PROCEDURE INVV (col, row, len, hgt: UBYTE)      ;
    PROCEDURE MIRV (col, row, len, hgt: UBYTE)      ;
    PROCEDURE SDNV (col, row, len, hgt, npx: UBYTE) ;
    PROCEDURE SUPV (col, row, len, hgt, npx: UBYTE) ;
    PROCEDURE SL1V (col, row, len, hgt: UBYTE)      ;
    PROCEDURE SL4V (col, row, len, hgt: UBYTE)      ;
    PROCEDURE SL8V (col, row, len, hgt: UBYTE)      ;
    PROCEDURE SR1V (col, row, len, hgt: UBYTE)      ;
    PROCEDURE SR4V (col, row, len, hgt: UBYTE)      ;
    PROCEDURE SR8V (col, row, len, hgt: UBYTE)      ;
    PROCEDURE WL1V (col, row, len, hgt: UBYTE)      ;
    PROCEDURE WL4V (col, row, len, hgt: UBYTE)      ;
    PROCEDURE WL8V (col, row, len, hgt: UBYTE)      ;
    PROCEDURE WR1V (col, row, len, hgt: UBYTE)      ;
    PROCEDURE WR4V (col, row, len, hgt: UBYTE)      ;
    PROCEDURE WR8V (col, row, len, hgt: UBYTE)      ;
    PROCEDURE WU1V (col, row, len, hgt: UBYTE)      ;
    
    (* Attribute windows processing: *)
    
    PROCEDURE AWLV (col, row, len, hgt: UBYTE)      ;
    PROCEDURE AWRV (col, row, len, hgt: UBYTE)      ;
    PROCEDURE MARV (col, row, len, hgt: UBYTE)      ;
    PROCEDURE SETV (col, row, len, hgt: UBYTE)      ;
    
    END Laser2.
    Последний раз редактировалось Oleg N. Cher; 26.10.2016 в 00:16.

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

    По умолчанию

    Исправил досадную ошибку в CLSV и INVV, связанную с некорректным вычислением адреса нижней строки знакомест.

    Также пересобрал игру Бега мышей с помощью библиотеки Laser2. Интересно, что я делал ранее прогноз и, как выяснилось, оказался прав:

    Цитата Сообщение от Oleg N. Cher
    Скомпилированная игра «Бега мышей» занимает сейчас 13 кб, и это очень много. Оптимизировать её по размеру кода можно в десятке направлений. Мой прогноз: в рамках технологии ZXDev её размер после оптимизации будет не больше 3,5 кб. И такая оптимизация желательна не только для уменьшения размера этой игры. Сама возможность оптимизации должна показать скептикам на практике переход от макета, подготовленного очень быстро, до эффективного компактного релиза.
    Ну вот, сегодня всех обрадую: с библиотекой Laser2 игра стала весить 3175 байт. После hrust'а 2607 байт. Это не предел конечно, есть ещё возможности для мелких оптимизаций.

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

    По умолчанию

    Тема «Графический движок Laser 2 (на концепте Laser Basic)» на Оберон-форуме:


Страница 7 из 7 ПерваяПервая ... 34567

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

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

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

Похожие темы

  1. LASER BASIC
    от VETER в разделе Программирование
    Ответов: 8
    Последнее: 04.01.2015, 04:48
  2. laser basic
    от johnny в разделе Программирование
    Ответов: 32
    Последнее: 17.02.2014, 22:57
  3. LASER BASIC decompiled by HVG
    от Raydac в разделе Программирование
    Ответов: 0
    Последнее: 21.12.2009, 23:04
  4. Возрождение Laser Squad
    от Odrick в разделе Игры
    Ответов: 17
    Последнее: 08.11.2005, 02:18
  5. Re: Laser Genius
    от Oleg Golenkoff (2:451/19) в разделе Софт
    Ответов: 3
    Последнее: 01.10.2005, 06:06

Ваши права

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