Preshifting with blitter?

GFA, ASM, STOS, ...

Moderators: simonsunnyboy, Mug UK, Zorro 2, Moderator Team

Zamuel_a
Atari God
Atari God
Posts: 1235
Joined: Wed Dec 19, 2007 8:36 pm
Location: Sweden

Preshifting with blitter?

Postby Zamuel_a » Tue Mar 25, 2008 3:07 pm

I have done some tests with the blitter and I have a 32x40 sprite. I did some testings with the blitter do the shift and then use a 4 pass blit, or I preshifted the sprite (as I read somewere would be faster) and then draw it in one pass, but I can't see any speed difference really, perhaps I get some cycles, but not so I can notice it then I use a "raster check" (put out a backcolor before I start the sprite routine and then to black after I'm done, to get a visual of the processor speed).
Then I let the blitter do the shifting it only draws a 32x40 sprite and then uses the MASKs but then I do a preshifting, I need a 48x40 sprite because of the shifted values so that bigger sprite seems to take away what I might gain, or I do something wrong, but it works so I can't see why and I haven't done any "odd stuff" yet, just a basic copy with destination=source.
I am doing it in STEEM, so I havent tried it on a real STE, if that might have something to do with it?
ST / STFM / STE / Mega STE / Falcon / TT030 / Portfolio / 2600 / 7800 / Jaguar / 600xl / 130xe

User avatar
Frank B
Atari God
Atari God
Posts: 1011
Joined: Wed Jan 04, 2006 1:28 am
Location: Boston

Re: Preshifting with blitter?

Postby Frank B » Tue Mar 25, 2008 3:23 pm

Hi.

I think the only advantage to pre shifting would be reduced set up time if you blit all planes at once. You could use 16 times the amount of memory for your source data though.

You could use the NFSR if you want to save 4 cycles per plane on reading a source data line if your source data doesn't span an extra word.
If you blit a 32 by 32 bob and it is not shifted then you can use NFSR to only read 32 pixels but write out 48 if shifted. This is all from memory though and it's a bit hazy so I could be wrong :)

Frank

User avatar
unseenmenace
Atari God
Atari God
Posts: 1961
Joined: Tue Sep 21, 2004 9:33 pm
Location: Margate, Kent, UK
Contact:

Re: Preshifting with blitter?

Postby unseenmenace » Tue Mar 25, 2008 8:33 pm

Another advantage of preshifted blitter sprites is they can have automatic animation, e.g. walking.
You do not have the required permissions to view the files attached to this post.
UNSEEN MENACE
Several STFM's, 4MB STE, 2MB TT with 1.2GB Hard Drive and 14MB Falcon with 540MB Hard Drive,
Lynx 2 and Jaguar with JagCD
Member of GamebaseST and AtariLegend team
Check out my website at http://unseenmenace.110mb.com

Zamuel_a
Atari God
Atari God
Posts: 1235
Joined: Wed Dec 19, 2007 8:36 pm
Location: Sweden

Re: Preshifting with blitter?

Postby Zamuel_a » Tue Mar 25, 2008 9:57 pm

That's true that you get animation for free, but do you get a real speed difference? I can't see that, not in steem atleast and I hope it's speed accurate.
It takes so much memory to have freshifted sprites, about 15k for a 32x40 sprite (wich now has to be 48x40).
Since the main sprite in a game usually is in the area at the middle of the screen, it would be nice to draw that at the beginning at the first line, so don't waste "border time" on that sprite, since we know were it is on the screen, but since the blitter takes up the bus, I can't use Timer B for raster effects then, and in the share mode, it still uses 64 cycles so I guess Timer B would get out of "balance". Since I only uses Timer B every 16 line for palette changes I might split up the sprite routine to fit within two 16 pixel "blocks" or something.
ST / STFM / STE / Mega STE / Falcon / TT030 / Portfolio / 2600 / 7800 / Jaguar / 600xl / 130xe

Zamuel_a
Atari God
Atari God
Posts: 1235
Joined: Wed Dec 19, 2007 8:36 pm
Location: Sweden

Re: Preshifting with blitter?

Postby Zamuel_a » Wed Mar 26, 2008 3:47 pm

I did some more accurate calculations and preshifting a 32x40 sprite was about 1000 cycles faster then I draw it without masking but background saving/restoring, so it is alittle faster.

