Tutorial:plasma — различия между версиями

Материал из SpeccyWiki
Перейти к: навигация, поиск
(Содержимое страницы заменено на «Статья удаленна из-за самоуправства рязанского пидора Димачки Быстров…»)
м (Отмена правки 35918, сделанной участником Goblinish (обс.)- оскорбление, вандализм)
 
Строка 1: Строка 1:
Статья удаленна из-за самоуправства рязанского пидора Димачки Быстрова.Сдохни с туберкулеза гнида
+
эффект "Plasma" состоит в выборе цвета для каждой позиции с координатами(X,Y) как функции f(x,y)
 +
наиболее популярен f(x,y)=sin(a)+sin(b),где a,b - значение углов.
 +
Для понимания наберите программу на Basic:
 +
<code><pre>
 +
  1 LET attrsc=22528
 +
  10 FOR x=0 TO 23
 +
  20 FOR y=0 TO 31
 +
  21 POKE attrsc,INT (56*(SIN (x*2*PI/180)+SIN (y*PI/180)))
 +
  22 LET attrsc=attrsc+1
 +
  30 NEXT y
 +
  40 NEXT x
 +
</pre></code>
 +
 
 +
выполнение кода происходит очень долго, поэтому нужно воспользоваться хранением предварительно вычисленных значений синуса,
 +
которые подготавливаются так:
 +
<code><pre>
 +
10 for i=0 to 255
 +
20 poke 32768+i,INT(16*SIN(i*PI/180))
 +
30 next i
 +
</pre></code>
 +
 
 +
Дальнейшая процедура состоит в выборе необходимых параметров. Будьте креативны.
 +
<code><pre>
 +
        ORG #61a8
 +
 
 +
SINE equ #8000;текущая позиция таблицы значений синуса размером 256 байт
 +
 
 +
  LD HL,sintab; скопируем готовые данные в память
 +
  LD DE,SINE
 +
  LD BC,#100
 +
  LDIR
 +
;----------заполним экран шахматным узором
 +
  LD HL, #4000
 +
  LD A,#AA
 +
  LD B,#18
 +
M0 LD (HL),A
 +
  INC L
 +
  JR NZ,M0
 +
  CPL
 +
  INC H
 +
  DJNZ M0
 +
 
 +
