2012-02-26 16 views
-1

私はクラスアジテーションのためのゲームボーイプロジェクトに取り組んでいます。別の「機能」ファイルと「メイン」ファイルを用意する必要があると言われました。私はこれをやって狂っていくつもりです。私はヘッダーファイル "myLib.h"を作成しました。そこには、 "myLib.c"にある関数の定義とプロトタイプが含まれています。私のメインファイルでは、 "myLib.c"の関数を呼び出してコンパイルしますが、動作しません。 "myLib.c"をmakeファイルに追加しました。ファイルは以下の通りです:Cゲームボーイの別個の機能がメインファイル

myLib.h

typedef unsigned short u16; 
typedef unsigned char u8; 
typedef unsigned int u32; 

#define REG_DISPCTL *(unsigned short *)0x4000000 
#define MODE3 3 
#define BG2_ENABLE (1<<10) 
#define SCANLINECOUNTER *(volatile u16 *)0x4000006 

#define COLOR(r, g, b) ((r) | (g)<<5 | (b)<<10) 

#define RED COLOR(31,0,0) 
#define GREEN COLOR(0,31,0) 
#define BLUE COLOR(0,0,31) 
#define MAGENTA COLOR(31, 0, 31) 
#define YELLOW COLOR(31, 31, 0) 
#define CYAN COLOR(0,31,31) 
#define WHITE COLOR(31,31,31) 
#define BLACK 0 


#define OFFSET(r, c, numcols) ((r)*(numcols) + (c)) 


extern unsigned short *videoBuffer; 

// Buttons 

#define BUTTON_A  (1<<0) 
#define BUTTON_B  (1<<1) 
#define BUTTON_SELECT   (1<<2) 
#define BUTTON_START   (1<<3) 
#define BUTTON_RIGHT   (1<<4) 
#define BUTTON_LEFT  (1<<5) 
#define BUTTON_UP  (1<<6) 
#define BUTTON_DOWN  (1<<7) 
#define BUTTON_R  (1<<8) 
#define BUTTON_L  (1<<9) 

#define BUTTONS *(unsigned int *)0x4000130 

#define KEY_DOWN_NOW(key) (~(BUTTONS) & key) 

/* DMA */ 

typedef struct 
{ 
    const volatile void *src; 
    const volatile void *dst; 
    u32     cnt; 
} DMA_CONTROLLER; 

#define DMA ((volatile DMA_CONTROLLER *) 0x040000B0) 

#define REG_DMA0SAD   *(const volatile u32*)0x40000B0 // source address 
#define REG_DMA0DAD   *(volatile u32*)0x40000B4 // destination address 
#define REG_DMA0CNT   *(volatile u32*)0x40000B8 // control register 

// DMA channel 1 register definitions 
#define REG_DMA1SAD   *(const volatile u32*)0x40000BC // source address 
#define REG_DMA1DAD   *(volatile u32*)0x40000C0 // destination address 
#define REG_DMA1CNT   *(volatile u32*)0x40000C4 // control register 

// DMA channel 2 register definitions 
#define REG_DMA2SAD   *(const volatile u32*)0x40000C8 // source address 
#define REG_DMA2DAD   *(volatile u32*)0x40000CC // destination address 
#define REG_DMA2CNT   *(volatile u32*)0x40000D0 // control register 

// DMA channel 3 register definitions 
#define REG_DMA3SAD   *(volatile u32*)0x40000D4 // source address 
#define REG_DMA3DAD   *(volatile u32*)0x40000D8 // destination address 
#define REG_DMA3CNT   *(volatile u32*)0x40000DC // control register 

// Defines 
#define DMA_CHANNEL_0 0 
#define DMA_CHANNEL_1 1 
#define DMA_CHANNEL_2 2 
#define DMA_CHANNEL_3 3 

#define DMA_DESTINATION_INCREMENT (0 << 21) 
#define DMA_DESTINATION_DECREMENT (1 << 21) 
#define DMA_DESTINATION_FIXED (2 << 21) 
#define DMA_DESTINATION_RESET (3 << 21) 