Then I draw a sprite with background restore/save/mask and draw the sprite, preshifted and all, its the same 32x40 sprite I calc it to be 14% processor time. I can't see how I can optimize it much. It's just one sprite so I write all registers, but save registers can't give me that much I think. Since I need to draw in the borders and the borders are 36% processor time (one line is 512 cycles times 112.5 border lines) I get that I can just output 2.5 sprites if I get ALL border time. I can't see how I will make a game with just 2 sprites? 32x40 is a rather normal sprite size to I think, ok its actually 48x40 since the preshift need 16 extra, but since it was alittle faster than a ordinary 32 wide that the blitter shfts it doesn't matter.
I did every blitting in HOG mode ofcourse!
ST / STFM / STE / Mega STE / Falcon / TT030 / Portfolio / 2600 / 7800 / Jaguar / 600xl / 130xe

User avatar
simonsunnyboy
Moderator
Moderator
Posts: 5122
Joined: Wed Oct 23, 2002 4:36 pm
Location: Friedrichshafen, Germany
Contact:

Re: Preshifting with blitter?

Postby simonsunnyboy » Wed Mar 26, 2008 8:44 pm

Zamuel_a wrote:I did every blitting in HOG mode ofcourse!

Maybe that'S the problem? The CPU can't access the bus while the Blitter is blitting in Hog mode...
Simon Sunnyboy/Paradize - http://paradize.atari.org/

Stay cool, stay Atari!

1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee

User avatar
unseenmenace
Atari God
Atari God
Posts: 1961
Joined: Tue Sep 21, 2004 9:33 pm
Location: Margate, Kent, UK
Contact:

Re: Preshifting with blitter?

Postby unseenmenace » Wed Mar 26, 2008 8:48 pm

If you use bus sharing mode combined with the restart trick then the interrupts should work well enough and the blit speed will only be fractionally slower.
UNSEEN MENACE
Several STFM's, 4MB STE, 2MB TT with 1.2GB Hard Drive and 14MB Falcon with 540MB Hard Drive,
Lynx 2 and Jaguar with JagCD
Member of GamebaseST and AtariLegend team
Check out my website at http://unseenmenace.110mb.com

Zamuel_a
Atari God
Atari God
Posts: 1235
Joined: Wed Dec 19, 2007 8:36 pm
Location: Sweden

Re: Preshifting with blitter?

Postby Zamuel_a » Wed Mar 26, 2008 9:42 pm

Well, in the borders I don't need to do anything else than drawing sprites so that can be done in HOG mode, but the problem is that it takes so much processor time in total with background save/restore, masking and so on. Even in share mode and if I used the entire screen for sprites it would just give me a maximum of 6 sprites on screen!
ST / STFM / STE / Mega STE / Falcon / TT030 / Portfolio / 2600 / 7800 / Jaguar / 600xl / 130xe

RA_pdx
Captain Atari
Captain Atari
Posts: 215
Joined: Sun Feb 02, 2003 12:01 pm
Location: Nuernberg/GERMANY

Re: Preshifting with blitter?

Postby RA_pdx » Thu Mar 27, 2008 7:52 am

Zamuel_a wrote:I can't see how I will make a game with just 2 sprites? 32x40 is a rather normal sprite size to I think, ok its actually 48x40 since the preshift need 16 extra, but since it was alittle faster than a ordinary 32 wide that the blitter shfts it doesn't matter.


A game with just 2 sprites: Something like IK+! :wink:

32x40 with 16 colours is a big sprite for ST/STE - look on most of the ST games and you will see that the sprites are normally smaller! (with exception of games with only few sprites - here we are back on IK+ :wink: )
It is one of the hardest challenges on the ST/STE to write an action game with a lot of sprites in 50fps (and you will see that only a few developers have achieved this - one example is Enchanted Land).
You have to know a lot of tricks to do that. You also need a clever organisation of your sprites and of your palette to reduce the number of bitplanes you have to draw (e.g. 3 bitplanes for the main character and 2 bitplanes for the shots).
One more (memory intensive) hint if you have a lot of sprites: You don´t need to save the background of your sprites if you use one more screen (on which you also have to draw your tiles like on your first screen).

