Hi!
I try to understand how to multiplex sprites on the Plus.
The wiki page is not very clear on this subject...
Any help and sources will greatly be appreciated.
Changes to the hardware sprites are reflected immediately, so the principle is to set a sprite to display, wait till after it has drawn and then quickly reload the registers for a location further down the screen.
The difficulty comes largely from the problem that changing the image of a sprite is quite a large operation, so it's tricky unless you can reuse the same image.
It's also possible, through careful timing, to split sprites in half vertically, which is occasionally effective if a bit tricky for general purpose use.
Quote from: fgbrain on 16:00, 01 June 15
Hi!
I try to understand how to multiplex sprites on the Plus.
The wiki page is not very clear on this subject...
Any help and sources will greatly be appreciated.
If you want the same sprite in at different Y coordinates it's easy. Just change the Y of the sprite at the right time. In X I never tried.
Quote from: TFM on 17:04, 01 June 15
If you want the same sprite in at different Y coordinates it's easy. Just change the Y of the sprite at the right time. In X I never tried.
TFM is correct.
If you want to re-use the same sprite you can change it's Y position at a point *after* it is displayed.
Want to use sprite 1 at line 16 and 200?
Set position before line 16.
Then set position a second time after line (16+16 - no y mag).
Repeat this every frame.
If you change the X position then sprite will be cut. you *can* repeat the same sprite across the screen, but it's not worth it because you must do this:
set x, wait, set x again, wait (repeat for all lines).
Too much processor time.
If you want to have more than 16 images then you'll need to download data into the sprite, but that can take 20 scanlines.
So now you need to do this:
set y.
interrupt after sprite displayed.
download data into sprite.
set new y
wait until sprite displayed
download data into sprite
and repeat...
too much time :(
EDIT: If you want to re-use sprites (same image), then you also need to sort the sprites by y and manage the interrupts to set their positions.
Yepp, that's exactly how to do it. Arnie is better than every handbook! ;)
Thanks for all replies!
The idea is to have a small sprite like a bullet/rocket copied for say 15 times down the screen..
but I must figure a way to manage the exact timings.
I will do some tests and come back!
Hi FgBrain,
the most easy way to display hardware sprite multiplexing is using the Pri (Programmable Raster Interrupt) register.
You'll have to precise which line to wait, then to plot your sprite x,y...
Do that each rasterline you want... That's what i used in Synergy Demo and X-Mas 2008 one.
It's very easy to do ! if you need any example, just ask me..
NdEdit : Another technique will be to do a splitscreen using crtc registers... All sprites displayed in the first split will be copied in the second split and so on.....
Bye!
Here is the result of what i tell you..... The Sprite displays a square copied 3 times in your screen. You can do more of course!
;
; Sprites Multiplexing for FgBrain
; Ast/iMPACT - Amstrad Plus/Gx4000
; Orgams Assembler code
;
ORG #A000
ENT $
sprite0 = #4000 ; Sprite 0 adress
sprz = #6004 ; zoom x,y Sprite 0
sprx = #6000 ; Sprite 0 x
spry = #6002 ; Sprite 0 y
sprink1 = #6422 ; sprite color 1
ink0 = #6400 ; ink 0
border = #6420 ; border
pri = #6800 ; Programmable raster interrupt
; DI
LD HL,#C9FB ; Kill interruption
LD (#38),HL
LD E,17 ; Unlock Asic
LD HL,tbasic
LD B,#BC
loop LD A,(HL)
OUT (C),A
INC HL
DEC E
JR NZ,loop
;
LD BC,#7FB8 ; Page i/o on
OUT (C),C
;
LD HL,sprdata ; copy sprite data
LD DE,sprite0 ; in i/o Page
LD BC,16*16
LDIR
;
LD HL,#0FFF ; full white
LD (sprink1),HL ; sprite color 1 will be white
;
LD HL,#00 ; full black
LD (ink0),HL ; put ink 0 & border
LD (border),HL
;
LD A,%1001 ; put sprite size
LD (sprz),A ; x*2/Y*1
;
LD BC,#7FA0 ; page asic i/o off
OUT (C),C
EI
;
LD B,#F5
sync IN A,(C)
RRA
JR NC,sync
;
LD BC,#7FB8 ; page asic i/o on
OUT (C),C
;
LD HL,0 ; define spr0 x,y (1st position)
LD (sprx),HL
LD A,1
LD (spry),A
;
LD A,15 ; wait for rasterline 2
LD (pri),A
HALT
FILL 32,0
LD HL,16 ; define spr0 x,y (2nd position)
LD (sprx),HL
LD A,17
LD (spry),A
;
LD A,31 ; wait for rasterline 3
LD (pri),A
HALT
FILL 32,0
;
LD HL,0 ; define spr 0,y (3th position)
LD (sprx),HL
LD A,33
LD (spry),A
;
LD BC,#7FA0 ; page asic i/o off
OUT (C),C
JR main
tbasic BYTE 255,0,255,119,179
BYTE 81,168,212,98,57,156
BYTE 70,43,21,138,205,238
;
; Sprite Data definition (Little Square)
;
sprdata
BYTE 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
14 ** [
BYTE 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1
]
BYTE 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
;