#define DMA_SOURCE_INCREMENT (0 << 23) 
#define DMA_SOURCE_DECREMENT (1 << 23) 
#define DMA_SOURCE_FIXED (2 << 23) 

#define DMA_REPEAT (1 << 25) 

#define DMA_16 (0 << 26) 
#define DMA_32 (1 << 26) 

#define DMA_NOW (0 << 28) 
#define DMA_AT_VBLANK (1 << 28) 
#define DMA_AT_HBLANK (2 << 28) 
#define DMA_AT_REFRESH (3 << 28) 

#define DMA_IRQ (1 << 30) 
#define DMA_ON (1 << 31) 






// Prototypes 
void setPixel(int , int , u16); 
void drawRect(int row, int col, int height, int width, u16 color); 
void waitForVblank(); 
void fillScreen(u16 color); 
void delay(int); 

myLib.c

#include "myLib.h" 

unsigned short *videoBuffer = (unsigned short *)0x6000000; 
void setPixel(int row, int col, u16 color) 
{ 
    videoBuffer[OFFSET(row, col, 240)] = color; 
} 

void drawRect(int row, int col, int height, int width, 
     volatile u16 color) 
{ 
    int r; 

    for(r=0;r<height; r++) 
    { 

     REG_DMA3SAD = (u32)&color; 
     REG_DMA3DAD = (u32)(&videoBuffer[OFFSET(row+r, col, 240)]); 
     REG_DMA3CNT = width | DMA_SOURCE_FIXED | 
        DMA_DESTINATION_INCREMENT | DMA_ON; 

    } 
} 

void waitForVblank() 
{ 
    while(SCANLINECOUNTER > 160); 
    while(SCANLINECOUNTER < 160); 

} 

void fillScreen(volatile u16 color) 
{ 
    REG_DMA3SAD = (u32)&color; 
    REG_DMA3DAD = (u32)videoBuffer; 
    REG_DMA3CNT = (160*240) | DMA_SOURCE_FIXED | 
        DMA_DESTINATION_INCREMENT | DMA_ON; 
} 
void delay(int n) 
{ 
    int i; 
    volatile int x; 
    for(i=0; i<10000*n; i++) 
    { 
     x = x + 1; 
    } 
} 

main.cの

#include <stdio.h> 
#include <stdlib.h> 
#include "myLib.h" 

int main() { 
    int i = 0; 
    int j = 0; 
    for(i = 0; i < 160; i++){ 
     for(j = 0; j < 240; j++){ 
      { 
       setPixel(i, j, RED); 
      } 
     } 
    } 
    return (EXIT_SUCCESS); 
} 

Makefileの

######################################## 
## CS1372 Dual GBA/Console Makefile ## 
## Updated: 1/08/2010 - Drew Bratcher ## 
######################################## 

# Student instructions: 
# - Ensure that the paths are correct 
# - Edit the SOURCES line with a space-separated list of your .c files 
# - Keep updating SOURCES every time you add a new source file 
# - Select "Release" in NetBeans if this is a GBA project 
# - Select "Debug" in NetBeans if this is a console project 
# - Make sure the Linker Output in NetBeans is set to "Program" for all configurations 


# --- Project Settings (Change these for your proejct) 
# PRODUCT_NAME should match your Linker Output in NetBeans 
# SOURCES should be The .c files in your project 
PRODUCT_NAME  = Program 

###### LIST ALL C Files in your project here 
SOURCES   = main.c myLib.c 

###### --- System Settings (Update these for your system) 
###### Mac example paths 
DKPATH    = C:/CS1372-Tools/devkitARM/devkitARM/bin 
CCPATH    = C:/cygwin/bin 
VBASIM    = C:/CS1372-Tools/VisualBoyAdvance-1.7.2/VisualBoyAdvance.exe 
#DKPATH    = C:/devkitARM/bin 
#CCPATH    = C:/cygwin/bin 
#VBASIM    = C:/ 



FIND    = find 
COPY    = cp -r 