The other way is to drop down the frame rate to 25fps (what is not to bad).
>> > raZen/Paradox < <<

Atari 1040STE, TOS 2.06, 4MB, MC68010, IDE 8GB SSD, Gigafile

User avatar
unseenmenace
Atari God
Atari God
Posts: 1961
Joined: Tue Sep 21, 2004 9:33 pm
Location: Margate, Kent, UK
Contact:

Re: Preshifting with blitter?

Postby unseenmenace » Thu Mar 27, 2008 8:04 am

I'm only vaguely recalling this from memory but when I did a test blitted sprite over my hardware scroll it only took about 10 scanlines including background restore/save for a 32x37 masked sprite. By combining the processor time in my status bar, bottom border and top border I reckon I should have over 100 scanlines worth of time to do sprites. Most of my sprites are a lot smaller than Turrican himself and the smaller bullets are going to be generated code software sprites so I reckon I should manage. If I'm still tight for CPU time I may investigate Y sorting some of the sprites (bullets perhaps) and drawing them during the screen draw.
UNSEEN MENACE
Several STFM's, 4MB STE, 2MB TT with 1.2GB Hard Drive and 14MB Falcon with 540MB Hard Drive,
Lynx 2 and Jaguar with JagCD
Member of GamebaseST and AtariLegend team
Check out my website at http://unseenmenace.110mb.com

Zamuel_a
Atari God
Atari God
Posts: 1235
Joined: Wed Dec 19, 2007 8:36 pm
Location: Sweden

Re: Preshifting with blitter?

Postby Zamuel_a » Thu Mar 27, 2008 10:37 am

10 scanlines for the entire sprite? Must been a smaller than 32x40 then. I guess it's a big sprite, it was just some "main sprite" I found from a SNES game, and I liked the size, what is the size of the turrican sprite?
I should try and make it to 3 bitplanes since I only want 8 colors for sprites anyway and then 8 colors that I can change for every 16 scanlines to get tiles with different palettes.
I don't think I gain anything by preshifting them. One problem is that the mask has to be preshifted to and in 4 bitplanes, thats alot of memory just for the mask. If I don't preshift I can have the mask as a one bitplane image that I re use on all 4 bitplanes on the destination. If I did that on a preshifted sprite I would have to fill in all the blitter registers again since all data would be different for mask and sprite.
I guess one good thing is to make up a list of all sprites of a sertain size and then blit them all at once and just set the blitter registers once in the beginning. Might need to sort out the different passes then, so first restore background for all sprites, then save new background for all sprites and so on.

I'm still tight for CPU time I may investigate Y sorting some of the sprites (bullets perhaps) and drawing them during the screen draw.


Will that not be a problem since you use Timer B interrupt for palettechange of the sky color? If you use the blitter and in share mode, you still might be off my 64 cycles before the Timer B interrupt occures and then you are in the middle of the screen somewere then you change skycolor.
ST / STFM / STE / Mega STE / Falcon / TT030 / Portfolio / 2600 / 7800 / Jaguar / 600xl / 130xe

User avatar
unseenmenace
Atari God
Atari God
Posts: 1961
Joined: Tue Sep 21, 2004 9:33 pm
Location: Margate, Kent, UK
Contact:

Re: Preshifting with blitter?

Postby unseenmenace » Thu Mar 27, 2008 12:45 pm

Zamuel_a wrote:
I'm still tight for CPU time I may investigate Y sorting some of the sprites (bullets perhaps) and drawing them during the screen draw.


Will that not be a problem since you use Timer B interrupt for palettechange of the sky color? If you use the blitter and in share mode, you still might be off my 64 cycles before the Timer B interrupt occures and then you are in the middle of the screen somewere then you change skycolor.

Not all my sprites will use the blitter, only the larger ones so software sprites (e.g bullets) can be done during the screen without any interrupt issues at all.
UNSEEN MENACE
Several STFM's, 4MB STE, 2MB TT with 1.2GB Hard Drive and 14MB Falcon with 540MB Hard Drive,
Lynx 2 and Jaguar with JagCD
Member of GamebaseST and AtariLegend team
Check out my website at http://unseenmenace.110mb.com

Zamuel_a
Atari God
Atari God
Posts: 1235
Joined: Wed Dec 19, 2007 8:36 pm
Location: Sweden

