Success #alandon# ! Thanks to all who have helped!
Now, I have shrinked the tilemap to my desired grid size (12x12 pix) and thanks to HPMAN's code snippet I can swap out the shrinked tiles with tiles from a different image which is located in the C1/C2 ROMs (but not loaded into VRAM before).

During experimenting, I have found out that vertical shrinking is done by the system by up-scaling or down-scaling of the 16th "pixel line" of the 16th tile (marked in orange color in the following image/video).
That means, if you want to shrink a sprite with a tile-size of 16 or more, you have to split the image and re-assemble it again at the "repeating point" between tile 1 and tile 32 to avoid pixel distortion at the 16th line of tile 16.

Here is a short video which shows the vertical shrinking behavior:

And here are the two images without shadows and with shadows:
background_scale.png background_scale_dark.png

And the code:
void load_background() { short i=0; short x=44; short y=184; short exit_loop=0; uint *BGscaleDarkMap; // setup tilemap pointer picture background_1; volMEMWORD(0x401ffe)=0x0000; // set BG color to black initGfx(); clearFixLayer(); clearSprites(1, 381); palJobPut(1, hypernoid_font_Palettes.palCount, hypernoid_font_Palettes.data); // fix layer palette // set up background sprite pictureInit(&background_1, &background_scale, 100, 24, x, y, FLIP_NONE); // 19 sprites, 2 palettes palJobPut(24, background_scale_Palettes.palCount, background_scale_Palettes.data); // load palette of source image palJobPut(26, background_scale_dark_Palettes.palCount, background_scale_dark_Palettes.data); // 2 palettes SCClose(); // assign source image tilemap to pointer BGscaleDarkMap=(uint*)background_scale_dark.maps[0]; do { waitVBlank(); fixPrintf(2,3,1,3,"i: %05d", i); fixPrintf(2,4,1,3,"y: %05d", y); p1=volMEMBYTE(P1_CURRENT); ps=volMEMBYTE(PS_CURRENT); if(p1&JOY_A){if(i<64) i+=1;} if(p1&JOY_B){if(i>-191)i-=1;} if(p1&JOY_D) exit_loop=1; if(p1&JOY_UP) {y-=1;} if(p1&JOY_DOWN) {y+=1;} pictureSetPos(&background_1, x, y); SCClose(); // manipulate tilemap -> SCB1 VRAM $0000-$6FFF // VRAM SC1 start + start_sprite_no + (64*sprite_no_diff) + start_tile_no + (2*tile_no), tile_count, source_img_palette_no, &source_img_map[18+(32*sprite_no_diff) + tile_no] // smiley eyes SC1Put(0x0000+6400+(64*7)+36+(2*5),0x01, 26, &BGscaleDarkMap[18+(32*7)+5]); // sprite 107 tile 7 = shadow 49 left SC1Put(0x0000+6400+(64*8)+36+(2*5),0x01, 26, &BGscaleDarkMap[18+(32*8)+5]); // sprite 108 tile 7 = shadow 49 right SC1Put(0x0000+6400+(64*7)+36+(2*6),0x01, 26, &BGscaleDarkMap[18+(32*7)+6]); // sprite 107 tile 8 = shadow 58 left SC1Put(0x0000+6400+(64*8)+36+(2*6),0x01, 26, &BGscaleDarkMap[18+(32*8)+6]); // sprite 108 tile 8 = shadow 58 right SC1Put(0x0000+6400+(64*7)+36+(2*7),0x01, 26, &BGscaleDarkMap[18+(32*7)+7]); // sprite 107 tile 9 = shadow 67 left SC1Put(0x0000+6400+(64*8)+36+(2*7),0x01, 26, &BGscaleDarkMap[18+(32*8)+7]); // sprite 108 tile 9 = shadow 67 right SC1Put(0x0000+6400+(64*11)+36+(2*5),0x01, 26, &BGscaleDarkMap[18+(32*11)+5]); // sprite 111 tile 7 = shadow 51 left SC1Put(0x0000+6400+(64*12)+36+(2*5),0x01, 26, &BGscaleDarkMap[18+(32*12)+5]); // sprite 112 tile 7 = shadow 51 right SC1Put(0x0000+6400+(64*11)+36+(2*6),0x01, 26, &BGscaleDarkMap[18+(32*11)+6]); // sprite 111 tile 8 = shadow 60 left SC1Put(0x0000+6400+(64*12)+36+(2*6),0x01, 26, &BGscaleDarkMap[18+(32*12)+6]); // sprite 112 tile 8 = shadow 60 right SC1Put(0x0000+6400+(64*11)+36+(2*7),0x01, 26, &BGscaleDarkMap[18+(32*11)+7]); // sprite 111 tile 9 = shadow 69 left SC1Put(0x0000+6400+(64*12)+36+(2*7),0x01, 26, &BGscaleDarkMap[18+(32*12)+7]); // sprite 112 tile 9 = shadow 69 right // smiley mouth SC1Put(0x0000+6400+(64*3)+36+(2*9),0x01, 26, &BGscaleDarkMap[18+(32*3)+9]); // sprite 103 tile 11 = shadow 83 left SC1Put(0x0000+6400+(64*4)+36+(2*9),0x01, 26, &BGscaleDarkMap[18+(32*4)+9]); // sprite 104 tile 11 = shadow 83 right SC1Put(0x0000+6400+(64*5)+36+(2*10),0x01, 26, &BGscaleDarkMap[18+(32*5)+10]); // sprite 105 tile 12 = shadow 93 left SC1Put(0x0000+6400+(64*6)+36+(2*10),0x01, 26, &BGscaleDarkMap[18+(32*6)+10]); // sprite 106 tile 12 = shadow 93 right SC1Put(0x0000+6400+(64*7)+36+(2*11),0x01, 26, &BGscaleDarkMap[18+(32*7)+11]); // sprite 107 tile 13 = shadow 103 left SC1Put(0x0000+6400+(64*8)+36+(2*11),0x01, 26, &BGscaleDarkMap[18+(32*8)+11]); // sprite 108 tile 13 = shadow 103 right SC1Put(0x0000+6400+(64*9)+36+(2*11),0x01, 26, &BGscaleDarkMap[18+(32*9)+11]); // sprite 109 tile 13 = shadow 104 left SC1Put(0x0000+6400+(64*10)+36+(2*11),0x01, 26, &BGscaleDarkMap[18+(32*10)+11]); // sprite 110 tile 13 = shadow 104 right SC1Put(0x0000+6400+(64*11)+36+(2*11),0x01, 26, &BGscaleDarkMap[18+(32*11)+11]); // sprite 111 tile 13 = shadow 105 left SC1Put(0x0000+6400+(64*12)+36+(2*11),0x01, 26, &BGscaleDarkMap[18+(32*12)+11]); // sprite 112 tile 13 = shadow 105 right SC1Put(0x0000+6400+(64*13)+36+(2*10),0x01, 26, &BGscaleDarkMap[18+(32*13)+10]); // sprite 113 tile 12 = shadow 97 left SC1Put(0x0000+6400+(64*14)+36+(2*10),0x01, 26, &BGscaleDarkMap[18+(32*14)+10]); // sprite 114 tile 12 = shadow 97 right SC1Put(0x0000+6400+(64*15)+36+(2*9),0x01, 26, &BGscaleDarkMap[18+(32*15)+9]); // sprite 115 tile 11 = shadow 89 left SC1Put(0x0000+6400+(64*16)+36+(2*9),0x01, 26, &BGscaleDarkMap[18+(32*16)+9]); // sprite 116 tile 11 = shadow 89 right // shrink tilemap to 12x12 tiles -> SCB2 VRAM $8000-$81FF shrinking coefficients SC234Put(0x8000+100, 0x0BBF+i); // shrink sprite no. 100 SC234Put(0x8000+101, 0x0BBF+i); // shrink sprite no. 101 SC234Put(0x8000+102, 0x0BBF+i); // shrink sprite no. 102 SC234Put(0x8000+103, 0x0BBF+i); // shrink sprite no. 103 SC234Put(0x8000+104, 0x0BBF+i); // shrink sprite no. 104 SC234Put(0x8000+105, 0x0BBF+i); // shrink sprite no. 105 SC234Put(0x8000+106, 0x0BBF+i); // shrink sprite no. 106 SC234Put(0x8000+107, 0x0BBF+i); // shrink sprite no. 107 SC234Put(0x8000+108, 0x0BBF+i); // shrink sprite no. 108 SC234Put(0x8000+109, 0x0BBF+i); // shrink sprite no. 109 SC234Put(0x8000+110, 0x0BBF+i); // shrink sprite no. 110 SC234Put(0x8000+111, 0x0BBF+i); // shrink sprite no. 111 SC234Put(0x8000+112, 0x0BBF+i); // shrink sprite no. 112 SC234Put(0x8000+113, 0x0BBF+i); // shrink sprite no. 113 SC234Put(0x8000+114, 0x0BBF+i); // shrink sprite no. 114 SC234Put(0x8000+115, 0x0BBF+i); // shrink sprite no. 115 SC234Put(0x8000+116, 0x0BBF+i); // shrink sprite no. 116 SC234Put(0x8000+117, 0x0BBF+i); // shrink sprite no. 117 SC234Put(0x8000+118, 0x0BBF+i); // shrink sprite no. 118 }while(!(exit_loop==1)); }


Nice. I'm still not sure why you want to swap out tiles for the shadow though, you can save save tile space by simply using an alternate palette (with darker colors) on the same bg tile. Maybe thats a limitation of the library your using though.


Hi Raz,
I would prefer to swap out the image because it gives me the opportunity to create a "softer look" at the corners and the edges.
I haven't added the new background shadows to my game engine yet, hopefully image swap will be fast enough...
Here is a comparison picture - left side image swap, right side palette swap (scaled 2x):



You don't need to rework tilemap every frame as you do in the demo, just swap in once and you are good to go. Same with shrinking.


Ok, that makes sence.


Now the block shadow technique has been integrated into the game engine #hamjump#
Also, I have added:
- two new backgrounds + palette swaps for the 2nd and 3rd boss
- new backgrounds for the title, ranking, continue and game-over screen
- auto-animated checkerboard shadows for all three bosses

Would be interested in your opinions about the two new stage designs because I am a bit unsure... are they maybe too colorful or not?


Looking very good. I like the new backgrounds, There may be no need to change the bg's behind the texts though or alter the border colors.


My 2 cents:

It seems a bit repetitive.
Arkanoid is a very well known game, and you captures its spirit very well in my opinion.
Sure is not exactly the same, but you got to find some more "gimmick" to make your game really interesting.

Also you'd be better to avoid same graphics between stages, like the bricks. Simple palette switch looks "cheap" to the eye of most gamers.

In conclusion I think that this game has potential, and it's a very impressive work as first game (i suppose...).

Keep it up!

A final question: I got a problem with the NeoSoundBuilder, which has been shared. My samples once adapted to "16 Bit PCM Signed Mono 18,500hz" as requested, sounds a bit "cracky" in some part.
Your sound is absolutely smooth.

Do u have any suggestion?


your game is awesome, the block shadow technique you added looks very good! top
but Black_Jack is right, simple palette switch looks a bit cheap. try to match your new and nice looking backgrounds!
maybe you can add more 'special' bricks?
- explosive bricks (needs ~10 hits but clears a larger area.
- jelly bricks, ball goes through but with a different angle than before (like light through prism)
- moving bricks, needs 3 hits but with every hit it moves down (or up/left/right?) one field.
- not destroyable bricks
- doors and switches

just lower the wav-volume a bit.


Thanks a lot for your toughts and suggestions guys smile

I am glad that you also think that the new color palettes for the regular and the 2nd & 3rd boss stages fits into the the game, I was afraid that the saturated colors are might look to "candy" .
Yes, I know just do simple palette swaps and re-using the same graphics is lame - it was just a placeholder to show the current color concept and that the new shadow technique is working.
I have planned to create dedicated graphics for the outer frame, the eye blocks and the boss entrance door matching to each boss design. But this will take a lot of time and I wanted to
release a last demo video this year.

Take care not to play more than six sounds/music tracks at the same time, exceeding the 6 ADPCM-A channels will cause a cracking sound too.
Thank you for your special blocks suggestions, these are great ideas to make the gameplay in regular stages more interesting, will integrate these into the game in the next year.
@ all
Have a nice christmas & I wish you a good start into 2017! christmas


Superb work! I can't wait to preorder copies for my MVS and Neo-Geo CD system!


Great NeoHomebrew! These efforts have produced some pretty impressive results #bien#


NeoTurfMasta and HPMAN have provided me their spinner boards and thanks to them I am happy to announce that Hypernoid can now
be played with spinner controls. I have recorded a short comparison video to show how which spinner board has worked out for me.
Warning: This is my first commented video, so please don't judge me too hard on my strange (German accent) english... triroll


Very nice, are you using raw values for movement after all ?

Santaball spinner version incoming? cool

Board also works with pop'n bounce BTW. smile


Love it !
Homebrews Connexion
In pixels we trust.



your spinner board works absolutly great with raw values combined with the SpinTrak spinner (http://www.ultimarc.com/SpinTrak.htm) and also with the TurboTwist2 spinner (http://groovygamegear.com/webstore/index.php?main_page=index&cPath=86). Both provide 1200 impulses per 360 degree revolution which turns out to be perfect to move the paddle over 80% the playfield without being forced to release the spinner knob. That means, it works right "out of the box", no translation table needed! It is hard to decide which spinner is better, I like the SpinTrak a little bit more than the TurboTwist2 because of the shorter height (55 mm vs. 85 mm including the fly-weight) and the bigger and more heavier spinner knob.

Yes, SantaBall with spinner support would be great but I am a little afraid to touch that old code again because then I would re-program everything wink But I would do it if you decide to release your spinner board to the public.
Sorry for not to mention in the video that your spinner board also works perfectly with Pop'n Bounce in 7-bit spinner mode mur


Super nouvelle,
Bon ben M. HPman il va falloir ce mettre à la production ! XD
La Neo Geo CD à son site (en tout cas elle essaye...): http://neogeocdworld.info/
Le forum de la Neo Geo sur Yaronet: forums/264

Un petit site sur l'Atari Falcon avec plein de trucs bon pour votre poussin: http://falcon.ti-fr.com/


Just want to add two comparison pics of the two spinner devices I have testet with HPMAN's spinner board.
On the left side is the "SpinTrak" spinner and on the right side the "TurboTwist2", both have a great build quality, have enclosed optic sensores, provide 1200 impulses/revolution and can be mounted inside a 28 mm hole.
The Spintrak offers a more heavier weight (378 grams including large fly-weight and knob) and is shorter but more difficult to mount (you can not remove the cable and the fly weight needs to be attached after mounting into the hole).
The TurboTwist2 is a bit lighter (282 grams including fly-weight and "Silver Dome" knob, 314 grams including fly-weight and "TokenTop" knob) is longer but easier to mount (cable removeable, fly weight fits through the 28 mm hole).

Overall, I think the SpinTrak is better for mounting inside a box (because you can use a box with a lower height) and the TurboTwist is better for arcade machine control panels (because it needs less space at the sides and is easier to mount).




Same technology could be extended for Irritating Maze or NAM-1975!!

So the "HPMan's trackball" we saw on YT if I remember well...

If u sell this game, you could offer a "deluxe version" with this analogic controller...the game experience should definetely change!


HPman, will that spinner work with the game 'Pop n Bounce' when the games softdip has been set to use it?

edit... err forget it, I see the question is already answered.


Looking good. Having the spinner will really make the game special. I had a recent experience of playing Arkanoid with a joystick in a bar - really wasn't that much fun without the spinner.


I would like to present my 4th stage boss, the Alien Lizard. A little bit simpler compared to the Worm boss or the Brain boss but therefore much
harder to hit and very challenging due to his differently speeded projectile attacks. The boss is made of six parts, has its own color scheme & frame design,
auto-animated shadow, three destruction phases, ball-following eyes and unique movement/attack patterns depending on the paddle position.


I love the animation of the ship and the projectiles. The rest is very good too, the shadows movements ...
I'm a fan of arkanoid and it really gives me the urge to test boing

Very good work .

La Neo c' est beau sous tous ses supports (EXIT PS3 CACA AND CI)


Homebrews Connexion
In pixels we trust.



May I suggest u, if didn't already done, to create multi-level screen (maybe 2 or 3 on top of each other) with secret areas and mid-bosses?

Like in "Devil-Crash" kind of games (that was a flipper game actually but I think it could fit here as well).


Wow this looks amazing guys, I've just picked up a CDZ again so any new release is welcome, but looks very professional.

One question about the sound, you say its only 1mb so you can only have 2 tracks on the CD version? One i'm guessing you are not sure how to code CD tracks yet? or Two, why cant you pull data from the CD when you need another music track, i.e when loading level 2 etc?

Anyway great job!


Hi, sorry for the late response (i was on holiday). Thanks for your comments smile
Because I am working with the NeoBitz NeoSoundbuilder I can only play ADPCM-A samples and as far as I know these are limited to max. 1 MB on the NeoGeo CD-Systems.
I need to find a way to play CDDA audio files for the background music on CD-Systems (https://wiki.neogeodev.org/index.php?title=CDDA)... did someone eventually tried it already?


NeoHomeBrew (./116) :
Hi, sorry for the late response (i was on holiday). Thanks for your comments smile
Because I am working with the NeoBitz NeoSoundbuilder I can only play ADPCM-A samples and as far as I know these are limited to max. 1 MB on the NeoGeo CD-Systems.
I need to find a way to play CDDA audio files for the background music on CD-Systems (https://wiki.neogeodev.org/index.php?title=CDDA)... did someone eventually tried it already?
Didn't the Tetris homebrew game (download in link below) use CDDA? I haven't burned it yet, but the download contains the iso and 2 audio files, maybe open the iso and see what you can find in the code?


If you need someone to test on real hardware I'm willing to burn a few coasters for the cause!


Hmm, interesting. After searching the web a while I have just realized that Bey has also used a CCDA track for his NATA demo: topics/187142-natademo-ngcd
Bey, would you maybe share some info on how do you have made it, please? #bateau#



yes, the bios call method would be desirable... but, as always, the ASM code is the problem...

According to the wiki I think I need to:
1) change "_CDDA_FLAG= 0" in file "crt0_cd.s" to "_CDDA_FLAG= 2" ?
2) call the CDDA routine via ASM
__asm__ ("jsr 0xC0056A");
3) But how to write the command / track number to register D0? As a word? For instance command 04, track no 02 would be 0x0402?
__asm__ ("move.w d0, 0x0402");