Fire-эффект под TS-Conf

Решил поговнокодить поэкспериментировать с палитровым режимом 16c на TS-Conf, и заодно попробовать запилить эффект «огня» по классическому алгоритму, а не так, как это делал раньше на «Настоящем ATM спектруме».

Собственно говнокод быстрый набросок исходника:


; Fire Fx
							DEVICE PENTAGON128
; Definitions

; Ts-conf Ports
Vconfig:				EQU $00AF ; Video Mode, %yy0000xx, xx - video mode (%00 - ZX standart, %01 - ATM 16 Colors, %10 - 256 colors, %11 - Text mode), yy - Resolution (%00 – 256x192,%01 – 320x200,%10 – 320x240,%11 – 360x288)
Vpage:					EQU $01AF; Video Page - 16 col - (must be  ..mod 8), 256 col - must be ..mod 16
XOffsL:					EQU $02AF; Low byte horisontal Offset (8bit)
XOffsH:					EQU $03AF; High byte horisontal Offset (1bit)
YOffsL:					EQU $04AF; Low byte Vertical Offest (8bit)
YOffsH:					EQU $05AF; High byte Vertical Offset (1bit)
Border:					EQU $0FAF; Border color
FMaddr:				EQU $15AF; Mapping register - %000xyyyy -   x - mapping ON, yyy - mapping adress;
Palsel					EQU $07AF; Pallete bank selector
Page0					EQU $10AF; Set RAM Page in $0000, 0..255
Page1					EQU $11AF; Set RAM Page in $4000, 0..255
Page2					EQU $12AF; Set RAM Page in $8000, 0..255
Page3					EQU $13AF; Set RAM Page in $C000, 0..255
PalSel 					EQU $07AF; Select palette set yyyyxxxx, xxxx- 256/16=16
SysConfig				EQU $20AF; System Config 00000xyy, x - Cache EN, y - CLK

				
; Porram				
							ORG $8000
START:					ld a,$02  ; set 14mhz
							ld bc,SysConfig
							out (c),a
							ld hl,palette_fire
							call setpal16
							ld a,$00
							call setborder
							ld a,$10
							call set256_16v
							ld a,$10
							call cls16
							
							
MLP:					ei: halt
							call BOTLINE
							call FPHASE
							JR MLP
							ret
							
BOTLINE:				ld hl,$0000
							ld a,$12
							call setram_3
							ld de,$FF00
							ld b,128
BTL_L01				inc hl
							ld a,h
							and $03
							ld h,a
							ld a,(hl)
							and $0F
							cp $08
							jr c,BTL_L01
							push bc
							ld c,a
BTL_L02				inc hl
							ld a,h
							and $03
							ld h,a
							ld a,(hl)
							and $0F
							cp $08
							jr c,BTL_L02
							sla a
							sla a
							sla a
							sla a
							or c
							pop bc
							
							ld (de),a
							inc de
							djnz BTL_L01
							ld (BOTLINE+1),hl
							ret
							
FPHASE:			ld a,$12
						call setram_3
						ld hl,$C000
						ld c,63
PHS_L00:			ld b,128
PHS_L01:			PUSH BC
; --- 1st half-byte 						
						ld a,(hl)
						srl a
						srl a
						srl a
						srl a
						;and $0F
						ld c,a
						inc h
						ld a,(hl)
						srl a
						srl a
						srl a
						srl a
						;and $f0
						dec h
						cp c
						jr nz,PHS_P00
						ld c,0
						ld a,0
PHS_P00:			add a,c
						srl a
						sla a
						sla a
						sla a
						sla a
						;and $F0
						ld b,a
; -- 2nd half-byte						
						ld a,(hl)
						and $0f
						ld c,a
						inc h
						ld a,(hl)
						and $0F
						dec h
						cp c
						jr nz,PHS_P01
						ld c,0
						ld a,0
PHS_P01:			add a,c						
						srl a
						or b
						ld (hl),a					
						inc hl
						POP BC
						DJNZ PHS_L01
						ld a,l
						add a,128
						ld l,a
						jr nc,$+3
						inc h
						dec c
						jr nz,PHS_L00
						ret

							
; TS -Library
cls16:					ld b,7
cls16_l0:				push bc
							call setram_3
							ld hl,$c000
							ld de,$c001
							ld (hl),l
							ld bc,$3FFF
							ldir
							inc a
							pop bc
							djnz cls16_l0
							ret

; Set palette: HL - palette addr
setpal:					ld a,$10
							ld bc,FMaddr
							out (c),a
							ld de,$0000
							ld bc,64
							ldir
							xor a
							ld bc,FMaddr
							out(c),a
							ret
							
; Set palette 16col: HL - palette addr
setpal16:				ld a,$10
							ld bc,FMaddr
							out (c),a
							ld de,$0000
							ld bc,32
							ldir
							xor a
							ld bc,FMaddr
							out(c),a
							ld a,$00
							ld bc,Palsel
							out(c),a
							ret
							
setborder:				ld bc,Border
							out (c),a
							ret

; Set 256x192, 256 Colors mode
set256_256v:			ld bc,Vpage
							out (c),a
							ld a,%00000010
							ld bc,Vconfig
							out(c),a
							ret
							
; Set 256x192, 16 Colors mode
set256_16v:			ld bc,Vpage
							out (c),a
							ld a,%00000001
							ld bc,Vconfig
							out(c),a
							ret
							
							
; Set rampage in $0000 A - page 0...255
setram_3			ld bc,Page3
						out(c),a
						ret