Re: Preshifting with blitter?

Postby Zamuel_a » Fri Mar 28, 2008 11:04 am

Using software sprites is probably good to use software sprites for smaller stuff, were is the "limit" then it might be good to use software instead of the blitter? below 16x16 size perhaps? I guess it depends mostly of the application since if you have many sprites of same size, then you don't have to reload the registers and then it must be faster with the blitter, even with small size sprites. But since softwares ones fit better with interrupts they might be better to use sometimes.
The main sprite should be drawn at the visible part of the screen I think since its always in the area around the middle of the screen.

You also need a clever organisation of your sprites and of your palette to reduce the number of bitplanes you have to draw (e.g. 3 bitplanes for the main character and 2 bitplanes for the shots).


Reduce bitplanes is ofcourse good but it's tobad that it can't be used on all steps, the restore/save and masking still has to be done in 4 bitplanes, just the last step, draw the sprite, that can be done in less, or else you get strange (nice?) result then you have sprites overlapping other graphics.

This is the thing I like about the atari, and other old computers. The challenge to do something! I mean, how cool is it to make a game like turrican on a PC today? Even if the gameplay is good, its not so technical impressive.
ST / STFM / STE / Mega STE / Falcon / TT030 / Portfolio / 2600 / 7800 / Jaguar / 600xl / 130xe

Zamuel_a
Atari God
Atari God
Posts: 1235
Joined: Wed Dec 19, 2007 8:36 pm
Location: Sweden

Re: Preshifting with blitter?

Postby Zamuel_a » Fri Mar 28, 2008 11:29 pm

One more (memory intensive) hint if you have a lot of sprites: You don´t need to save the background of your sprites if you use one more screen (on which you also have to draw your tiles like on your first screen).


I can't do that since I use the hardware scroller and just draw stuff that are not yet seen. Even if I did two screens for some double buffer technic I still had to restore that background.
If I had redrawn the entire screen everytime it had worked, but not now.
Its tobad that there isnt a fast way to copy the entire screen at once so I dont have to save the background for each individual sprite, just one big copy/restore of the whole screen, but thats to slow ofcourse.
ST / STFM / STE / Mega STE / Falcon / TT030 / Portfolio / 2600 / 7800 / Jaguar / 600xl / 130xe

User avatar
simonsunnyboy
Moderator
Moderator
Posts: 5122
Joined: Wed Oct 23, 2002 4:36 pm
Location: Friedrichshafen, Germany
Contact:

Re: Preshifting with blitter?

Postby simonsunnyboy » Sat Mar 29, 2008 9:46 am

Most ST games are 2VBLs exactly because of this problem...
2/3 of a VBL for copying a backbuffer to your logical screen + time to draw sprites on + game logic
exceeds 1VBL....but I personally think that 25fps is still ok and very playable.
Many crap games on ST use even 3 VBLs....
Simon Sunnyboy/Paradize - http://paradize.atari.org/

Stay cool, stay Atari!

1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee

Zamuel_a
Atari God
Atari God
Posts: 1235
Joined: Wed Dec 19, 2007 8:36 pm
Location: Sweden

Re: Preshifting with blitter?

Postby Zamuel_a » Sat Mar 29, 2008 9:55 am

Yes 2 VBL are ok for a game. 25 fps is the normal speed for a television image anyway:P But since that has already been done it had been nice to do a 1VBL game instead. I guess Turrican 1 & 2 are in 25fps? They must be about the best you can do on a ST, but I had liked a 50fps STE game, more challenge ofcourse, but that's always fun:)

A game with just 2 sprites: Something like IK+!


A "Street Fighter II" game would be nice to a STE I think? Just two big sprites and the parallax floor would be easy to do with the hardwarescroller. Could probibly be done on a ST to with syncscroll.
I have never looked into syncscrolling, but since it uses the same timing as overscan I guess you have to make it run at 100% processor time and time everything. A simple game (from a graphical view) like Street Fighter 2 would be cool to make.
ST / STFM / STE / Mega STE / Falcon / TT030 / Portfolio / 2600 / 7800 / Jaguar / 600xl / 130xe

User avatar
Frank B
Atari God
Atari God
Posts: 1011
Joined: Wed Jan 04, 2006 1:28 am
Location: Boston

