Page 2 of 3

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Sat Dec 09, 2017 3:18 pm
by 5MinuteRetro

Can you tell what is what? I suppose no. Now imagine that you have such tiles and have to build a level with them in some level map editor. It's a nightmare.
The 8x8 sure looks like a confusing mess. But that's to me, not the programmer. I would've thought to the programmer these are just hex (or whatever) references that need to be called in a particular order. The programmer wouldn't be looking at the raw content of the 8x8 grids, surely?

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Sat Dec 09, 2017 3:51 pm
by Wall_Axe
the altered beast game probly has repeatable blocks that are made up of these smaller ones

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Sat Dec 09, 2017 5:28 pm
by C.Born

Code: Select all

; your sinclair issue 19 page 74
; it stll needs a full loop

org 32000
        di
        ld bc,6144
        ld hl,22527
loop:   srl (hl)
        call c,sub1
        srl (hl)
        call c,sub2
        dec hl
        dec bc
        ld a,b
        or c
        jr nz,loop
        ei
        ret
sub1    inc hl
        set 6,(hl)
        dec hl
        ret
sub2    inc hl
        set 7,(hl)
        dec hl
        ret

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Sat Dec 09, 2017 6:36 pm
by Wall_Axe
i see the srl which i assume is the rotation
why are bits being set in the 2 subroutines though?

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Sun Dec 10, 2017 12:06 am
by Joefish
The 'carry' bits dropping off the end of the rotations trigger bits to be set in the previously rotated byte. This method must be shockingly slow though. It must be quicker just to do two passes of a single pixel scroll!

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Sun Dec 10, 2017 1:57 am
by Wall_Axe
oops yeah

yeah you've got a call to a sub twice instead of just jumping over the set command if no pixel needs to be set

I assume the advantage of dixel techniques would be if you are storing pre-rotated bytes, you only need half the amount

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Sun Jan 05, 2020 2:45 pm
by Lethargeek
Joefish wrote: Thu Dec 07, 2017 11:18 pm Well, the trick is to set yourself some strict rules for level design to reduce the number of potential combinations. The easiest is to always leave one whole empty tile between different objects, then each object is only ever paired up with empty space.

But yes, it means a simple platform block becomes three separate tiles; empty space->platform, platform->repeated platform, platform->empty space.
I think there's other way as well. I mean, to mark the places of the current frame where proper scrolling is required and other places where a copy of the neighbouring (just scrolled) tile could be push'ed fast. Do not bother with combinations and wasting memory on pre-shifted tiles. Speed is determined mainly by the least percentage of empty space of all the possible frames. It is also possible to dynamically generate the scroller code making it faster. All in all, i think a screen similar to Stormlord's may be scrolled in 50fps with one-pixel precision.

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Sun Jan 05, 2020 3:29 pm
by Ralf
I think there's other way as well. I mean, to mark the places of the current frame where proper scrolling is required and other places where a copy of the neighbouring (just scrolled) tile could be push'ed fast. Do not bother with combinations and wasting memory on pre-shifted tiles. Speed is determined mainly by the least percentage of empty space of all the possible frames. It is also possible to dynamically generate the scroller code making it faster. All in all, i think a screen similar to Stormlord's may be scrolled in 50fps with one-pixel precision.
If you feel that it's doable then please do it :) We all would like to see something like that.

The closest existing thing I know is this demo, It is one pixel precise and running at 50 Hz indeed.
https://spectrumcomputing.co.uk/index.p ... 6&id=30420

But it's more similar to Cobra and not Stormlord as it has very limited graphics.
And adding sprites to it would probable slow it down and spoil all the effect.

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Sun Jan 05, 2020 3:55 pm
by Lethargeek
Ralf wrote: Sun Jan 05, 2020 3:29 pmIf you feel that it's doable then please do it :) We all would like to see something like that.
i did something similar 10 years ago, an example of alternative scroller for Sea Dragon:
https://zx-pk.ru/threads/11233-sea-drag ... post344002
tbh not quite the Stormlord style gfx, but it's actually scrolling the edge tiles
and it's more cluttered but about 1/2 frame time in the worst case
(press any key to see the time spent on the border)
Ralf wrote: Sun Jan 05, 2020 3:29 pmThe closest existing thing I know is this demo, It is one pixel precise and running at 50 Hz indeed.
https://spectrumcomputing.co.uk/index.p ... 6&id=30420

