Learn Nintendo DS a Haskell
This weekend was AusHac 2011. I spent my time getting Haskell to compile to the Nintendo DS.
I remember reading a while ago about someone using JHC to compile a Haskell executable for the iPhone. JHC is a Haskell compiler that outputs fairly sane C code. I figured that it’d be fairly easy to get it to output code to work with devkitPro.
I had a quick version of this project working in December but I lost the patches and wanted to make a better version.
After a days work I had something compiling and I spent another day playing around with it. I think I created the world’s most annoying Haskell program:
It is much more annoying running on a physical DS:
I’ve uploaded the binary for people to try out. I’ve put the example project up on Bitbucket. The main Haskell for the example is:
printFreq freq = do
consoleClear
print freq
setSound sound freq = do
soundSetFreq sound freq
printFreq freq
keyLoop sound = do
x <- keyboardUpdate
scanKeys
if x > 0 then do
setSound sound $ x * 100
putChar $ chr x
else if isTouching then do
if getTouchY < 110 then do
setSound sound $ getTouchY * 100
print getTouchY
else
return ()
r <- randomRIO (0, 31)
oamMainColor r 0 0
oamMainSet getTouchX getTouchY
else
return ()
swiWaitForVBlank
oamMainUpdate
keyLoop sound
main = do
consoleDemoInit
keyboardDemoInit
keyboardShow
soundEnable
sound <- soundPlayPSG dutyCycle_50 10000 127 64
oamMainInit
keyLoop sound
To compile you have to setup devkitARM with my patch to libnds. You then need to setup JHC with my DARCS patch. I’ve forwarded the patches on so hopefully it will just work in the future!
Before this project, it was possible to run Hugs on the DS. While I think that is really awesome, I took the JHC approach for a few reasons:
- I couldn’t figure out an easy way to access C libraries from Hugs.
- I wasn’t sure how to make Hugs jump straight to executing custom Haskell code.
- Hugs is interpreted. I had a feeling that compiling to C and using GCC would give better performance.
Although the above example code is fairly ugly, I’m very confident that a nice DSL could be created for writing games. I’d love to see this happen.