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

User Tag List

Страница 19 из 54 ПерваяПервая ... 151617181920212223 ... ПоследняяПоследняя
Показано с 181 по 190 из 531

Тема: ZX Like Pascal

  1. #181
    Activist Аватар для AzAtom
    Регистрация
    05.04.2015
    Адрес
    г. Майкоп
    Сообщений
    292
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Andrew771, ааа, вот почему карта не отображалась Теперь работает. Внесу соответствующие изменения и комментарии в модуль.

    Обнаружились проблемы.
    - Частота кадров очень низкая получается на спектруме. Даже не знаю, что тут можно сделать.
    - После примерно минуты работы той моей тестовой программы спектрум виснет/перезагружается.

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

    Andrew771, хорошо бы объявление массивов сделать как на турбопаскале. Можно ввести ограничение, чтобы первый элемент всегда указывался 1 и размерность не больше 2, иначе компилятор будет выдавать ошибку. Плюс добавить инициализацию массива при объявлении. Тогда не нужно будет спрайты и карты пихать после end., и разработка с моим модулем тоже упроститься, не нужно будет переносить код спрайтов туда-сюда, плюс не нужно будет в .asm файле убирать повторное объявление массива карты.

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

  3. #182
    Veteran
    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,858
    Спасибо Благодарностей отдано 
    131
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    62 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от AzAtom Посмотреть сообщение
    - Частота кадров очень низкая получается на спектруме. Даже не знаю, что тут можно сделать.
    Если на экране мало спрайтов двигается между кадрами, то может проще не использовать виртуальный экран, а стирать спрайт на старом месте и выводить на новом (команды WindowGet и WindowPut).

    Цитата Сообщение от AzAtom Посмотреть сообщение
    - После примерно минуты работы той моей тестовой программы спектрум виснет/перезагружается.
    Фиг знает, нужно искать причину. Стек не переполняется? Память не расходуется полностью?


    Цитата Сообщение от AzAtom Посмотреть сообщение
    Andrew771, хорошо бы объявление массивов сделать как на турбопаскале. Можно ввести ограничение, чтобы первый элемент всегда указывался 1 и размерность не больше 2, иначе компилятор будет выдавать ошибку. Плюс добавить инициализацию массива при объявлении. Тогда не нужно будет спрайты и карты пихать после end., и разработка с моим модулем тоже упроститься, не нужно будет переносить код спрайтов туда-сюда, плюс не нужно будет в .asm файле убирать повторное объявление массива карты.
    Это да, остается найти время. Еще хотел сделать единый формат спрайтов и спрайтов карт.


    Цитата Сообщение от AzAtom Посмотреть сообщение
    размерность не больше 2, иначе компилятор будет выдавать ошибку
    он и выдает, если больше ставить.

  4. #183
    Activist Аватар для AzAtom
    Регистрация
    05.04.2015
    Адрес
    г. Майкоп
    Сообщений
    292
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Стек не переполняется? Память не расходуется полностью?
    Думаю нет. Использую только функции из zx like pascal, сам со стеком или памятью не работаю.

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Еще хотел сделать единый формат спрайтов и спрайтов карт.
    Классно будет.

    Видел твою заготовку-тест для игры Z, классно. Только карты там 4х4 знакоместа и под них дополнительно процедура написана. Может, лучше ввести их в стандартную поставку? Например, назвать MapSet2 (или 2x2), MapSet4 (или 4x4), MapPut2, MapPut4 соответственно.

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    стирать спрайт на старом месте и выводить на новом (команды WindowGet и WindowPut).
    Можно попробовать, но так будет мерцание.
    Теоретически можно как-то продумать, чтобы восстановление прежнего фона, запоминание фона на новом месте и вывод нового спрайта производились одновременно, т.е., восстановили байт фона, запомнили байт фона в новом месте, вывели байт спрайта и т.д.

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

  5. #184
    Veteran
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,042
    Спасибо Благодарностей отдано 
    934
    Спасибо Благодарностей получено 
    227
    Поблагодарили
    122 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Стек не переполняется? Память не расходуется полностью?
    Если правда интересна, надо просто взять, и посмотреть в отладчике.
    Выложите снапшот, все вместе посмотрим.

  6. #185
    Activist Аватар для AzAtom
    Регистрация
    05.04.2015
    Адрес
    г. Майкоп
    Сообщений
    292
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Интересно. Вот снапшотTestZXPas.rar.

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

    На спектруме я делаю CLEAR 24888, меняю в асме ORG 24900, компилирую и запускаю.
    23900, как исходно в программе, не получается. Если сделать CLEAR 23888, то потом не хватает памяти выполнить команду запуска.

  7. #186
    Veteran
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,042
    Спасибо Благодарностей отдано 
    934
    Спасибо Благодарностей получено 
    227
    Поблагодарили
    122 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    По адресу $6257 стоит PUSH, и то что что он PUSHает уже не POPается.

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

    Для ориентировки:
    Код:
            LD   HL,(7533H)                 ;6231   2A3375
            INC  HL                         ;6234   23
            LD   (7533H),HL                 ;6235   223375
            LD   A,4FH                      ;6238   3E4F
            LD   HL,7537H                   ;623A   213775
            CP   (HL)                       ;623D   BE
            JP   NZ,6244H                   ;623E   C24462
            JP   624DH                      ;6241   C34D62
    ; 6244 - jump/call references:
    ; JP from 623EH
            LD   A,4FH                      ;6244   3E4F
            LD   HL,7538H                   ;6246   213875
            CP   (HL)                       ;6249   BE
            JP   NZ,6254H                   ;624A   C25462
    ; 624D - jump/call references:
    ; JP from 6241H
            LD   HL,(7533H)                 ;624D   2A3375
            DEC  HL                         ;6250   2B
            LD   (7533H),HL                 ;6251   223375
    ; 6254 - jump/call references:
    ; JP from 624AH
            LD   HL,(7533H)                 ;6254   2A3375
            PUSH HL                         ;6257   E5   <--------***ТУТ!***---------
            LD   HL,0005H                   ;6258   210500
            LD   DE,001DH                   ;625B   111D00
            EX   DE,HL                      ;625E   EB
            AND  A                          ;625F   A7
            SBC  HL,DE                      ;6260   ED52
            JP   NC,626DH                   ;6262   D26D62
            POP  DE                         ;6265   D1
            ADD  HL,DE                      ;6266   19
            LD   HL,0018H,GET_CHAR          ;6267   211800
            LD   (7533H),HL                 ;626A   223375
    ; 626D - jump/call references:
    ; JP from 6262H
            LD   HL,(7533H)                 ;626D   2A3375
            LD   DE,0002H                   ;6270   110200
            EX   DE,HL                      ;6273   EB
            AND  A                          ;6274   A7
            SBC  HL,DE                      ;6275   ED52
            JP   Z,6283H                    ;6277   CA8362
            JP   C,6283H                    ;627A   DA8362
            LD   HL,0002H                   ;627D   210200
            LD   (7533H),HL                 ;6280   223375
    ; 6283 - jump/call references:
    ; JP from 6277H, 627AH
            LD   A,01H                      ;6283   3E01
            LD   (7517H),A                  ;6285   321775
            LD   (7518H),A                  ;6288   321875
            CALL 6F2AH                      ;628B   CD2A6F

  8. #187
    Activist Аватар для AzAtom
    Регистрация
    05.04.2015
    Адрес
    г. Майкоп
    Сообщений
    292
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Так вот оно что, я только количество PUSH и POP проверил, совпадало. Т.е., получается команды
    JP NC,626DH ;6262 D26D62
    POP DE ;6265 D1
    нужно поменять местами?

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

    Чуть позже попробую.

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

    Andrew771, нашли ошибку.
    Код, который нашёл Reobne соответствует участку в сгенерированном asm:
    Код:
    L16
    L17
          ld    hl,(_GGX)
          push  hl
          ld    hl,5
          ld    de,29
          ex    de,hl
          and   a
          sbc   hl,de
          jp    nc,L18
          pop   de
          add   hl,de
    L19
          ld    hl,24
          ld    (_GGX),hl
    и его исходный код на паскале:
    Код:
        if ggx+5>29 then
          ggx:=29-5;
    Я-то попробую попроще написать, но ошибка налицо.

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

    Переделал на
    Код:
        if ggx>29-5 then
          ggx:=29-5;
    теперь генерирует
    Код:
    L16
    L17
          ld    hl,(_GGX)
          ld    de,29
          ex    de,hl
          and   a
          sbc   hl,de
          jp    nc,L18
          ld    de,5
          and   a
          sbc   hl,de
    L19
          ld    hl,24
          ld    (_GGX),hl
    что тоже неправильно, потому что надо сравнивать сразу с 24, а 5 вообще не к месту. В общем, ошибка при вычислении выражений в условии.

    Ещё раз переделал на
    Код:
        if ggx>24 then
          ggx:=24;
    Теперь, вроде, правильно сгенерировал код. Единственное, осталось непонятно, зачем загружать не в нужные регистры и затем обменивать их содержимое для сравнения.

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

    Ещё есть пожелание программу завершать не "jp $", а просто "ret".

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

    Нарушен порядок вычисления выражений. Написал if (ggx+5)>29 then ggx:=29-5; и тоже правильно сгенерировал код, загрузил переменную, добавил к ней 5 и сравнил с 29. Надо чтобы сначала вычислялись выражения, затем проводилось сравнение.

  9. #188
    Activist Аватар для AzAtom
    Регистрация
    05.04.2015
    Адрес
    г. Майкоп
    Сообщений
    292
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Написал на этом паскале процедуру рисования линии и к нему на асме процедуру точки. Всего получилось заполнение экрана 192 линий по 256 точек за 12,4 сек, что соответствует 883 такта на пиксель. Сама процедура точки получилась 315 тактов, она без табличная, адрес "вычисляется" переставлением битов. Больше 500 тактов на пиксель в самом скомпилированном алгоритме линии тоже многовато, но там понятно, под переменные используются не регистры, а память.

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

    Andrew771, планируется ли поддержка мыши?
    Можно автоматически устанавливать минидрайвер, который обновляет 3 переменные в памяти, а программа может получить состояние мыши с помощью процедуры ReadMouse(X,Y,B:byte);, где X и Y координаты, а B содержит биты нажатых кнопок, например, бит 0 это левая, бит 1 правая, а бит 2 средняя кнопки.

  10. #189
    Member
    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от AzAtom Посмотреть сообщение
    Написал на этом паскале процедуру рисования линии и к нему на асме процедуру точки. Всего получилось заполнение экрана 192 линий по 256 точек за 12,4 сек, что соответствует 883 такта на пиксель. Сама процедура точки получилась 315 тактов, она без табличная, адрес "вычисляется" переставлением битов. Больше 500 тактов на пиксель в самом скомпилированном алгоритме линии тоже многовато, но там понятно, под переменные используются не регистры, а память.
    Очень жаль, что в сообщении нет этого замечательного кода, но если использовать алгоритм Брезенхема, то результаты будут в несколько раз лучше. Судя по наброску на псевдокоде, который не очень сложно перевести на асм, большую часть переменных, необходимых для рисования линии, вполне можно распихать по регистрам. Вычислять для каждой точки адрес в памяти не потребуется, и общее быстродействие без особых усилий можно довести до 150 тактов на точку плюс тактов 500 на вычисления переменных в начале функции:
    Код:
    DRAW_LINE(X1,Y1,X2,Y2):
    
    IF Y2<Y1  //рисовать линию будем с того конца, у которого Y меньше
      SWAP(X1,X2)
    DY = ABS(Y2-Y1)
    Y1 = MIN(Y1,Y2)
    
    IF X2<X1 //правим команды вращения маски и изменения указателя после метки INC_or_DEC
      INC_or_DEC = DEC_X
    ELSE
      INC_or_DEC = INC_X
    DX = ABS(X2-X1)
    
    CNT = MAX(DX,DY) //количество точек которые нужно нарисовать
    HL = COO_TO_ADR(X1,Y1) //вычисляем байт в котором сидит первая точка
    PT = 1 SHL (X1&7) //вычисляем маску точки
    ER = 0 //устанавливаем ошибку в ноль
    
    GOTO SET_PT_1
    
    INC_Y:
      ER -= DX //корректируем ошибку
      H += 1 //смещаемся по Y
      IF H AND 7 //в 7 случаях из 8 можно будет нарисовать точку без дальнейшей коррекции
        GOTO SET_PT_1
      H -= 8 //корректируем указатель и переходим в следующую строку знакомест
      L += 32
      IF L AND 224
        GOTO SET_PT_1
      H += 8 //переходим в следующий блок из 8 строк
    
    SET_PT_1: 
      (HL) |= PT //рисуем точку
      IF CNT=0 //проверяем не закончилась ли линия
        GOTO EXIT
      CNT -= 1
      IF ER>=DX //проверяем, можно ли дальше двигаться вдоль оси Y
        GOTO INC_Y
    
    INC_or_DEC: //код настроенный в начале процедуры на уменьшение или увеличение X
      RRC PT or RLC PT //сдвиг маски
      IF CY 
        INC L or DEC L //изменение указателя
      ER+=DY //коррекция ошибки
      IF ER>=DX //проверка не нужно ли сместиться по оси Y
        GOTO INC_Y
      
    SET_PT_2:
      (HL) |= PT //рисуем точку
      IF CNT=0 //проверяем не закончилась ли линия
        GOTO EXIT
      CNT-=1 
      GOTO INC_or_DEC //переходим у следующей точке
    
    EXIT:

  11. #190
    Activist Аватар для AzAtom
    Регистрация
    05.04.2015
    Адрес
    г. Майкоп
    Сообщений
    292
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    blackmirror, конкретно на этом паскале вот:
    Код:
    procedure DrawLine;
    begin
      dx:=0;
      if (x1-x2)<$8000 then dx:=x1-x2;
      if (x2-x1)<$8000 then dx:=x2-x1;
      dy:=0;
      if (y1-y2)<$8000 then dy:=y1-y2;
      if (y2-y1)<$8000 then dy:=y2-y1;
    
      if (x2-x1)<$8000 then dx1:=1 else dx1:=$FFFF;
      if (y2-y1)<$8000 then dy1:=1 else dy1:=$FFFF;
    
      if dx>dy then begin
        y:=dx / 2;
        for i:=dx downto 0 do begin
          asm(PUTPIXELA);
          y:=y+dy;
          if y>dx then begin
            y1:=y1+dy1;
            y:=y-dx;
          end;
          x1:=x1+dx1;
        end;
      end else begin
        y:=dy / 2;
        for i:=dy downto 0 do begin
          asm(PUTPIXELA);
          y:=y+dx;
          if y>dy then begin
            x1:=x1+dx1;
            y:=y-dy;
          end;
          y1:=y1+dy1;
        end;
      end;
    end;
    От привычного паскаля отличается тем, что в функции и процедуры параметры не передаются (надеюсь, что только пока не передаются) и для этого используются глобальные переменные X1,Y1,X2,Y2. Процедура адаптирована на использование целочисленных переменных с разрядностью 16 бит, хотя, наверное хватит и 8 бит, если координаты не превышают 0-255. Позже попробую.
    Процедура точки PUTPIXELA на асме, берёт координаты из переменных X1 и Y1.

Страница 19 из 54 ПерваяПервая ... 151617181920212223 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. PASCAL + MACRO11 (УКНЦ-ДВК).
    от hobot в разделе ДВК, УКНЦ
    Ответов: 341
    Последнее: 15.01.2022, 17:30
  2. Turbo Pascal для msx/msx2
    от Оззя в разделе MSX
    Ответов: 4
    Последнее: 23.02.2020, 23:59
  3. в розыске дисковая версия Pascal.
    от goblinish в разделе Программирование
    Ответов: 18
    Последнее: 16.08.2011, 16:30
  4. Pascal
    от Andrew771 в разделе Программирование
    Ответов: 22
    Последнее: 24.05.2011, 21:20
  5. Скопировать/вставить из/в HiSoft Pascal в эмуляторе
    от kit в разделе Программирование
    Ответов: 1
    Последнее: 05.02.2010, 15:35

Ваши права

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