But it's more similar to Cobra and not Stormlord as it has very limited graphics.
And adding sprites to it would probable slow it down and spoil all the effect.
afaik it's only pushing pre-shifted data, no real scrolling and no skipping of empty spaces

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Sun Jan 05, 2020 4:21 pm
by Ralf
Nice!

But would it work with graphics like Stormlord? Or Zynaps? Or Robocop?
I believe in your case you have quite a lot of simple graphics - empty space (filled with 0s) and solid space (filled with 255s).
In case of more complicated background you wouldn't be able just to update the edges and ignore middle parts of background objects.

I's all tricks and tradeoffs. Solutions working with specific type of data. You can't do on Spectrum full brute force 1 pixel scroll running at 50 Hz.

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Sun Jan 05, 2020 4:51 pm
by Lethargeek
Ralf wrote: Sun Jan 05, 2020 4:21 pm But would it work with graphics like Stormlord? Or Zynaps? Or Robocop?
It would be slower, yes, to push instead of just skipping the solid space. But typical Stormlord screen usually has much more empty space to skip. Zynaps - maybe, with careful level design. Definitely not Robocop.

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Sun Jan 05, 2020 6:22 pm
by Ralf
But typical Stormlord screen usually has much more empty space to skip
Maybe you missed it from the earlier discussion but Stormlord actually skips empty space.

At address 36132 you have CALL NZ, 36226. Which means draw a tile only if tile nr<>0. And tile nr=0 is empty space.

It works more or less the same way that you are talking about, I believe. Tiles are stored with some empty space at the edges
and when game area scrolls new tiles clear everything behind them.

Raf Cecco was really a clever guy.

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Sun Jan 05, 2020 7:08 pm
by Lethargeek
Ralf wrote: Sun Jan 05, 2020 6:22 pm Maybe you missed it from the earlier discussion but Stormlord actually skips empty space.
No, i missed nothing. My point was it has more empty space to skip than my example.
Ralf wrote: Sun Jan 05, 2020 6:22 pm It works more or less the same way that you are talking about, I believe. Tiles are stored with some empty space at the edges
and when game area scrolls new tiles clear everything behind them.
Absolutely not the same way. Doesn't scroll anything on-screen and is wasting memory for pre-shifted tiles.

In my example, tiles are stored only once (and rotated 90 degrees to appear at the edge pixel-by-pixel) and later are actually scrolled on-screen.

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Tue Jan 07, 2020 9:24 pm
by catmeows
Seven.FFF wrote: Thu Dec 07, 2017 8:19 pm This is things in the foreground moving horizontally, rather than the entire background - but you can get pretty fast and furious, and deal with different speeds, when you scroll preshifted stuff. As long as you have the space to store all the different versions. I've gone 128K-only here for that reason!