Re: Preshifting with blitter?

Postby Frank B » Sat Mar 29, 2008 4:08 pm

Hi.

Here are some ideas you could maybe use to speed things up.

1)
If you have the memory why not use three screens? That way you don't need to copy the data that will be erased when plotting your bobs first to restore it later? You just pull the data from the third buffer as source.

2)
Remember that the blitter retains its state. If you are blitting sprites and you arrange your source data you don't have to set up the src registers again as you move onto the next plane.

3)
Use NFSR and align your source data on a 16 bit boundry. You can still use the shifting on the blitter but you save 4 cycles per plane per line when blitting. Ie don't bother leaving 16 pixels at the side to shift into.

4)
Optimise your set up time. ;)
I played around with the blitter a few years ago and coded a screen which blits 32 32*30 2 plane bobs a frame.
It was for the ST Disk magazine Pure nads but the issue hasn't came out yet. 15 years late Mike get a move on ;)

BTW you can do quite fun stuff with the STE blitter.. Have a look at this thread for an example in C of Smudge mode scaling and hflipping with the STe blitter viewtopic.php?f=68&t=12136

BTW would anybody be interested in a blitter tutorial with some sources? I could maybe dig out the source for this intro.

Frank

PS has nobody done the Y wrapping trick yet on the STe? I'm a bit dubious about using it because I'm not so sure that interrupts are reliable enough with the blitter in nice mode.

Zamuel_a
Atari God
Atari God
Posts: 1235
Joined: Wed Dec 19, 2007 8:36 pm
Location: Sweden

Re: Preshifting with blitter?

Postby Zamuel_a » Sat Mar 29, 2008 4:41 pm

I'm not sure how to use the NFSR, FXSR and that to reduce the time. I did some trying but the drawing just got screwed up.
Then I save/restore the background I have to copy 48 pixels horizontaly since I don't use the shifting for that. I tried to set mask 3 to $FFFF and reduced the line by 2 bytes. I saw some example doing that to save some time, but I couldn't get it to work eather.
ST / STFM / STE / Mega STE / Falcon / TT030 / Portfolio / 2600 / 7800 / Jaguar / 600xl / 130xe

User avatar
Frank B
Atari God
Atari God
Posts: 1011
Joined: Wed Jan 04, 2006 1:28 am
Location: Boston

Re: Preshifting with blitter?

Postby Frank B » Sun Mar 30, 2008 8:13 pm

I think you have to adjust the src y inc when you use NFSR. I've never used FXSR though I understand why it's there.
There's some example source code in 68k asm included with the atari blitter manual. You should be able to plug some pixel values into it and see how it sets those registers for guidance. Hope this helps.

Zamuel_a
Atari God
Atari God
Posts: 1235
Joined: Wed Dec 19, 2007 8:36 pm
Location: Sweden

Re: Preshifting with blitter?

Postby Zamuel_a » Mon Mar 31, 2008 10:49 pm

I saw one example with the blitter for a 32x32 sprite. I didn't really understand what he did for the save/restore background. The actual spritedrawing and masking was the same as I do, 4 pass blitting with shifting and so, nothing special, but for my save/restore I copy 48 pixels ans then no shifting, so I can get a copy of the entire 32 wide sprite without thinking about shifting the save restore routine. For this I set mask 1 and 2 to $FFFF and mask 3 to 0, that works, but in this example I found, he sets mask 3 for $FFFF to and then copy one word less each line, for 48 pixels, you set the XCOUNT to 13 normaly, 12 words per line and then +1, but he sets it to just 11+1, so one word less and can still copy 48 pixels. The example source works, but then I tries it in my program I can't get it to work, gets some strange graphic garbage on screen instead.

This is from the code I found. This set up the blitter for a 48? pixel wide copy

Code: Select all

   lea   blitter,a0      blitter address

   move.w   #12,xcount(a0)      12 words per line dest
   move.w   #2,srcxinc(a0)      2 bytes offset next word
   move.w   #138,srcyinc(a0)             skip 160-(24-2) words
   move.w   #2,dstxinc(a0)      2 bytes offset next word
   move.w   #138,dstyinc(a0)           skip 138 bytes each line
   move.b   #2,hop(a0)      set half tone

   move.w   #$ffff,endmsk1(a0)      no mask since data
   move.w   #$ffff,endmsk2(a0)      is not shifted
   move.w   #$ffff,endmsk3(a0)