;----------------- Resources ----------------------------------

						; Single palette fire	
	
							DW %0000000000000000
							DW %0000000000000000
							DW %0000000000000000
							DW %0000000000000000
							
							DW %0000000000000000
							DW %0000000000000000
							DW %0000000000000000
							DW %0010000000000000
							
							DW %0100000000000000
							DW %0110000000000000							
							DW %0110000100000000							
							DW %0110001000000000
							
							DW %0110001100000000
							DW %0110001100001000							
							DW %0110001100010000							
							DW %0110001100011000
							;Double palette fire
palette_fire:		
							DW %0000000000000000
							DW %0010000000000000
							DW %0100000000000000
							DW %0100000000000000			
							
							DW %0110000000000000
							DW %0110000000000000							
							DW %0110001000000000							
							DW %0110001000000000							
							
							DW %0110001100000000							
							DW %0110001100000000							
							DW %0110001100001000
							DW %0110001100001000
							
							DW %0110001100010000								
							DW %0110001100010000								
							DW %0110001100011000
							DW %0110001100011000						


END:

						SAVESNA "main.sna",START


Собственно огонь горит. с Single palette fire — был вообще куцый. поскольку 16ц позволяла сделал «двойную» палитру с повторениями. чуть лучше, но все равно мало. Да и тормозит адово даже на 14 мгц
Ну и для обсуждения:
1. Как сделать чтоб горело пол-экрана в высоту
2. Какие идеи по оптимизации торможения?

33 комментария

avatar
кошмар — out ©,a метится как копилефт…
avatar
Уже отписал по этому поводу nyuk
avatar
ты работаешь с экраном как на спеке
двигай палитру, всё само будет отрисовываться
avatar
Вот нет идеи как двиганием палитры получить именно такой эффект.
avatar
Предлагаю считать парсинг © не багом, а прикольной фичей.
А вот лишние табы я бы поубирал перед постингом. Тем более, поиск-замена, секундное дело.
avatar
хз, всеж поройся с парсером как время будет, таки жесть)
Лишнее да, но тогда торопился поддержать новый ресурс своим постом) впредь буду чистить, и этот почищу как будет время)
avatar
Проблема в том, что парсер править — это или лезть в кишки движка, или писать плагин.

Первое я не хочу, т.к. мы потеряем совместимость и потом умучаемся с обновлением.

А второе не умею.
avatar
А эт че за система?
avatar
Нублинкакмаленький. Внизу сайта обычно движок указывается. Стоит сначала там проверить, потом спрашивать. LiveStreet CMS

Или просто поддержать разговор? ;-)
avatar
Поправил парсинг (c). Теперь в значок © преобразуется только русская «С». Нормальный вариант?
avatar
не похоже, в листинге виден копирайт
avatar
Похоже оно хранит распарсенный вариант для ускорения.
kotsoft появится, отредактирует (если оно ему разрешит) и будет норм.
avatar
Я бы всё-таки порекомендовал вообще убрать все эти автозамены. Кому надо тот и так может вставить всякие спецсимволы «©®°¹²³½⅓¼€™» итд. А вот сюрпризы ещё могут быть.
avatar
согласен. именно в теге code
avatar
Насчет оптимизаций и прочего — тайлы в зубы. Я Дену для фактры немного другой алгоритм придумал. Возможно, это прокатит. Возможно — нет.
avatar
Да, и еше — обсуждался такой момент, как мапить 3 паги видео страницы так:
#0000 — пага 22
#8000 — пага 20
#c000 — пага 21
как-то так.
avatar
ну. или №4000, 8000, с000, а код с 0, так удобнее
avatar
Ну да. так будет удобнее. но это пока так, набросок первый для изучения)
avatar
Да это монопенисуально вообще.
avatar
Скомпилил, заработало!
  • tsl
  • 0
avatar
Могу посоветовать включить кешак:
START: ld a,$06; set 14mhz
ld bc,SysConfig
  • tsl
  • 0
avatar
Кстати с кэшем заметно быстрее! Раза в два. Интересненько)
avatar
Не в два, а я думаю так: без кеша — 10.5МГц, с кешом примерно 13.5.
avatar
Приложи хоть ютуб, как выглядит.
  • sq
  • 0
avatar
  • tsl
  • +4
avatar
И ещё, я сердечно призываю вас не разжигать и не подначивать, во избежание.
Можно делать это где угодно, намекать и говорить напрямую, и т.п.
Но тут, пожалуйста, не надо.
  • sq
  • +3
avatar
а никто и не собирается, надеюсь :)
avatar
Дайвер, я обещаю, что постараюсь не вбрасывать первым. Но если будут вбросы и киселевщина сам знаешь с чьей стороны (хоть я и сомневаюсь, но все же), буду бить больно и метко. Заранее прошу прощения.
avatar
очень странно рассчитывается адрес
ld a,d
and $3f
ld l,a
ld h,0
add hl,hl // x256
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl //h=a l=0
ld a,e
and a
rr a
add a,l //add a,0 CY=0
ld l,a
ld a,(hl)
jr c,gp_p1 //не выполняется получается никогда

если нам нужен бит, выползающий в регистр CY, то такой код должен все подобное выполнять
ld a,d:and #3f:ld h,a
ld a,e:srl a:ld l,a
ld a,(hl)
jr c,gp_p1

в тс-конфе не разбираюсь, исходник не компилил, говорю мысли вслух по куску кода. просто умножение на 256 как минимум неоптимально так делать.
avatar
А-а понял. getpixel16 это мусор, он не используется) Начал писать, потом без нее обошелся)
avatar
выкладывание исходников с заведомым мусором — сурово и сильно! )
напомнило старый рассказ — Кир Булычев — Терпение и труд
avatar
Не, он был не заведомый) он был забытый)
avatar
Убрал лишнее
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.