Discussion about software development for the old-school Gameboys, ranging from the "Gray brick" to Gameboy Color
(Launched in 2008)
You are not logged in.
Hi everybody
Last night I've been writting a extremely simple tracker reusing some of the piano.c code.
the idea is to save all the notes played in a array and play the notes in the array when start is pushed
/*
Compile like this:
..\..\bin\lcc -Wa-l -Wl-m -Wl-j -DUSE_SFR_FOR_REG -c -o piano.o piano.c
..\..\bin\lcc -Wa-l -Wl-m -Wl-j -DUSE_SFR_FOR_REG -o piano.gb piano.o
(Same as in make.bat in examples)
*/
#include <gb/gb.h>
#include <stdio.h>
#include <gb/console.h>
void play_note(UBYTE notevalue);
enum notes {
C0, Cd0, D0, Dd0, E0, F0, Fd0, G0, Gd0, A0, Ad0, B0,
C1, Cd1, D1, Dd1, E1, F1, Fd1, G1, Gd1, A1, Ad1, B1,
C2, Cd2, D2, Dd2, E2, F2, Fd2, G2, Gd2, A2, Ad2, B2,
C3, Cd3, D3, Dd3, E3, F3, Fd3, G3, Gd3, A3, Ad3, B3,
C4, Cd4, D4, Dd4, E4, F4, Fd4, G4, Gd4, A4, Ad4, B4,
C5, Cd5, D5, Dd5, E5, F5, Fd5, G5, Gd5, A5, Ad5, B5
};
const UWORD frequencies[] = {
44, 156, 262, 363, 457, 547, 631, 710, 786, 854, 923, 986,
1046, 1102, 1155, 1205, 1253, 1297, 1339, 1379, 1417, 1452, 1486, 1517,
1546, 1575, 1602, 1627, 1650, 1673, 1694, 1714, 1732, 1750, 1767, 1783,
1798, 1812, 1825, 1837, 1849, 1860, 1871, 1881, 1890, 1899, 1907, 1915,
1923, 1930, 1936, 1943, 1949, 1954, 1959, 1964, 1969, 1974, 1978, 1982,
1985, 1988, 1992, 1995, 1998, 2001, 2004, 2006, 2009, 2011, 2013, 2015
};
void main()
{
int i= 0;
int track_pointer=0;
int track[32] = { B5 }; // track array, initiallized on B5
UBYTE input; // Variable for joypad data
NR50_REG = 0x77; // This turns on sound (Off by default!)
NR51_REG = 0xFF; // This turns on sound (Off by default!)
NR52_REG = 0x80; // This turns on sound (Off by default!)
puts("Ver 0.1");
puts(" -MONOTRACK-");
while(1){ // Loop forever
input = joypad(); // Read the joypad
if(track_pointer!=32) //32 is the max. size of the track
{
if(input &J_A){
printf(" %u", track_pointer);
puts("-G2"); //print the note
track[track_pointer]=G2;
play_note(G2);
track_pointer=track_pointer+1;
waitpadup(); // Wait until the button is released
}
else if(input &J_B){
printf(" %u", track_pointer);
puts("-F2"); // print the note
track[track_pointer]=F2;
play_note(F2);
track_pointer=track_pointer+1;
waitpadup(); // Wait until the button is released
}
else if(input &J_SELECT){
printf(" %u", track_pointer);
puts("-A2");
track[track_pointer]=A2;
play_note(A2);
track_pointer=track_pointer+1;
waitpadup();
}
else if(input &J_UP){
play_note(C2);
waitpadup();
}
}
if(input & J_START){
puts(" ");
puts("PLAY"); // play message
i=0;
while(i<track_pointer) //plays all the notes that the user have entered
{
play_note(track[i]);
i++;
delay(200);
}
waitpadup();
}
}
}
void play_note(UBYTE notevalue){
UBYTE flo, fhi;
UWORD freq = frequencies[notevalue];
// Volume envelope
NR12_REG = 0xF3; // F=maximum volume, 3=sound fade out
// Waveform
NR11_REG = 0xA1; // 50% square wave
// Frequency
flo = (UBYTE)freq & 0xFF;
fhi = (UBYTE)((freq & 0x0700)>>8);
NR13_REG = flo; // Take lower 8 bits from the function argument
NR14_REG = 0x80 | fhi;
// Take 3 more bits from the function argument, and set the start bit
}but now when I try to ad code here
else if(input &J_UP){
play_note(C2);
waitpadup();
}for example
else if(input &J_UP){
printf(" %u", track_pointer);
puts("-A2");
play_note(A2);
track[track_pointer]=A2;
track_pointer=track_pointer+1;
waitpadup();
}or annything else, it just fails compiling with a bunch of scary "error *** FATAL Compiler Internal Error in file 'asm.c' line number '103' : code generator internal error "
Does anybody know what the F*** happens with this compiler? it seems to fail totally randomly
Offline