LOOP EI
 +
    HALT
 +
    DI
 +
    CALL PLASM;вызов процедуры
 +
 
 +
    LD A,127; опрос нажатия клавиши "Пробел"
 +
    IN A,(#FE)
 +
    RRA
 +
    JR C,LOOP
 +
    EI
 +
    RET
 +
;------------------------------------
 +
PLASM
 +
pva2 LD BC,0;первоначальные значения, которые будут использоваться как SIN
 +
LD H, SINE/256;high SINE;HL будет использоваться для доступа к таблице, например, если L=1, то (HL)=SIN(1)
 +
LD IX,#5800; регистр для записи значений в область атрибутов
 +
pva1 LD DE,0;еще два значения, которые тоже будут использоваться как SIN
 +
plp1
 +
LD L,E
 +
LD A,(HL);(HL)=SIN(E),регистр E в данном случае 0
 +
ADD A,A
 +
LD L,D;(HL)=SIN(D)
 +
ADD A,(HL);A=2*SIN(E)+SIN(D)
 +
;RRA
 +
LD L,B
 +
ADD A,(HL);(HL)=SIN(B),A=2*SIN(E)+SIN(D)+SIN(B)
 +
LD L,C;;(HL)=SIN(C)
 +
ADD A,(HL);;(HL)=SIN(B),A=2*SIN(E)+SIN(D)+SIN(B)+SIN(C)
 +
RRA/делим A на 2
 +
AND 7; отрезаем лишнее значение,чтобы в область атрибутов записывались только INK значения
 +
LD(IX),A; заносим после вычислений цвет
 +
INC IX;и переходим к следующему атрибуту на экране
 +
INC D;D=D+1
 +
INC E;E=E+3;значения сделаны произвольно
 +
INC E
 +
INC E
 +
LD A,IXL;тест - достигнута ли строка атрибутов
 +
AND #1F
 +
JR NZ, plp1
 +
INC B; аналогично, изменяем значения
 +
INC B
 +
INC C
 +
INC C
 +
INC C
 +
INC C
 +
LD A,IXH; проверка, завершена ли область памяти, где хранятся атрибуты
 +
CP #5B
 +
JR NZ, pva1
 +
  LD HL,(pva1+1);теперь надо изменить начальные значения
 +
  INC H;например pva1 LD DE,0
 +
  INC L; изменится на LD DE,#0101
 +
  ld(pva1+1),HL
 +
  LD HL,(pva2+1);еще одна комбинация со значением BC
 +
  INC H
 +
  INC L
 +
  ld(pva2+1),HL
 +
  RET;завершение выполнения
 +
sintab;зарнее вычисленная таблица синусов
 +
db 00h
 +
db 00h,00h,00h,01h,01h,01h,01h,02h,02h,02h,02h,03h,03h,03h,03h,04h,04h,04h,04h,05h,05h,05h,05h,06h,06h,06h,06h,07h,07h,07h,07h,07h
 +
db 08h,08h,08h,08h,09h,09h,09h,09h,09h,0Ah,0Ah,0Ah,0Ah,0Ah,0Ah,0Bh,0Bh,0Bh,0Bh,0Bh,0Bh,0Ch,0Ch,0Ch,0Ch,0Ch,0Ch,0Ch,0Dh,0Dh,0Dh,0Dh
 +
db 0Dh,0Dh,0Dh,0Dh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh
 +
db 0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Dh,0Dh,0Dh,0Dh,0Dh,0Dh,0Dh,0Dh,0Ch,0Ch,0Ch,0Ch,0Ch,0Ch,0Ch,0Bh,0Bh
 +
db 0Bh,0Bh,0Bh,0Bh,0Ah,0Ah,0Ah,0Ah,0Ah,0Ah,09h,09h,09h,09h,09h,08h,08h,08h,08h,07h,07h,07h,07h,07h,06h,06h,06h,06h,05h,05h,05h,05h
 +
db 04h,04h,04h,04h,03h,03h,03h,03h,02h,02h,02h,02h,01h,01h,01h,01h,00h,00h,00h,00h,00h,00h,00h,0FFh,0FFh,0FFh,0FFh,0FEh,0FEh,0FEh,0FEh,0FDh
 +
db 0FDh,0FDh,0FDh,0FCh,0FCh,0FCh,0FCh,0FBh,0FBh,0FBh,0FBh,0FAh,0FAh,0FAh,0FAh,0F9h,0F9h,0F9h,0F9h,0F9h,0F8h,0F8h,0F8h,0F8h,0F7h,0F7h,0F7h,0F7h,0F7h,0F6h,0F6h,0F6h
 +
db 0F6h,0F6h,0F6h,0F5h,0F5h,0F5h,0F5h,0F5h,0F5h,0F4h,0F4h,0F4h,0F4h,0F4h,0F4h,0F4h,0F3h,0F3h,0F3h,0F3h,0F3h,0F3h,0F3h,0F3h,0F2h,0F2h,0F2h,0F2h,0F2h,0F2h,0F2h,0F2h
 +
</pre></code>
 +
 
 +
Продолжение следует...
 +
[[Категория:Программирование графики]]

Текущая версия на 16:02, 2 сентября 2015

эффект "Plasma" состоит в выборе цвета для каждой позиции с координатами(X,Y) как функции f(x,y) наиболее популярен f(x,y)=sin(a)+sin(b),где a,b - значение углов. Для понимания наберите программу на Basic:

   1 LET attrsc=22528
  10 FOR x=0 TO 23
  20 FOR y=0 TO 31
  21 POKE attrsc,INT (56*(SIN (x*2*PI/180)+SIN (y*PI/180)))
  22 LET attrsc=attrsc+1
  30 NEXT y
  40 NEXT x

выполнение кода происходит очень долго, поэтому нужно воспользоваться хранением предварительно вычисленных значений синуса, которые подготавливаются так:

10 for i=0 to 255
20 poke 32768+i,INT(16*SIN(i*PI/180))
30 next i

Дальнейшая процедура состоит в выборе необходимых параметров. Будьте креативны.

        ORG #61a8

SINE	equ #8000;текущая позиция таблицы значений синуса размером 256 байт

  LD HL,sintab; скопируем готовые данные в память
  LD DE,SINE
  LD BC,#100
  LDIR
;----------заполним экран шахматным узором
  LD HL, #4000
  LD A,#AA
  LD B,#18
M0 LD (HL),A
   INC L
   JR NZ,M0
   CPL
   INC H
   DJNZ M0

LOOP EI
    HALT
    DI
    CALL PLASM;вызов процедуры

    LD A,127; опрос нажатия клавиши "Пробел"
    IN A,(#FE)
    RRA
    JR C,LOOP
    EI
    RET
;------------------------------------
PLASM
pva2 LD BC,0;первоначальные значения, которые будут использоваться как SIN
 LD H, SINE/256;high SINE;HL будет использоваться для доступа к таблице, например, если L=1, то (HL)=SIN(1)
 LD IX,#5800; регистр для записи значений в область атрибутов
pva1 LD DE,0;еще два значения, которые тоже будут использоваться как SIN
plp1
 LD L,E
 LD A,(HL);(HL)=SIN(E),регистр E в данном случае 0
 ADD A,A
 LD L,D;(HL)=SIN(D)
 ADD A,(HL);A=2*SIN(E)+SIN(D)
 ;RRA
 LD L,B
 ADD A,(HL);(HL)=SIN(B),A=2*SIN(E)+SIN(D)+SIN(B)
 LD L,C;;(HL)=SIN(C)
 ADD A,(HL);;(HL)=SIN(B),A=2*SIN(E)+SIN(D)+SIN(B)+SIN(C)
 RRA/делим A на 2
 AND 7; отрезаем лишнее значение,чтобы в область атрибутов записывались только INK значения
 LD(IX),A; заносим после вычислений цвет
 INC IX;и переходим к следующему атрибуту на экране
 INC D;D=D+1
 INC E;E=E+3;значения сделаны произвольно
 INC E
 INC E
 LD A,IXL;тест - достигнута ли строка атрибутов
 AND #1F
 JR NZ, plp1
 INC B; аналогично, изменяем значения
 INC B
 INC C
 INC C
 INC C
 INC C
 LD A,IXH; проверка, завершена ли область памяти, где хранятся атрибуты
 CP #5B
 JR NZ, pva1
  LD HL,(pva1+1);теперь надо изменить начальные значения
  INC H;например pva1 LD DE,0
  INC L; изменится на LD DE,#0101
  ld(pva1+1),HL
  LD HL,(pva2+1);еще одна комбинация со значением BC
  INC H
  INC L
  ld(pva2+1),HL
  RET;завершение выполнения
sintab;зарнее вычисленная таблица синусов
 db 00h
 db 00h,00h,00h,01h,01h,01h,01h,02h,02h,02h,02h,03h,03h,03h,03h,04h,04h,04h,04h,05h,05h,05h,05h,06h,06h,06h,06h,07h,07h,07h,07h,07h
 db 08h,08h,08h,08h,09h,09h,09h,09h,09h,0Ah,0Ah,0Ah,0Ah,0Ah,0Ah,0Bh,0Bh,0Bh,0Bh,0Bh,0Bh,0Ch,0Ch,0Ch,0Ch,0Ch,0Ch,0Ch,0Dh,0Dh,0Dh,0Dh
 db 0Dh,0Dh,0Dh,0Dh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh
 db 0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Eh,0Dh,0Dh,0Dh,0Dh,0Dh,0Dh,0Dh,0Dh,0Ch,0Ch,0Ch,0Ch,0Ch,0Ch,0Ch,0Bh,0Bh
 db 0Bh,0Bh,0Bh,0Bh,0Ah,0Ah,0Ah,0Ah,0Ah,0Ah,09h,09h,09h,09h,09h,08h,08h,08h,08h,07h,07h,07h,07h,07h,06h,06h,06h,06h,05h,05h,05h,05h
 db 04h,04h,04h,04h,03h,03h,03h,03h,02h,02h,02h,02h,01h,01h,01h,01h,00h,00h,00h,00h,00h,00h,00h,0FFh,0FFh,0FFh,0FFh,0FEh,0FEh,0FEh,0FEh,0FDh
 db 0FDh,0FDh,0FDh,0FCh,0FCh,0FCh,0FCh,0FBh,0FBh,0FBh,0FBh,0FAh,0FAh,0FAh,0FAh,0F9h,0F9h,0F9h,0F9h,0F9h,0F8h,0F8h,0F8h,0F8h,0F7h,0F7h,0F7h,0F7h,0F7h,0F6h,0F6h,0F6h
 db 0F6h,0F6h,0F6h,0F5h,0F5h,0F5h,0F5h,0F5h,0F5h,0F4h,0F4h,0F4h,0F4h,0F4h,0F4h,0F4h,0F3h,0F3h,0F3h,0F3h,0F3h,0F3h,0F3h,0F3h,0F2h,0F2h,0F2h,0F2h,0F2h,0F2h,0F2h,0F2h

Продолжение следует...