# --- File Names 
ELF_NAME   = $(PRODUCT_NAME).elf 
ROM_NAME   = $(PRODUCT_NAME).gba 
BIN_NAME   = $(PRODUCT_NAME) 

# --- Debug and Release Selection 
# Don't change this or it'll break your Makefile 
# If you need to override the selection, uncomment one: 
#CONF    = Debug 
#CONF    = Release 
ifeq ($(CONF),Debug) 
DEBUG    = yes 
endif 

ifndef DEBUG 
# ============ RELEASE MODE 
# --- GBA Settings 
MODEL    = -mthumb-interwork -mthumb 
SPECS    = -specs=gba.specs 

# --- Archiver 
AS     = $(DKPATH)/arm-eabi-as 
ASFLAGS   = -mthumb-interwork 

# --- Compiler 
CC     = $(DKPATH)/arm-eabi-gcc 
CFLAGS    = $(MODEL) -O2 -Wall -pedantic -Wextra -Werror -ansi -std=c99 -D_ROM=$(ROM_NAME) -D_VBA=$(VBASIM) 
CC_WRAP   = $(CCPATH)/gcc 
CFLAGS_WRAP  = -O2 -Wall -pedantic -Wextra -Werror -ansi -std=c99 -D_ROM='"$(ROM_NAME)"' -D_VBA='"$(VBASIM)"' 

# --- Linker 
LD     = $(DKPATH)/arm-eabi-gcc 
LDFLAGS   = $(SPECS) $(MODEL) -lm 

# --- Object/Executable Packager 
OBJCOPY   = $(DKPATH)/arm-eabi-objcopy 
OBJCOPYFLAGS  = -O binary 

# --- ROM Fixer 
GBAFIX    = $(DKPATH)/gbafix 

# --- Delete 
RM     = rm -f 

OBJECTS = $(filter-out gba_wrapper%,$(SOURCES:.c=.o)) 

# --- Main build target 
all : build $(BIN_NAME) 

run : build 
    $(VBASIM) $(ROM_NAME) 

build : UNZIP $(ROM_NAME) 

$(BIN_NAME) : gba_wrapper.c 
    $(CC_WRAP) $(CFLAGS_WRAP) -o [email protected] $^ 

# --- Build .elf file into .gba ROM file 
$(ROM_NAME) : $(ELF_NAME) 
    $(OBJCOPY) $(OBJCOPYFLAGS) $(ELF_NAME) $(ROM_NAME) 
    $(GBAFIX) $(ROM_NAME) 

# --- Build .o files into .elf file 
$(ELF_NAME) : $(OBJECTS) 
    $(LD) $(OBJECTS) $(LDFLAGS) -o [email protected] 

# -- Build .c files into .o files 
$(OBJECTS) : %.o : %.c 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

# ============ RELEASE MODE 
else 
# ============ DEBUG MODE 
# --- Compiler 
CC     = $(CCPATH)/gcc 
CFLAGS    = -D_DEBUG -O2 -Wall -pedantic -Wextra -Werror -ansi -std=c99 -ggdb 

all : build 

run : build 
    ./$(BIN_NAME) 

clean : 

build : UNZIP $(BIN_NAME) 

$(BIN_NAME) : $(SOURCES) 
    $(CC) -o $(BIN_NAME) $(CFLAGS) $(SOURCES) 

# ============ DEBUG MODE 
endif 

# ============ Common 
UNZIP : 
    [email protected]$(FIND) . -iname "*.zip" -exec unzip -n {} \; -exec echo "This project must be rebuilt" \; -exec rm {} \; 

clean: 
    $(RM) $(ROM_NAME) 
    $(RM) $(ELF_NAME) 
    $(RM) $(BIN_NAME) 
    $(RM) *.o 
# ============ Common 
+1

"動作しません"を定義してください。 –

+1

何が問題なのですか?より具体的にしてください。 – tobier

+0

エミュレータの画面は灰色で、メインのコードが実行されていないようです。私はデバッガを試してみても、それを壊すことさえできません。 – Reid

答えて