# gbdk-go gbdk-go is a Go binding for GBDK. You can do GameBoy software development with Go. ## Architecture gbdk-go compiles Go source code and outputs C code. The output C code is built into GB ROM by GBDK. ```go package main import "github.com/Akatsuki-py/gbdk-go/api/stdio" func main() { stdio.Printf("Hello World!") stdio.Printf("\n\nPress Start") } ``` The above Go code is compiled into the following C code. ```c #include void main() { printf("Hello World!"); printf("\n\nPress Start"); } ``` ## Install You need to build binary from source. Requirements: - Go 1.14 - Make ```sh $ git clone https://github.com/Akatsuki-py/gbdk-go.git $ cd ./gbdk-go $ make ``` ## Usage Requirements: - gbdk-go/gbdkgo - gbdk-go/go2c - gbdk-go/gbdk2020 They must be in the same directory. If you are doing the above Install step, there should be no problem. ```sh $ gbdkgo [options] dir ``` #### Example ```sh $ gbdkgo example/simple_shmup ``` ## API [gbdk-go API](https://pkg.go.dev/github.com/Akatsuki-py/gbdk-go/api@v0.0.1) The API is basically a GBDK binding. Some are not yet implemented. ## Project rules - `./main.go` main file in project. `./main.c` in gbdk. - `./**.go` sub file in project. `./**.c` in gbdk. - `./asset/**.go` asset file in project. these file is converted into `asset.h` You must create a Go directory project according to above format. The directory structure also needs to be specific. ## Linter Although gbdk-go allows GB development with Go, there are some grammars such as defer and goroutine that cannot be used. So I'm going to write a linter for gbdk-go. ## Performance warning gbdk-go outputs GB ROM with C in between. When using C language, the performance is greatly inferior compared to the raw assembly. You should read [to_c_or_not_to_c.md](https://gist.github.com/ISSOtm/4f4d335c3fd258ad0dfc7d4d615409fd).