Tutorial:plasma — различия между версиями
Материал из SpeccyWiki
Goblinish (обсуждение | вклад) (Содержимое страницы заменено на «Статья удаленна из-за самоуправства рязанского пидора Димачки Быстров…») |
NMI (обсуждение | вклад) |
||
| Строка 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
Продолжение следует...