Image
Eeeee. Does this thing really exist ? On Zx ?

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Wed Jan 08, 2020 8:44 am
by Vampyre
Edit: Doh! I can see that the "dixel" term had already been found way earlier in this thread!

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Tue Sep 01, 2020 12:47 pm
by wizbob

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Tue Sep 01, 2020 4:23 pm
by catmeows
wizbob wrote: Tue Sep 01, 2020 12:47 pm I don't know if you guys have seen this beautifully illustrated review of the dixel scrolling in Ghosts'n'Goblins.
Thanks.

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Tue Sep 01, 2020 6:03 pm
by Nienn Heskil
Spends waaay too much time on obvious things like the sprite method, but it was interesting to learn about the scrolling of attributes at least (I've used a similar approach in Mint). Perhaps this is one of the reasons there's no color on levels with vertical scrolling added.

I think the most interesting thing about GnG is definitely the crazy way the backgrounds are put together from different elements. This and Marauder, also maybe Zynaps... I've always wondered what sort of tools they've used to make the level maps (assuming it's not all hardcoded).

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Tue Sep 01, 2020 6:53 pm
by Einar Saukas
C.Born wrote: Sat Dec 09, 2017 5:28 pm

Code: Select all

; your sinclair issue 19 page 74
; it stll needs a full loop

org 32000
        di
        ld bc,6144
        ld hl,22527
loop:   srl (hl)
        call c,sub1
        srl (hl)
        call c,sub2
        dec hl
        dec bc
        ld a,b
        or c
        jr nz,loop
        ei
        ret
sub1    inc hl
        set 6,(hl)
        dec hl
        ret
sub2    inc hl
        set 7,(hl)
        dec hl
        ret
Ouch!

Here's my version of dixel scrolling:

Code: Select all

    ld hl,16384
    ld bc,24
loop:
    rr (hl)
    ex af,af'
    rr (hl)
    ex af,af'
    inc l
    djnz loop
    inc h
    dec c
    jp nz,loop
The same routine using unrolled loop:

Code: Select all

    ld hl,16384
    ld b,192
loop:
REPT 31
    rr (hl)
    ex af,af'
    rr (hl)
    ex af,af'
    inc l
ENDR
    rr (hl)
    ex af,af'
    rr (hl)
    ex af,af'
    inc hl
    dec b
    jp nz,loop

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Tue Oct 06, 2020 2:27 pm
by presh
Einar Saukas wrote: Tue Sep 01, 2020 6:53 pm Here's my version of dixel scrolling:

Code: Select all

    ld hl,16384
    ld bc,24
loop:
    rr (hl)
    ex af,af'
    rr (hl)
    ex af,af'
    inc l
    djnz loop
    inc h
    dec c
    jp nz,loop
The same routine using unrolled loop:

Code: Select all

    ld hl,16384
    ld b,192
loop:
REPT 31
    rr (hl)
    ex af,af'
    rr (hl)
    ex af,af'
    inc l
ENDR
    rr (hl)
    ex af,af'
    rr (hl)
    ex af,af'
    inc hl
    dec b
    jp nz,loop
Came here after spotting this in the Common machine code sequences thread, and was curious to see how it compares to the version posted in YS which I remembered being mentioned here.

Loving the use of EX AF, AF' to preserve the carry bits. Genius! :ugeek:

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Tue Oct 06, 2020 3:51 pm
by Einar Saukas
Not really. :)

Dixel scrolling is not a great idea. If you have enough free memory for the unrolled loop implementation, then running a single pixel scroll twice is actually faster than a single dixel scroll without screen memory contention (although dixel scrolling performs better during memory contention while running the raster scan, if my calculations are correct... I don't have an emulator right now to validate it).

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Tue Oct 06, 2020 4:01 pm
by Joefish
In this case, isn't it more efficient to fetch a byte from memory, scroll it, then write it back, rather than do two in-place rotates?
Though it's only quick if you're shifting in A, which means you can't do EX AF,AF'... So maybe not...

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Tue Oct 06, 2020 4:53 pm
by Nienn Heskil
For 2px scrolling, try POP: RL: RL: PUSH. I have one such routine that scrolls some 30x192 area, the resulting speed is about 31T/byte (uncontended), which is close to RL (HL) x2 with nothing in between.

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Tue Oct 06, 2020 6:05 pm
by catmeows
Nienn Heskil wrote: Tue Oct 06, 2020 4:53 pm For 2px scrolling, try POP: RL: RL: PUSH. I have one such routine that scrolls some 30x192 area, the resulting speed is about 31T/byte (uncontended), which is close to RL (HL) x2 with nothing in between.
I don't see how this could work. Could you share your code ?

Re: 'Dixel' scrolling... Ghosts 'n' Goblins

Posted: Tue Oct 06, 2020 6:17 pm
by Nienn Heskil
catmeows wrote: Tue Oct 06, 2020 6:05 pm
Nienn Heskil wrote: Tue Oct 06, 2020 4:53 pm For 2px scrolling, try POP: RL: RL: PUSH. I have one such routine that scrolls some 30x192 area, the resulting speed is about 31T/byte (uncontended), which is close to RL (HL) x2 with nothing in between.
I don't see how this could work. Could you share your code ?
Here