Hello fellow GBATemp'ers. (Hope this is in the right place, if not would a mod please move it?) Thanks to the documentation and tools provided free-of-charge by the online GBA devving community, it's pretty easy to get started with GBA devving. As an electronics hobbyist (any of those here?), I enjoy tinkering with new devices, including CMOS image sensors. As time has gone on, the parallel and serial ports on computers have gotten less and less accessible, finally disappearing.
Enter the Nintendo GBA: it has a 16MHz ARM CPU, a 240x160 color LCD (and controller!), built-in sound, a couple of buttons, more memory than most MCUs...and a 6-pin link port. The port provides 3.3v and four fully-controllable I/O lines. Also in the deal are two special hardware port modes: RS-232 and shift-clock. Programming the GBA to take advantage of the link port generally requires a computer. At first, I did hardware interfacing and tweaking via a "dumb multiboot" cable, but that quickly got tiring. The idea (started by Jeff Frohwein's "GBBasic" for the GBC) was: Why not do the programming right on the GBA itself?
After a couple of months writing in 100% ASM (both ARM and THUMB), "bASMic IDE" is quite useable, and almost bug-free. You can write code in a variant of BASIC (interpreted, but well compressed for high speed), as well as ARM7TDMI ASM. File load/save can theoretically be done on any Nintendo game cartridge that has SRAM or FLASH gamesave, as well as RS/232.
If anyone has implemented DLDI patch files on a GBA project (preferably in ASM), I would very gladly implement a version of libfat. (bASMic is currently 47KB in size, with a maximum of 64K. "libfat" is 60K...that's not going to work.) If I'm on my own, I'll probably stick with making bASMic's "libfat" support hardware-specific to the Supercard Mini SD.
Why did I write it entirely in ASM? Well...when writing code for both the GBC and GBA, I started out writing in C. After getting frustrated at the very slow operation, large output file size, and technical gymnastics required to make the compiler do what I intended, it was an easy decision to learn ASM. Of course, that had a steep learning curve. (No offense to those of you who love programming in C.) Of course, with 14,998 lines of code in 11 code files, it's definitely a big project!
Features:
-Fast BASIC execution, simple use
-Built-in helpfile (any clarifications, suggestions, let me know)
-Small (47K, including 10K of helpfile and 4K of palette/font)
-PS/2 keyboard support for faster code entry. (Yes, at 3.3v from the GBA, all but one keyboard tested has worked.)
-Unique on-screen keyboard for code entry
-Supports "FLOAT" (16:16 fractional, not true IEEE)
-Supports strings (31 255-character strings--they use a lot of memory!)
-Supports a small graphics library (GR/HGR, PSET/RECT/ELLIPSE/FILL, etc.)
-Supports true ASM, run from IWRAM for best speed.
-Minimal array support
Known issues:
-Something in interrupts--identified by a total lockup, where "BREAK" doesn't work. Not sure what exactly is wrong.
-ASM's "STOP" pseudo-command does not provide a completely accurate list of CPU registers. Let's face it, they're not easy to get!
-HGR Graphics are a little slow. That's what we get for using a tiled bitmap screen, and supporting low-res graphics as well.
-Cannot chip-erase an SRAM gamesave chip. Easy enough to do with a little BASIC program. 'Tis a pretty dangerous function, anyway.
-EXTRAM is run at the fastest functional waitstate setting, making the program run slowly in emulators. Seems to work fine on GBA/NDS.
As said above, I wrote this to make it easy to use the GBA's link port for hardware interfacing. For example: put a magnet on your bicycle wheel, connect a Hall-effect sensor to the link port, and a little coding later, you have a bicycle speedometer. Or launch that model rocket with one keypress on the GBA...make a race timer...etc. Not sure about an audio codec, but the possibilities are limited only by your imagination :-). Note that I am not liable for any damages.
Bug reports, suggestions, questions: just post and ask. I do not intend to port this to the Nintendo DS, as it doesn't have a link port...which is the point of the entire project.
The attached ZIP archive contains the multiboot- and regular-boot .GBA binary, two example programs, and a simple RS-232 communication program I wrote in VB6. (Nope, not trying Intel 80486 ASM yet. It's not worth the crashes .) If using an emulator, you can load code dumps to/from 0x02010000.
Note that bASMic runs from EXTRAM, so after it is started, you can remove the cartridge, and use the cartridge bus for an I/O port. Or plug in a ROM cartridge with gamesave memory.
Thanks to all of the GBA development community for making this project possible.
Enter the Nintendo GBA: it has a 16MHz ARM CPU, a 240x160 color LCD (and controller!), built-in sound, a couple of buttons, more memory than most MCUs...and a 6-pin link port. The port provides 3.3v and four fully-controllable I/O lines. Also in the deal are two special hardware port modes: RS-232 and shift-clock. Programming the GBA to take advantage of the link port generally requires a computer. At first, I did hardware interfacing and tweaking via a "dumb multiboot" cable, but that quickly got tiring. The idea (started by Jeff Frohwein's "GBBasic" for the GBC) was: Why not do the programming right on the GBA itself?
After a couple of months writing in 100% ASM (both ARM and THUMB), "bASMic IDE" is quite useable, and almost bug-free. You can write code in a variant of BASIC (interpreted, but well compressed for high speed), as well as ARM7TDMI ASM. File load/save can theoretically be done on any Nintendo game cartridge that has SRAM or FLASH gamesave, as well as RS/232.
If anyone has implemented DLDI patch files on a GBA project (preferably in ASM), I would very gladly implement a version of libfat. (bASMic is currently 47KB in size, with a maximum of 64K. "libfat" is 60K...that's not going to work.) If I'm on my own, I'll probably stick with making bASMic's "libfat" support hardware-specific to the Supercard Mini SD.
Why did I write it entirely in ASM? Well...when writing code for both the GBC and GBA, I started out writing in C. After getting frustrated at the very slow operation, large output file size, and technical gymnastics required to make the compiler do what I intended, it was an easy decision to learn ASM. Of course, that had a steep learning curve. (No offense to those of you who love programming in C.) Of course, with 14,998 lines of code in 11 code files, it's definitely a big project!
Features:
-Fast BASIC execution, simple use
-Built-in helpfile (any clarifications, suggestions, let me know)
-Small (47K, including 10K of helpfile and 4K of palette/font)
-PS/2 keyboard support for faster code entry. (Yes, at 3.3v from the GBA, all but one keyboard tested has worked.)
-Unique on-screen keyboard for code entry
-Supports "FLOAT" (16:16 fractional, not true IEEE)
-Supports strings (31 255-character strings--they use a lot of memory!)
-Supports a small graphics library (GR/HGR, PSET/RECT/ELLIPSE/FILL, etc.)
-Supports true ASM, run from IWRAM for best speed.
-Minimal array support
Known issues:
-Something in interrupts--identified by a total lockup, where "BREAK" doesn't work. Not sure what exactly is wrong.
-ASM's "STOP" pseudo-command does not provide a completely accurate list of CPU registers. Let's face it, they're not easy to get!
-HGR Graphics are a little slow. That's what we get for using a tiled bitmap screen, and supporting low-res graphics as well.
-Cannot chip-erase an SRAM gamesave chip. Easy enough to do with a little BASIC program. 'Tis a pretty dangerous function, anyway.
-EXTRAM is run at the fastest functional waitstate setting, making the program run slowly in emulators. Seems to work fine on GBA/NDS.
As said above, I wrote this to make it easy to use the GBA's link port for hardware interfacing. For example: put a magnet on your bicycle wheel, connect a Hall-effect sensor to the link port, and a little coding later, you have a bicycle speedometer. Or launch that model rocket with one keypress on the GBA...make a race timer...etc. Not sure about an audio codec, but the possibilities are limited only by your imagination :-). Note that I am not liable for any damages.
Bug reports, suggestions, questions: just post and ask. I do not intend to port this to the Nintendo DS, as it doesn't have a link port...which is the point of the entire project.
The attached ZIP archive contains the multiboot- and regular-boot .GBA binary, two example programs, and a simple RS-232 communication program I wrote in VB6. (Nope, not trying Intel 80486 ASM yet. It's not worth the crashes .) If using an emulator, you can load code dumps to/from 0x02010000.
Note that bASMic runs from EXTRAM, so after it is started, you can remove the cartridge, and use the cartridge bus for an I/O port. Or plug in a ROM cartridge with gamesave memory.
Thanks to all of the GBA development community for making this project possible.