User Tag List

Показано с 1 по 10 из 531

Тема: ZX Like Pascal

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    05.04.2015
    Адрес
    г. Майкоп
    Сообщений
    294
    Спасибо Благодарностей отдано 
    47
    Спасибо Благодарностей получено 
    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 средняя кнопки.

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

  3. #2

    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    2 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:

  4. #3

    Регистрация
    05.04.2015
    Адрес
    г. Майкоп
    Сообщений
    294
    Спасибо Благодарностей отдано 
    47
    Спасибо Благодарностей получено 
    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.

  5. #4

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

    По умолчанию

    AzAtom, получается, что алгоритмы почти совпадают, а меньшая эффективность только из-за использования паскаля и 16 разрядных переменных. Вообще отсутствие указателей и оператора goto сильно мешает написать эффективный алгоритм рисования линии на чистом паскале. В такой ситуации проще весь алгоритм делать на асме, а не только рисование точки.

  6. #5

    Регистрация
    05.04.2015
    Адрес
    г. Майкоп
    Сообщений
    294
    Спасибо Благодарностей отдано 
    47
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    blackmirror, интересный вариант. Есть замечания.

    Цитата Сообщение от blackmirror Посмотреть сообщение
    PT = 1 SHL (X1&7) //вычисляем маску точки
    ER = 0 //устанавливаем ошибку в ноль
    Старший бит на экране находится слева, поэтому надо PT = 80h SHR (X1&7),
    и ошибку надо в половину смещения: ER = MIN(DX, DY) DIV 2, иначе, линия будет ниже настоящей и последовательные линии будут с длинными ступеньками на стыках.

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

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

Эту тему просматривают: 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

Ваши права

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