Fire-эффект под TS-Conf
Решил поговнокодить поэкспериментировать с палитровым режимом 16c на TS-Conf, и заодно попробовать запилить эффект «огня» по классическому алгоритму, а не так, как это делал раньше на «Настоящем ATM спектруме».
Собственноговнокод быстрый набросок исходника:
Собственно огонь горит. с Single palette fire — был вообще куцый. поскольку 16ц позволяла сделал «двойную» палитру с повторениями. чуть лучше, но все равно мало. Да и тормозит адово даже на 14 мгц
Ну и для обсуждения:
1. Как сделать чтоб горело пол-экрана в высоту
2. Какие идеи по оптимизации торможения?
Собственно
; 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 комментария
двигай палитру, всё само будет отрисовываться
А вот лишние табы я бы поубирал перед постингом. Тем более, поиск-замена, секундное дело.
Лишнее да, но тогда торопился поддержать новый ресурс своим постом) впредь буду чистить, и этот почищу как будет время)
Первое я не хочу, т.к. мы потеряем совместимость и потом умучаемся с обновлением.
А второе не умею.
Или просто поддержать разговор? ;-)
kotsoft появится, отредактирует (если оно ему разрешит) и будет норм.
#0000 — пага 22
#8000 — пага 20
#c000 — пага 21
как-то так.
START: ld a,$06; set 14mhz
ld bc,SysConfig
Можно делать это где угодно, намекать и говорить напрямую, и т.п.
Но тут, пожалуйста, не надо.
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 как минимум неоптимально так делать.
напомнило старый рассказ — Кир Булычев — Терпение и труд