Tuesday, 30th May 2006
I couldn't work out how to handle keypresses in Firefox, and Firefox is too slow and flickery to make it worthwhile. IE runs it fine but at less than 1FPS, meaning that more often than not you end up walking through the walls. Opera is about the only browser it works happily in (~12FPS). Ah well.
Monday, 22nd May 2006
One part of the Latenite 'suite' that's needed some dire attention is the PindurTI interface. This talks to the excellent TI emulator via a non-interactive mode, and can therefore sit between Latenite (and your source code) and the emulated calculator (which is running your binary).
The current incarnation of this tool is very primitive - you have a calculator that you can run/pause and send files to. That's it.
A picture should illustrate what the new one's like and what the old one was missing:
There's a memory viewer, register viewer, and breakpoint window. Breakpoints are caught and highlighted in the breakpoint window.
Currently, there is no editing of the calculator state - PindurTI has yet to support writing back the status (it can only dump it at the moment). All the breakpoint and label information comes from the debug file exported directly by Brass.
Monday, 15th May 2006
In my Game Gear-related fiddling, I optimised the tween demo code significantly, but then slowed it back down again by adding 4 more points, extending the rotation code to using 16.16 rather than 16.8 fixed-point and using a proper linear tween. It's still a bit smoother, though:
Tuesday, 9th May 2006
When developing an assembly program, you need to 'declare variables' by attaching an address (in RAM) to a label.
The problem here, of course, is having to calculate all the relevant positions in RAM for each variable. For example,
ram = $C000 ; Assume RAM starts at address $C000 var1 = ram+0 var2 = ram+1 var3 = ram+3 ; var2 is 2 bytes! ; ... and so on ...
Now this is fairly painful. So, I added .varloc and .var directives to Brass:
ram = $C000 ; Assume RAM starts at address $C000 .varloc ram, 1024 ; 1024B in size .var 1, var1 .var 2, var2 .var 1, var3 ; ... and so on ...
This eases things a bit, but what if you have lots of variables and a number of different RAM areas? Now you still have to shuffle things around to fit. So, now, Brass allows you to define multiple areas of memory for variables (through multiple .varloc statements) and shuffles around all the variables to best fit in the available memory. Variables defined using .tempvar can even overwrite eachother (provided they are in different, not-nested modules) to save space.
Of course, sometimes you need variables to share consecutive areas of RAM, so I also added structure support.
; Define it .struct Point2D .var db, X .var db, Y .endstruct ; Use it .var Point2D, Me ld a,10 ld (Me.X),a ld a,32 ld (Me.Y),a ld hl,10+32*256 ld (Me),hl ; Or even: .struct Point3D .var Point2D, P .var db, Z .endstruct .var Point3D, You ld a,(You.P.X)
And, to comply with the picture requirement, have something ancient and completely unrelated.
Wednesday, 3rd May 2006
What with the weekend having an extra Monday tacked on for good measure (Labour Day), I felt the need to be productive.
I also felt the need to listen to VGM files converted to MIDI, so rustled up a VGM to MIDI converter. There already is one (available on the SMS Power! site), but I could never get it to work.
Having never really puzzled out the YM2413 ('OPLL', FM chip) I limited it to the square-wave generating PSG.
First of all, you need to be able to convert a tone register value (from 0 to 1023), the period of the output square wave, to a MIDI key value (0 to 127, where every 12 keys represent an octave).
This is easiest if you have a real frequency (in Hertz) to work with, so I have the formulae:
Frequency = ClockSpeed ÷ (32 × ToneReg) Key = 12 × Log2|Frequency × Constant|ClockSpeed is the clock speed of the PSG in Hertz. Constant is a precalculated constant used to scale the frequency to a range so that 440Hz ends up being played as key A, octave 5.
As it is unlikely you'll get a round number with this, I rely on adjusting the MIDI pitch wheel. Now it's a case of detecting attacks (when the volume of a channel increases) and releases (when the volume of a channel is set to 0) to create MIDI key press and release messages.
Percussion (white noise from the PSG) is handled the same way, except that instead of using mapping frequencies to keys and pitch wheels it plays one of 3 different drums corresponding to the 3 different pitches of noise.
- Power Strike 2 (GG) - Weapon Select
- Ristar (GG) - Du-Di-Da!
- Marble Madness - Tune 09
- The Flash - Trickster for Mayor
- Sega Chess - White Wins
- Sonic Chaos - Mecha Green Hill Zone
- Sonic the Hedgehog - Bonus Zone
- Ys - Holders of Power
The problem with sound-related apps is that they don't provide very interesting screenshots, so I took on a little side project that I hoped would. (After all, journals are a bit dull if they're plain text).
Yep, it's that 3MHz, 32-colour, 8KB powerhouse the Sega Game Gear again.
Looking on pouet.net, there is only one Game Gear demo on there. If I haven't got it in me to complete a full-blown game, I can at least try and contribute something. After all, it's a relatively simple Z80 system to write programs for.
Have the typically poorly-shot video to see it in action:
(The odd flickering horizontal band that sometimes appears is a case of me using up the 8 sprite per scanline ration).