The blitting operation itself is rather straightforward

Code: Select all

   lea   blitter,a2                   blitter base address
   move.b   #0,skew(a2)   no skew
   move.b   #3,op(a2)      replace mode

   move.l   a0,srcaddr(a2)   source address
   move.l   a1,dstaddr(a2)   dest address
   move.w   #32,ycount(a2)

   move.b   #%11000000,linenum(a2)   start blit (HOG mode)
ST / STFM / STE / Mega STE / Falcon / TT030 / Portfolio / 2600 / 7800 / Jaguar / 600xl / 130xe

User avatar
Desty
Atari God
Atari God
Posts: 1967
Joined: Thu Apr 01, 2004 2:36 pm
Location: 53 21N 6 18W
Contact:

Re: Preshifting with blitter?

Postby Desty » Mon Apr 07, 2008 5:12 pm

Zamuel_a wrote:A simple game (from a graphical view) like Street Fighter 2 would be cool to make.

Especially if it wasn't poo like SF2 was on the ST ;) Compared to the arcade, anyway... although, to be fair, it's tough to replace six joystick buttons with one and keep a game playable.
tá'n poc ar buile!

User avatar
bullis1
Fuji Shaped Bastard
Fuji Shaped Bastard
Posts: 2301
Joined: Tue Dec 12, 2006 2:32 pm
Location: Canada
Contact:

Re: Preshifting with blitter?

Postby bullis1 » Mon Apr 07, 2008 6:03 pm

Desty wrote:
Zamuel_a wrote:A simple game (from a graphical view) like Street Fighter 2 would be cool to make.

Especially if it wasn't poo like SF2 was on the ST ;) Compared to the arcade, anyway... although, to be fair, it's tough to replace six joystick buttons with one and keep a game playable.


Here's an STE enhanced remake of SF2: http://www.atarilegend.com/games/games_ ... me_id=4359

The author's homepage can be found here, with a lot of other great Atari stuff: http://pagesperso-orange.fr/patrice.mandin/
Member of the Atari Legend team

User avatar
Desty
Atari God
Atari God
Posts: 1967
Joined: Thu Apr 01, 2004 2:36 pm
Location: 53 21N 6 18W
Contact:

Re: Preshifting with blitter?

Postby Desty » Mon Apr 07, 2008 11:03 pm

Thanks bullis, will check it out :)
tá'n poc ar buile!

Zamuel_a
Atari God
Atari God
Posts: 1235
Joined: Wed Dec 19, 2007 8:36 pm
Location: Sweden

Re: Preshifting with blitter?

Postby Zamuel_a » Mon May 19, 2008 4:21 am

I have coded most of the sprite routines now and I manage to draw 3 32x40 sprites or 9 16x16 sprites. I do all drawing in the borders then so I don't affect the visible screen since I don't use double buffering. Since the main sprite will always be more or less at the middle of the screen I will make a custom sprite routine for that and draw it at the beginnin of the visible screen. The main sprite will be somethere areound a 32x40 sprite so I can have 4 such big sprits in total on screen at the same time. Bullets and so are small object and I wonder if I could draw them on the visible part of the screen to perhaps.
Looks like its possible to make a game from it after all:) A 50fps game with hardware scroll and sprites on looks nice on a atari:)
ST / STFM / STE / Mega STE / Falcon / TT030 / Portfolio / 2600 / 7800 / Jaguar / 600xl / 130xe

User avatar
unseenmenace
Atari God
Atari God
Posts: 1961
Joined: Tue Sep 21, 2004 9:33 pm
Location: Margate, Kent, UK
Contact:

Re: Preshifting with blitter?

Postby unseenmenace » Tue May 20, 2008 9:46 pm

Nice one m8, I look forward to seeing it in action.
UNSEEN MENACE
Several STFM's, 4MB STE, 2MB TT with 1.2GB Hard Drive and 14MB Falcon with 540MB Hard Drive,
Lynx 2 and Jaguar with JagCD
Member of GamebaseST and AtariLegend team
Check out my website at http://unseenmenace.110mb.com


Social Media

     

Return to “Coding”

Who is online

Users browsing this forum: No registered users and 3 guests