Browse Source

Add title song

master
Forest Belton 2 years ago
parent
commit
311bf475db
20 changed files with 3656 additions and 17 deletions
  1. +2
    -1
      .vscode/settings.json
  2. BIN
      assets/player.png
  3. BIN
      assets/title.uge
  4. +2
    -2
      src/actor.c
  5. +2
    -1
      src/actor.h
  6. +14
    -0
      src/audio.c
  7. +14
    -6
      src/collision.c
  8. +4
    -0
      src/game.h
  9. +913
    -0
      src/hardware.inc
  10. +26
    -0
      src/helpers.asm
  11. +81
    -0
      src/huge.inc
  12. +78
    -0
      src/huge_note_table.inc
  13. +1729
    -0
      src/hugedriver.asm
  14. +119
    -0
      src/hugedriver.h
  15. +7
    -0
      src/main.c
  16. +2
    -2
      src/map.c
  17. +22
    -4
      src/player.c
  18. +2
    -1
      src/player.h
  19. +634
    -0
      src/songs/title.asm
  20. +5
    -0
      src/title.c

+ 2
- 1
.vscode/settings.json View File

@ -3,6 +3,7 @@
"hardware.h": "c",
"util.h": "c",
"video.h": "c",
"vram.h": "c"
"vram.h": "c",
"game.h": "c"
}
}

BIN
assets/player.png View File

Before After
Width: 16  |  Height: 32  |  Size: 191 B Width: 16  |  Height: 48  |  Size: 228 B

BIN
assets/title.uge View File


+ 2
- 2
src/actor.c View File

@ -14,7 +14,7 @@
#define FRAMES_PER_ANIM_FRAME 20
#define PLAYER_ACTOR_IDX 0
static actor_anim_state_t ANIM_TOTAL_FRAMES[] = {2};
static actor_anim_state_t ANIM_TOTAL_FRAMES[] = {2, 1};
static uint8_t mob_ids[MAX_UNIQUE_MOBS];
static uint8_t *mob_anim_data[MAX_UNIQUE_MOBS];
@ -32,7 +32,7 @@ void actor_init(void) {
PLAYER_ACTOR->frame_idx = 0;
PLAYER_ACTOR->frame_counter = 0;
PLAYER_ACTOR->x = PLAYER.x;
PLAYER_ACTOR->y = PLAYER.y;
PLAYER_ACTOR->y = PLAYER.y_hi;
}
void actor_reset(void) {

+ 2
- 1
src/actor.h View File

@ -12,8 +12,9 @@ typedef enum {
typedef enum {
ANIM_STAND,
ANIM_WALK,
// TODO: Put JUMP at end later
ANIM_JUMP,
ANIM_WALK,
ANIM_ATTACK,
ANIM_HURT,
ANIM_CLIMB,

+ 14
- 0
src/audio.c View File

@ -0,0 +1,14 @@
#include "hugedriver.h"
#include "sdk/hardware.h"
extern const hUGESong_t song_title;
void audio_init(void) {
rAUDENA = 0x80;
rAUDTERM = 0xff;
rAUDVOL = 0x77;
hUGE_init(&song_title);
}
void audio_reset(void) { rAUDVOL = 0; }

+ 14
- 6
src/collision.c View File

@ -9,7 +9,8 @@ typedef enum {
} coll_state_t;
uint8_t can_move_to(uint8_t x, uint8_t y) {
const uint8_t coll = ((uint8_t*)MAP.collision_ptr)[y * MAP.map_width + x];
const uint8_t coll =
((uint8_t*)MAP.collision_ptr)[y * (MAP.map_width + 1) + x];
return coll & COLLF_WALK;
}
@ -23,12 +24,12 @@ uint8_t get_tile_coord(uint8_t pixel_coord) {
uint8_t player_bg_collides(void) {
const int8_t map_x = PLAYER.x / 8 + MAP.camera_x;
if (map_x < 0 || map_x >= MAP.map_width) {
if (map_x < 0 || map_x + 1 >= MAP.map_width) {
return 1;
}
const int8_t map_y = PLAYER.y / 8 + MAP.camera_y;
if (map_y < 0 || map_y >= MAP.map_height) {
const int8_t map_y = PLAYER.y_hi / 8 + MAP.camera_y;
if (map_y < 0 || map_y + 1 >= MAP.map_height) {
return 1;
}
@ -38,8 +39,15 @@ uint8_t player_bg_collides(void) {
}
uint8_t player_in_air(void) {
const uint8_t x = get_tile_coord(PLAYER.x) + MAP.camera_x;
const uint8_t y = get_tile_coord(PLAYER.y) + MAP.camera_y;
const int8_t x = get_tile_coord(PLAYER.x) + MAP.camera_x;
if (x < 0 || x + 1 >= MAP.map_width) {
return 0;
}
const int8_t y = get_tile_coord(PLAYER.y_hi) + MAP.camera_y;
if (y < 0 || y + 2 >= MAP.map_height) {
return 0;
}
return can_move_to(x, y + 2) && can_move_to(x + 1, y + 2);
}

+ 4
- 0
src/game.h View File

@ -80,4 +80,8 @@ uint8_t player_bg_collides(void);
uint8_t player_in_air(void);
void audio_init(void);
void audio_reset(void);
#endif

+ 913
- 0
src/hardware.inc View File

@ -0,0 +1,913 @@
;*
;* Gameboy Hardware definitions
;*
;* Based on Jones' hardware.inc
;* And based on Carsten Sorensen's ideas.
;*
;* Rev 1.1 - 15-Jul-97 : Added define check
;* Rev 1.2 - 18-Jul-97 : Added revision check macro
;* Rev 1.3 - 19-Jul-97 : Modified for RGBASM V1.05
;* Rev 1.4 - 27-Jul-97 : Modified for new subroutine prefixes
;* Rev 1.5 - 15-Aug-97 : Added _HRAM, PAD, CART defines
;* : and Nintendo Logo
;* Rev 1.6 - 30-Nov-97 : Added rDIV, rTIMA, rTMA, & rTAC
;* Rev 1.7 - 31-Jan-98 : Added _SCRN0, _SCRN1
;* Rev 1.8 - 15-Feb-98 : Added rSB, rSC
;* Rev 1.9 - 16-Feb-98 : Converted I/O registers to $FFXX format
;* Rev 2.0 - : Added GBC registers
;* Rev 2.1 - : Added MBC5 & cart RAM enable/disable defines
;* Rev 2.2 - : Fixed NR42,NR43, & NR44 equates
;* Rev 2.3 - : Fixed incorrect _HRAM equate
;* Rev 2.4 - 27-Apr-13 : Added some cart defines (AntonioND)
;* Rev 2.5 - 03-May-15 : Fixed format (AntonioND)
;* Rev 2.6 - 09-Apr-16 : Added GBC OAM and cart defines (AntonioND)
;* Rev 2.7 - 19-Jan-19 : Added rPCMXX (ISSOtm)
;* Rev 2.8 - 03-Feb-19 : Added audio registers flags (lvaro Cuesta)
;* Rev 2.9 - 28-Feb-20 : Added utility rP1 constants
;* Rev 3.0 - 27-Aug-20 : Register ordering, byte-based sizes, OAM additions, general cleanup (Blitter Object)
; If all of these are already defined, don't do it again.
IF !DEF(HARDWARE_INC)
HARDWARE_INC SET 1
rev_Check_hardware_inc : MACRO
;NOTE: REVISION NUMBER CHANGES MUST BE ADDED
;TO SECOND PARAMETER IN FOLLOWING LINE.
IF \1 > 3.0 ;PUT REVISION NUMBER HERE
WARN "Version \1 or later of 'hardware.inc' is required."
ENDC
ENDM
_VRAM EQU $8000 ; $8000->$9FFF
_VRAM8000 EQU _VRAM
_VRAM8800 EQU _VRAM+$800
_VRAM9000 EQU _VRAM+$1000
_SCRN0 EQU $9800 ; $9800->$9BFF
_SCRN1 EQU $9C00 ; $9C00->$9FFF
_SRAM EQU $A000 ; $A000->$BFFF
_RAM EQU $C000 ; $C000->$CFFF / $C000->$DFFF
_RAMBANK EQU $D000 ; $D000->$DFFF
_OAMRAM EQU $FE00 ; $FE00->$FE9F
_IO EQU $FF00 ; $FF00->$FF7F,$FFFF
_AUD3WAVERAM EQU $FF30 ; $FF30->$FF3F
_HRAM EQU $FF80 ; $FF80->$FFFE
; *** MBC5 Equates ***
rRAMG EQU $0000 ; $0000->$1fff
rROMB0 EQU $2000 ; $2000->$2fff
rROMB1 EQU $3000 ; $3000->$3fff - If more than 256 ROM banks are present.
rRAMB EQU $4000 ; $4000->$5fff - Bit 3 enables rumble (if present)
;***************************************************************************
;*
;* Custom registers
;*
;***************************************************************************
; --
; -- P1 ($FF00)
; -- Register for reading joy pad info. (R/W)
; --
rP1 EQU $FF00
P1F_5 EQU %00100000 ; P15 out port, set to 0 to get buttons
P1F_4 EQU %00010000 ; P14 out port, set to 0 to get dpad
P1F_3 EQU %00001000 ; P13 in port
P1F_2 EQU %00000100 ; P12 in port
P1F_1 EQU %00000010 ; P11 in port
P1F_0 EQU %00000001 ; P10 in port
P1F_GET_DPAD EQU P1F_5
P1F_GET_BTN EQU P1F_4
P1F_GET_NONE EQU P1F_4 | P1F_5
; --
; -- SB ($FF01)
; -- Serial Transfer Data (R/W)
; --
rSB EQU $FF01
; --
; -- SC ($FF02)
; -- Serial I/O Control (R/W)
; --
rSC EQU $FF02
; --
; -- DIV ($FF04)
; -- Divider register (R/W)
; --
rDIV EQU $FF04
; --
; -- TIMA ($FF05)
; -- Timer counter (R/W)
; --
rTIMA EQU $FF05
; --
; -- TMA ($FF06)
; -- Timer modulo (R/W)
; --
rTMA EQU $FF06
; --
; -- TAC ($FF07)
; -- Timer control (R/W)
; --
rTAC EQU $FF07
TACF_START EQU %00000100
TACF_STOP EQU %00000000
TACF_4KHZ EQU %00000000
TACF_16KHZ EQU %00000011
TACF_65KHZ EQU %00000010
TACF_262KHZ EQU %00000001
; --
; -- IF ($FF0F)
; -- Interrupt Flag (R/W)
; --
rIF EQU $FF0F
; --
; -- AUD1SWEEP/NR10 ($FF10)
; -- Sweep register (R/W)
; --
; -- Bit 6-4 - Sweep Time
; -- Bit 3 - Sweep Increase/Decrease
; -- 0: Addition (frequency increases???)
; -- 1: Subtraction (frequency increases???)
; -- Bit 2-0 - Number of sweep shift (# 0-7)
; -- Sweep Time: (n*7.8ms)
; --
rNR10 EQU $FF10
rAUD1SWEEP EQU rNR10
AUD1SWEEP_UP EQU %00000000
AUD1SWEEP_DOWN EQU %00001000
; --
; -- AUD1LEN/NR11 ($FF11)
; -- Sound length/Wave pattern duty (R/W)
; --
; -- Bit 7-6 - Wave Pattern Duty (00:12.5% 01:25% 10:50% 11:75%)
; -- Bit 5-0 - Sound length data (# 0-63)
; --
rNR11 EQU $FF11
rAUD1LEN EQU rNR11
; --
; -- AUD1ENV/NR12 ($FF12)
; -- Envelope (R/W)
; --
; -- Bit 7-4 - Initial value of envelope
; -- Bit 3 - Envelope UP/DOWN
; -- 0: Decrease
; -- 1: Range of increase
; -- Bit 2-0 - Number of envelope sweep (# 0-7)
; --
rNR12 EQU $FF12
rAUD1ENV EQU rNR12
; --
; -- AUD1LOW/NR13 ($FF13)
; -- Frequency low byte (W)
; --
rNR13 EQU $FF13
rAUD1LOW EQU rNR13
; --
; -- AUD1HIGH/NR14 ($FF14)
; -- Frequency high byte (W)
; --
; -- Bit 7 - Initial (when set, sound restarts)
; -- Bit 6 - Counter/consecutive selection
; -- Bit 2-0 - Frequency's higher 3 bits
; --
rNR14 EQU $FF14
rAUD1HIGH EQU rNR14
; --
; -- AUD2LEN/NR21 ($FF16)
; -- Sound Length; Wave Pattern Duty (R/W)
; --
; -- see AUD1LEN for info
; --
rNR21 EQU $FF16
rAUD2LEN EQU rNR21
; --
; -- AUD2ENV/NR22 ($FF17)
; -- Envelope (R/W)
; --
; -- see AUD1ENV for info
; --
rNR22 EQU $FF17
rAUD2ENV EQU rNR22
; --
; -- AUD2LOW/NR23 ($FF18)
; -- Frequency low byte (W)
; --
rNR23 EQU $FF18
rAUD2LOW EQU rNR23
; --
; -- AUD2HIGH/NR24 ($FF19)
; -- Frequency high byte (W)
; --
; -- see AUD1HIGH for info
; --
rNR24 EQU $FF19
rAUD2HIGH EQU rNR24
; --
; -- AUD3ENA/NR30 ($FF1A)
; -- Sound on/off (R/W)
; --
; -- Bit 7 - Sound ON/OFF (1=ON,0=OFF)
; --
rNR30 EQU $FF1A
rAUD3ENA EQU rNR30
; --
; -- AUD3LEN/NR31 ($FF1B)
; -- Sound length (R/W)
; --
; -- Bit 7-0 - Sound length
; --
rNR31 EQU $FF1B
rAUD3LEN EQU rNR31
; --
; -- AUD3LEVEL/NR32 ($FF1C)
; -- Select output level
; --
; -- Bit 6-5 - Select output level
; -- 00: 0/1 (mute)
; -- 01: 1/1
; -- 10: 1/2
; -- 11: 1/4
; --
rNR32 EQU $FF1C
rAUD3LEVEL EQU rNR32
; --
; -- AUD3LOW/NR33 ($FF1D)
; -- Frequency low byte (W)
; --
; -- see AUD1LOW for info
; --
rNR33 EQU $FF1D
rAUD3LOW EQU rNR33
; --
; -- AUD3HIGH/NR34 ($FF1E)
; -- Frequency high byte (W)
; --
; -- see AUD1HIGH for info
; --
rNR34 EQU $FF1E
rAUD3HIGH EQU rNR34
; --
; -- AUD4LEN/NR41 ($FF20)
; -- Sound length (R/W)
; --
; -- Bit 5-0 - Sound length data (# 0-63)
; --
rNR41 EQU $FF20
rAUD4LEN EQU rNR41
; --
; -- AUD4ENV/NR42 ($FF21)
; -- Envelope (R/W)
; --
; -- see AUD1ENV for info
; --
rNR42 EQU $FF21
rAUD4ENV EQU rNR42
; --
; -- AUD4POLY/NR43 ($FF22)
; -- Polynomial counter (R/W)
; --
; -- Bit 7-4 - Selection of the shift clock frequency of the (scf)
; -- polynomial counter (0000-1101)
; -- freq=drf*1/2^scf (not sure)
; -- Bit 3 - Selection of the polynomial counter's step
; -- 0: 15 steps
; -- 1: 7 steps
; -- Bit 2-0 - Selection of the dividing ratio of frequencies (drf)
; -- 000: f/4 001: f/8 010: f/16 011: f/24
; -- 100: f/32 101: f/40 110: f/48 111: f/56 (f=4.194304 Mhz)
; --
rNR43 EQU $FF22
rAUD4POLY EQU rNR43
; --
; -- AUD4GO/NR44 ($FF23)
; --
; -- Bit 7 - Inital
; -- Bit 6 - Counter/consecutive selection
; --
rNR44 EQU $FF23
rAUD4GO EQU rNR44
; --
; -- AUDVOL/NR50 ($FF24)
; -- Channel control / ON-OFF / Volume (R/W)
; --
; -- Bit 7 - Vin->SO2 ON/OFF (Vin??)
; -- Bit 6-4 - SO2 output level (volume) (# 0-7)
; -- Bit 3 - Vin->SO1 ON/OFF (Vin??)
; -- Bit 2-0 - SO1 output level (volume) (# 0-7)
; --
rNR50 EQU $FF24
rAUDVOL EQU rNR50
AUDVOL_VIN_LEFT EQU %10000000 ; SO2
AUDVOL_VIN_RIGHT EQU %00001000 ; SO1
; --
; -- AUDTERM/NR51 ($FF25)
; -- Selection of Sound output terminal (R/W)
; --
; -- Bit 7 - Output sound 4 to SO2 terminal
; -- Bit 6 - Output sound 3 to SO2 terminal
; -- Bit 5 - Output sound 2 to SO2 terminal
; -- Bit 4 - Output sound 1 to SO2 terminal
; -- Bit 3 - Output sound 4 to SO1 terminal
; -- Bit 2 - Output sound 3 to SO1 terminal
; -- Bit 1 - Output sound 2 to SO1 terminal
; -- Bit 0 - Output sound 0 to SO1 terminal
; --
rNR51 EQU $FF25
rAUDTERM EQU rNR51
; SO2
AUDTERM_4_LEFT EQU %10000000
AUDTERM_3_LEFT EQU %01000000
AUDTERM_2_LEFT EQU %00100000
AUDTERM_1_LEFT EQU %00010000
; SO1
AUDTERM_4_RIGHT EQU %00001000
AUDTERM_3_RIGHT EQU %00000100
AUDTERM_2_RIGHT EQU %00000010
AUDTERM_1_RIGHT EQU %00000001
; --
; -- AUDENA/NR52 ($FF26)
; -- Sound on/off (R/W)
; --
; -- Bit 7 - All sound on/off (sets all audio regs to 0!)
; -- Bit 3 - Sound 4 ON flag (read only)
; -- Bit 2 - Sound 3 ON flag (read only)
; -- Bit 1 - Sound 2 ON flag (read only)
; -- Bit 0 - Sound 1 ON flag (read only)
; --
rNR52 EQU $FF26
rAUDENA EQU rNR52
AUDENA_ON EQU %10000000
AUDENA_OFF EQU %00000000 ; sets all audio regs to 0!
; --
; -- LCDC ($FF40)
; -- LCD Control (R/W)
; --
rLCDC EQU $FF40
LCDCF_OFF EQU %00000000 ; LCD Control Operation
LCDCF_ON EQU %10000000 ; LCD Control Operation
LCDCF_WIN9800 EQU %00000000 ; Window Tile Map Display Select
LCDCF_WIN9C00 EQU %01000000 ; Window Tile Map Display Select
LCDCF_WINOFF EQU %00000000 ; Window Display
LCDCF_WINON EQU %00100000 ; Window Display
LCDCF_BG8800 EQU %00000000 ; BG & Window Tile Data Select
LCDCF_BG8000 EQU %00010000 ; BG & Window Tile Data Select
LCDCF_BG9800 EQU %00000000 ; BG Tile Map Display Select
LCDCF_BG9C00 EQU %00001000 ; BG Tile Map Display Select
LCDCF_OBJ8 EQU %00000000 ; OBJ Construction
LCDCF_OBJ16 EQU %00000100 ; OBJ Construction
LCDCF_OBJOFF EQU %00000000 ; OBJ Display
LCDCF_OBJON EQU %00000010 ; OBJ Display
LCDCF_BGOFF EQU %00000000 ; BG Display
LCDCF_BGON EQU %00000001 ; BG Display
; "Window Character Data Select" follows BG
; --
; -- STAT ($FF41)
; -- LCDC Status (R/W)
; --
rSTAT EQU $FF41
STATF_LYC EQU %01000000 ; LYC=LY Coincidence (Selectable)
STATF_MODE10 EQU %00100000 ; Mode 10
STATF_MODE01 EQU %00010000 ; Mode 01 (V-Blank)
STATF_MODE00 EQU %00001000 ; Mode 00 (H-Blank)
STATF_LYCF EQU %00000100 ; Coincidence Flag
STATF_HBL EQU %00000000 ; H-Blank
STATF_VBL EQU %00000001 ; V-Blank
STATF_OAM EQU %00000010 ; OAM-RAM is used by system
STATF_LCD EQU %00000011 ; Both OAM and VRAM used by system
STATF_BUSY EQU %00000010 ; When set, VRAM access is unsafe
; --
; -- SCY ($FF42)
; -- Scroll Y (R/W)
; --
rSCY EQU $FF42
; --
; -- SCX ($FF43)
; -- Scroll X (R/W)
; --
rSCX EQU $FF43
; --
; -- LY ($FF44)
; -- LCDC Y-Coordinate (R)
; --
; -- Values range from 0->153. 144->153 is the VBlank period.
; --
rLY EQU $FF44
; --
; -- LYC ($FF45)
; -- LY Compare (R/W)
; --
; -- When LY==LYC, STATF_LYCF will be set in STAT
; --
rLYC EQU $FF45
; --
; -- DMA ($FF46)
; -- DMA Transfer and Start Address (W)
; --
rDMA EQU $FF46
; --
; -- BGP ($FF47)
; -- BG Palette Data (W)
; --
; -- Bit 7-6 - Intensity for %11
; -- Bit 5-4 - Intensity for %10
; -- Bit 3-2 - Intensity for %01
; -- Bit 1-0 - Intensity for %00
; --
rBGP EQU $FF47
; --
; -- OBP0 ($FF48)
; -- Object Palette 0 Data (W)
; --
; -- See BGP for info
; --
rOBP0 EQU $FF48
; --
; -- OBP1 ($FF49)
; -- Object Palette 1 Data (W)
; --
; -- See BGP for info
; --
rOBP1 EQU $FF49
; --
; -- WY ($FF4A)
; -- Window Y Position (R/W)
; --
; -- 0 <= WY <= 143
; -- When WY = 0, the window is displayed from the top edge of the LCD screen.
; --
rWY EQU $FF4A
; --
; -- WX ($FF4B)
; -- Window X Position (R/W)
; --
; -- 7 <= WX <= 166
; -- When WX = 7, the window is displayed from the left edge of the LCD screen.
; -- Values of 0-6 and 166 are unreliable due to hardware bugs.
; --
rWX EQU $FF4B
; --
; -- SPEED ($FF4D)
; -- Select CPU Speed (R/W)
; --
rKEY1 EQU $FF4D
rSPD EQU rKEY1
KEY1F_DBLSPEED EQU %10000000 ; 0=Normal Speed, 1=Double Speed (R)
KEY1F_PREPARE EQU %00000001 ; 0=No, 1=Prepare (R/W)
; --
; -- VBK ($FF4F)
; -- Select Video RAM Bank (R/W)
; --
; -- Bit 0 - Bank Specification (0: Specify Bank 0; 1: Specify Bank 1)
; --
rVBK EQU $FF4F
; --
; -- HDMA1 ($FF51)
; -- High byte for Horizontal Blanking/General Purpose DMA source address (W)
; -- CGB Mode Only
; --
rHDMA1 EQU $FF51
; --
; -- HDMA2 ($FF52)
; -- Low byte for Horizontal Blanking/General Purpose DMA source address (W)
; -- CGB Mode Only
; --
rHDMA2 EQU $FF52
; --
; -- HDMA3 ($FF53)
; -- High byte for Horizontal Blanking/General Purpose DMA destination address (W)
; -- CGB Mode Only
; --
rHDMA3 EQU $FF53
; --
; -- HDMA4 ($FF54)
; -- Low byte for Horizontal Blanking/General Purpose DMA destination address (W)
; -- CGB Mode Only
; --
rHDMA4 EQU $FF54
; --
; -- HDMA5 ($FF55)
; -- Transfer length (in tiles minus 1)/mode/start for Horizontal Blanking, General Purpose DMA (R/W)
; -- CGB Mode Only
; --
rHDMA5 EQU $FF55
HDMA5F_MODE_GP EQU %00000000 ; General Purpose DMA (W)
HDMA5F_MODE_HBL EQU %10000000 ; HBlank DMA (W)
; -- Once DMA has started, use HDMA5F_BUSY to check when the transfer is complete
HDMA5F_BUSY EQU %10000000 ; 0=Busy (DMA still in progress), 1=Transfer complete (R)
; --
; -- RP ($FF56)
; -- Infrared Communications Port (R/W)
; -- CGB Mode Only
; --
rRP EQU $FF56
RPF_ENREAD EQU %11000000
RPF_DATAIN EQU %00000010 ; 0=Receiving IR Signal, 1=Normal
RPF_WRITE_HI EQU %00000001
RPF_WRITE_LO EQU %00000000
; --
; -- BCPS ($FF68)
; -- Background Color Palette Specification (R/W)
; --
rBCPS EQU $FF68
BCPSF_AUTOINC EQU %10000000 ; Auto Increment (0=Disabled, 1=Increment after Writing)
; --
; -- BCPD ($FF69)
; -- Background Color Palette Data (R/W)
; --
rBCPD EQU $FF69
; --
; -- OCPS ($FF6A)
; -- Object Color Palette Specification (R/W)
; --
rOCPS EQU $FF6A
OCPSF_AUTOINC EQU %10000000 ; Auto Increment (0=Disabled, 1=Increment after Writing)
; --
; -- OCPD ($FF6B)
; -- Object Color Palette Data (R/W)
; --
rOCPD EQU $FF6B
; --
; -- SMBK/SVBK ($FF70)
; -- Select Main RAM Bank (R/W)
; --
; -- Bit 2-0 - Bank Specification (0,1: Specify Bank 1; 2-7: Specify Banks 2-7)
; --
rSVBK EQU $FF70
rSMBK EQU rSVBK
; --
; -- PCM12 ($FF76)
; -- Sound channel 1&2 PCM amplitude (R)
; --
; -- Bit 7-4 - Copy of sound channel 2's PCM amplitude
; -- Bit 3-0 - Copy of sound channel 1's PCM amplitude
; --
rPCM12 EQU $FF76
; --
; -- PCM34 ($FF77)
; -- Sound channel 3&4 PCM amplitude (R)
; --
; -- Bit 7-4 - Copy of sound channel 4's PCM amplitude
; -- Bit 3-0 - Copy of sound channel 3's PCM amplitude
; --
rPCM34 EQU $FF77
; --
; -- IE ($FFFF)
; -- Interrupt Enable (R/W)
; --
rIE EQU $FFFF
IEF_HILO EQU %00010000 ; Transition from High to Low of Pin number P10-P13
IEF_SERIAL EQU %00001000 ; Serial I/O transfer end
IEF_TIMER EQU %00000100 ; Timer Overflow
IEF_LCDC EQU %00000010 ; LCDC (see STAT)
IEF_VBLANK EQU %00000001 ; V-Blank
;***************************************************************************
;*
;* Flags common to multiple sound channels
;*
;***************************************************************************
; --
; -- Square wave duty cycle
; --
; -- Can be used with AUD1LEN and AUD2LEN
; -- See AUD1LEN for more info
; --
AUDLEN_DUTY_12_5 EQU %00000000 ; 12.5%
AUDLEN_DUTY_25 EQU %01000000 ; 25%
AUDLEN_DUTY_50 EQU %10000000 ; 50%
AUDLEN_DUTY_75 EQU %11000000 ; 75%
; --
; -- Audio envelope flags
; --
; -- Can be used with AUD1ENV, AUD2ENV, AUD4ENV
; -- See AUD1ENV for more info
; --
AUDENV_UP EQU %00001000
AUDENV_DOWN EQU %00000000
; --
; -- Audio trigger flags
; --
; -- Can be used with AUD1HIGH, AUD2HIGH, AUD3HIGH
; -- See AUD1HIGH for more info
; --
AUDHIGH_RESTART EQU %10000000
AUDHIGH_LENGTH_ON EQU %01000000
AUDHIGH_LENGTH_OFF EQU %00000000
;***************************************************************************
;*
;* CPU values on bootup (a=type, b=qualifier)
;*
;***************************************************************************
BOOTUP_A_DMG EQU $01 ; Dot Matrix Game
BOOTUP_A_CGB EQU $11 ; Color GameBoy
BOOTUP_A_MGB EQU $FF ; Mini GameBoy (Pocket GameBoy)
; if a=BOOTUP_A_CGB, bit 0 in b can be checked to determine if real CGB or
; other system running in GBC mode
BOOTUP_B_CGB EQU %00000000
BOOTUP_B_AGB EQU %00000001 ; GBA, GBA SP, Game Boy Player, or New GBA SP
;***************************************************************************
;*
;* Cart related
;*
;***************************************************************************
; $0143 Color GameBoy compatibility code
CART_COMPATIBLE_DMG EQU $00
CART_COMPATIBLE_DMG_GBC EQU $80
CART_COMPATIBLE_GBC EQU $C0
; $0146 GameBoy/Super GameBoy indicator
CART_INDICATOR_GB EQU $00
CART_INDICATOR_SGB EQU $03
; $0147 Cartridge type
CART_ROM EQU $00
CART_ROM_MBC1 EQU $01
CART_ROM_MBC1_RAM EQU $02
CART_ROM_MBC1_RAM_BAT EQU $03
CART_ROM_MBC2 EQU $05
CART_ROM_MBC2_BAT EQU $06
CART_ROM_RAM EQU $08
CART_ROM_RAM_BAT EQU $09
CART_ROM_MMM01 EQU $0B
CART_ROM_MMM01_RAM EQU $0C
CART_ROM_MMM01_RAM_BAT EQU $0D
CART_ROM_MBC3_BAT_RTC EQU $0F
CART_ROM_MBC3_RAM_BAT_RTC EQU $10
CART_ROM_MBC3 EQU $11
CART_ROM_MBC3_RAM EQU $12
CART_ROM_MBC3_RAM_BAT EQU $13
CART_ROM_MBC5 EQU $19
CART_ROM_MBC5_BAT EQU $1A
CART_ROM_MBC5_RAM_BAT EQU $1B
CART_ROM_MBC5_RUMBLE EQU $1C
CART_ROM_MBC5_RAM_RUMBLE EQU $1D
CART_ROM_MBC5_RAM_BAT_RUMBLE EQU $1E
CART_ROM_MBC7_RAM_BAT_GYRO EQU $22
CART_ROM_POCKET_CAMERA EQU $FC
CART_ROM_BANDAI_TAMA5 EQU $FD
CART_ROM_HUDSON_HUC3 EQU $FE
CART_ROM_HUDSON_HUC1 EQU $FF
; $0148 ROM size
; these are kilobytes
CART_ROM_32KB EQU $00 ; 2 banks
CART_ROM_64KB EQU $01 ; 4 banks
CART_ROM_128KB EQU $02 ; 8 banks
CART_ROM_256KB EQU $03 ; 16 banks
CART_ROM_512KB EQU $04 ; 32 banks
CART_ROM_1024KB EQU $05 ; 64 banks
CART_ROM_2048KB EQU $06 ; 128 banks
CART_ROM_4096KB EQU $07 ; 256 banks
CART_ROM_8192KB EQU $08 ; 512 banks
CART_ROM_1152KB EQU $52 ; 72 banks
CART_ROM_1280KB EQU $53 ; 80 banks
CART_ROM_1536KB EQU $54 ; 96 banks
; $0149 SRAM size
; these are kilobytes
CART_SRAM_NONE EQU 0
CART_SRAM_2KB EQU 1 ; 1 incomplete bank
CART_SRAM_8KB EQU 2 ; 1 bank
CART_SRAM_32KB EQU 3 ; 4 banks
CART_SRAM_128KB EQU 4 ; 16 banks
CART_SRAM_ENABLE EQU $0A
CART_SRAM_DISABLE EQU $00
; $014A Destination code
CART_DEST_JAPANESE EQU $00
CART_DEST_NON_JAPANESE EQU $01
;***************************************************************************
;*
;* Keypad related
;*
;***************************************************************************
PADF_DOWN EQU $80
PADF_UP EQU $40
PADF_LEFT EQU $20
PADF_RIGHT EQU $10
PADF_START EQU $08
PADF_SELECT EQU $04
PADF_B EQU $02
PADF_A EQU $01
PADB_DOWN EQU $7
PADB_UP EQU $6
PADB_LEFT EQU $5
PADB_RIGHT EQU $4
PADB_START EQU $3
PADB_SELECT EQU $2
PADB_B EQU $1
PADB_A EQU $0
;***************************************************************************
;*
;* Screen related
;*
;***************************************************************************
SCRN_X EQU 160 ; Width of screen in pixels
SCRN_Y EQU 144 ; Height of screen in pixels
SCRN_X_B EQU 20 ; Width of screen in bytes
SCRN_Y_B EQU 18 ; Height of screen in bytes
SCRN_VX EQU 256 ; Virtual width of screen in pixels
SCRN_VY EQU 256 ; Virtual height of screen in pixels
SCRN_VX_B EQU 32 ; Virtual width of screen in bytes
SCRN_VY_B EQU 32 ; Virtual height of screen in bytes
;***************************************************************************
;*
;* OAM related
;*
;***************************************************************************
; OAM attributes
; each entry in OAM RAM is 4 bytes (sizeof_OAM_ATTRS)
RSRESET
OAMA_Y RB 1 ; y pos
OAMA_X RB 1 ; x pos
OAMA_TILEID RB 1 ; tile id
OAMA_FLAGS RB 1 ; flags (see below)
sizeof_OAM_ATTRS RB 0
OAM_COUNT EQU 40 ; number of OAM entries in OAM RAM
; flags
OAMF_PRI EQU %10000000 ; Priority
OAMF_YFLIP EQU %01000000 ; Y flip
OAMF_XFLIP EQU %00100000 ; X flip
OAMF_PAL0 EQU %00000000 ; Palette number; 0,1 (DMG)
OAMF_PAL1 EQU %00010000 ; Palette number; 0,1 (DMG)
OAMF_BANK0 EQU %00000000 ; Bank number; 0,1 (GBC)
OAMF_BANK1 EQU %00001000 ; Bank number; 0,1 (GBC)
OAMF_PALMASK EQU %00000111 ; Palette (GBC)
OAMB_PRI EQU 7 ; Priority
OAMB_YFLIP EQU 6 ; Y flip
OAMB_XFLIP EQU 5 ; X flip
OAMB_PAL1 EQU 4 ; Palette number; 0,1 (DMG)
OAMB_BANK1 EQU 3 ; Bank number; 0,1 (GBC)
;*
;* Nintendo scrolling logo
;* (Code won't work on a real GameBoy)
;* (if next lines are altered.)
NINTENDO_LOGO : MACRO
DB $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83,$00,$0C,$00,$0D
DB $00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6,$DD,$DD,$D9,$99
DB $BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC,$99,$9F,$BB,$B9,$33,$3E
ENDM
ENDC ;HARDWARE_INC

+ 26
- 0
src/helpers.asm View File

@ -1,3 +1,11 @@
SECTION "LCD controller status interrupt", ROM0[$0048]
;; HACK!!!!!!!!!!!!!
;; there's some sort of bug in the emulator which needs to be fixed,
;; which screws up the program counter immediately after it exits a halt.
;; this nop protects against that for now.
nop
jp isr_wrapper
SECTION "vblank", ROM0[$40]
handle_vblank:
@ -12,3 +20,21 @@ _interrupts_disable::
_interrupts_enable::
ei
ret
SECTION "hUGE ISR", ROM0
isr_wrapper:
ld a, [_game_state]
cp 0
jr nz, .done
push af
push hl
push bc
push de
call hUGE_dosound
pop de
pop bc
pop hl
pop af
.done:
reti

+ 81
- 0
src/huge.inc View File

@ -0,0 +1,81 @@
dn: MACRO ;; (note, instr, effect)
db \1
db ((\2 << 4) | (\3 >> 8))
db LOW(\3)
ENDM
rsreset
def C_3 rb
def C#3 rb
def D_3 rb
def D#3 rb
def E_3 rb
def F_3 rb
def F#3 rb
def G_3 rb
def G#3 rb
def A_3 rb
def A#3 rb
def B_3 rb
def C_4 rb
def C#4 rb
def D_4 rb
def D#4 rb
def E_4 rb
def F_4 rb
def F#4 rb
def G_4 rb
def G#4 rb
def A_4 rb
def A#4 rb
def B_4 rb
def C_5 rb
def C#5 rb
def D_5 rb
def D#5 rb
def E_5 rb
def F_5 rb
def F#5 rb
def G_5 rb
def G#5 rb
def A_5 rb
def A#5 rb
def B_5 rb
def C_6 rb
def C#6 rb
def D_6 rb
def D#6 rb
def E_6 rb
def F_6 rb
def F#6 rb
def G_6 rb
def G#6 rb
def A_6 rb
def A#6 rb
def B_6 rb
def C_7 rb
def C#7 rb
def D_7 rb
def D#7 rb
def E_7 rb
def F_7 rb
def F#7 rb
def G_7 rb
def G#7 rb
def A_7 rb
def A#7 rb
def B_7 rb
def C_8 rb
def C#8 rb
def D_8 rb
def D#8 rb
def E_8 rb
def F_8 rb
def F#8 rb
def G_8 rb
def G#8 rb
def A_8 rb
def A#8 rb
def B_8 rb
def LAST_NOTE rb
___ EQU 90 ; the default "no note" value

+ 78
- 0
src/huge_note_table.inc View File

@ -0,0 +1,78 @@
;; hUGETracker note table.
;; Written by SuperDisk 2019
;; Gameboy sound frequences are represented as 11 byte periods.
;; this note table was generated from http://www.devrs.com/gb/files/sndtab.html
dw 44
dw 156
dw 262
dw 363
dw 457
dw 547
dw 631
dw 710
dw 786
dw 854
dw 923
dw 986
dw 1046
dw 1102
dw 1155
dw 1205
dw 1253
dw 1297
dw 1339
dw 1379
dw 1417
dw 1452
dw 1486
dw 1517
dw 1546
dw 1575
dw 1602
dw 1627
dw 1650
dw 1673
dw 1694
dw 1714
dw 1732
dw 1750
dw 1767
dw 1783
dw 1798
dw 1812
dw 1825
dw 1837
dw 1849
dw 1860
dw 1871
dw 1881
dw 1890
dw 1899
dw 1907
dw 1915
dw 1923
dw 1930
dw 1936
dw 1943
dw 1949
dw 1954
dw 1959
dw 1964
dw 1969
dw 1974
dw 1978
dw 1982
dw 1985
dw 1988
dw 1992
dw 1995
dw 1998
dw 2001
dw 2004
dw 2006
dw 2009
dw 2011
dw 2013
dw 2015

+ 1729
- 0
src/hugedriver.asm
File diff suppressed because it is too large
View File


+ 119
- 0
src/hugedriver.h View File

@ -0,0 +1,119 @@
#ifndef HUGEDRIVER_H_INCLUDE
#define HUGEDRIVER_H_INCLUDE
#define DN(A, B, C) (unsigned char)(A),(unsigned char)((B << 4) | (C >> 8)),(unsigned char)(C & 0xFF)
#define C_3 0
#define Cs3 1
#define D_3 2
#define Ds3 3
#define E_3 4
#define F_3 5
#define Fs3 6
#define G_3 7
#define Gs3 8
#define A_3 9
#define As3 10
#define B_3 11
#define C_4 12
#define Cs4 13
#define D_4 14
#define Ds4 15
#define E_4 16
#define F_4 17
#define Fs4 18
#define G_4 19
#define Gs4 20
#define A_4 21
#define As4 22
#define B_4 23
#define C_5 24
#define Cs5 25
#define D_5 26
#define Ds5 27
#define E_5 28
#define F_5 29
#define Fs5 30
#define G_5 31
#define Gs5 32
#define A_5 33
#define As5 34
#define B_5 35
#define C_6 36
#define Cs6 37
#define D_6 38
#define Ds6 39
#define E_6 40
#define F_6 41
#define Fs6 42
#define G_6 43
#define Gs6 44
#define A_6 45
#define As6 46
#define B_6 47
#define C_7 48
#define Cs7 49
#define D_7 50
#define Ds7 51
#define E_7 52
#define F_7 53
#define Fs7 54
#define G_7 55
#define Gs7 56
#define A_7 57
#define As7 58
#define B_7 59
#define C_8 60
#define Cs8 61
#define D_8 62
#define Ds8 63
#define E_8 64
#define F_8 65
#define Fs8 66
#define G_8 67
#define Gs8 68
#define A_8 69
#define As8 70
#define B_8 71
#define LAST_NOTE 72
#define ___ 90
typedef void (*hUGERoutine_t)(unsigned char param, unsigned char ch, unsigned char tick);
typedef struct hUGESong_t {
unsigned char tempo;
const unsigned char * order_cnt;
const unsigned char ** order1, ** order2, ** order3, ** order4;
const unsigned char * duty_instruments, * wave_instruments, * noise_instruments;
const hUGERoutine_t ** routines;
const unsigned char * waves;
} hUGESong_t;
// initialize the driver with song data
void hUGE_init(const hUGESong_t * song);
void hUGE_init_banked(const hUGESong_t * song) __banked;
// driver routine
void hUGE_dosound();
void hUGE_dosound_banked() __banked;
enum hUGE_channel_t {HT_CH1 = 0, HT_CH2, HT_CH3, HT_CH4};
enum hUGE_mute_t {HT_CH_PLAY = 0, HT_CH_MUTE};
void hUGE_mute_channel(enum hUGE_channel_t ch, enum hUGE_mute_t mute);
void hUGE_mute_channel_banked(enum hUGE_channel_t ch, enum hUGE_mute_t mute) __banked;
void hUGE_set_position(unsigned char pattern);
void hUGE_set_position_banked(unsigned char pattern) __banked;
extern volatile unsigned char hUGE_current_wave;
#define hUGE_NO_WAVE 100
inline void hUGE_reset_wave() {
hUGE_current_wave = hUGE_NO_WAVE;
}
inline void hUGE_reset_wave_banked() {
hUGE_current_wave = hUGE_NO_WAVE;
}
#endif

+ 7
- 0
src/main.c View File

@ -14,6 +14,7 @@ void main() {
oam_init();
vram_init();
audio_init();
// Set up background & sprites
rBGP = 0b11100100;
@ -25,6 +26,12 @@ void main() {
// handling. We only do this so HALT waits for VBLANK.
rIF = 0;
rIE = IE_VBLANK;
// rIE = IE_VBLANK | IE_LCDC;
// rSTAT |= STAT_LYCF;
// rLYC = 0;
ENABLE_INTERRUPTS();
while (1) {
switch (game_state) {

+ 2
- 2
src/map.c View File

@ -32,8 +32,8 @@ void map_load(map_t *map) {
rSCY = INIT_SCY;
PLAYER.x = (MAP.spawn_x - MAP.camera_x) * 8;
uint8_t y = (MAP.spawn_y - MAP.camera_y) * 8;
PLAYER.y = y << 8;
PLAYER.y_hi = (MAP.spawn_y - MAP.camera_y) * 8;
PLAYER.y_lo = 0;
memcpy(VRAM_TILE_PTR(TILE_INDEX_BACKGROUND), (uint8_t *)MAP.tile_ptr,
MAP.tile_size);

+ 22
- 4
src/player.c View File

@ -13,30 +13,48 @@
#define PLAYER_INIT_FALL_VY 0xff1a //!< -1.1015625
#define MAX_VY 0xf900 //!< -7.0
#define SWITCH_ANIM_STATE(state) \
do { \
PLAYER_ACTOR->anim = (state); \
PLAYER_ACTOR->frame_counter = 0; \
PLAYER_ACTOR->frame_idx = 0; \
} while (0)
player_t PLAYER;
ASSET(player_tiles, "player.2bpp");
ASSET(player_map, "player.map");
void player_init(void) {
PLAYER.state = PLAYER_STATE_STAND;
memcpy(VRAM_TILE_PTR(TILE_INDEX_PLAYER), &player_tiles[0],
player_tiles_end - player_tiles);
}
void player_update(void) {
if ((joypad_pressed & PAD_UP) && PLAYER.state != PLAYER_STATE_JUMP) {
SWITCH_ANIM_STATE(ANIM_JUMP);
PLAYER.state = PLAYER_STATE_JUMP;
PLAYER.vy = PLAYER_INIT_JUMP_VY;
}
if (PLAYER.state == PLAYER_STATE_JUMP) {
PLAYER.vy -= GRAVITY;
PLAYER.y -= PLAYER.vy;
*((uint16_t*)&PLAYER.y_lo) -= PLAYER.vy;
if (player_bg_collides()) {
PLAYER.y += PLAYER.vy;
if (PLAYER.vy & (1 << 15)) {
PLAYER.state = PLAYER_STATE_WALK;
PLAYER.y_hi--;
while (player_bg_collides()) {
PLAYER.y_hi--;
}
SWITCH_ANIM_STATE(ANIM_STAND);
PLAYER.state = PLAYER_STATE_STAND;
} else {
PLAYER.y_hi++;
while (player_bg_collides()) {
PLAYER.y_hi++;
}
}
PLAYER.vy = 0;
}
@ -62,5 +80,5 @@ void player_update(void) {
}
PLAYER_ACTOR->x = PLAYER.x;
PLAYER_ACTOR->y = PLAYER.y >> 8;
PLAYER_ACTOR->y = PLAYER.y_hi;
}

+ 2
- 1
src/player.h View File

@ -13,7 +13,8 @@ typedef enum {
typedef struct {
uint8_t x;
uint16_t y;
uint8_t y_lo;
uint8_t y_hi;
uint16_t vy;
uint8_t dir;
uint8_t state;

+ 634
- 0
src/songs/title.asm View File

@ -0,0 +1,634 @@
include "huge.inc"
SECTION "Song Data", ROMX
_song_title::
song_title::
db 7
dw order_cnt
dw order1, order2, order3, order4
dw duty_instruments, wave_instruments, noise_instruments
dw routines
dw waves
order_cnt: db 14
order1: dw P0,P4,P0,P4,P0,P0,P0
order2: dw P1,P2,P1,P2,P5,P5,P1
order3: dw P10,P10,P10,P10,P10,P10,P10
order4: dw P10,P3,P3,P3,P3,P3,P10
P0:
dn D_3,1,$000
dn ___,0,$000
dn D_3,1,$C00
dn ___,0,$000
dn D_4,1,$000
dn ___,0,$000
dn D_4,1,$C00
dn ___,0,$000
dn D_5,1,$000
dn ___,0,$000
dn D_5,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn D#3,1,$000
dn ___,0,$000
dn D#3,1,$C00
dn ___,0,$000
dn D#4,1,$000
dn ___,0,$000
dn D#4,1,$C00
dn ___,0,$000
dn D#5,1,$000
dn ___,0,$000
dn D#5,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn D_3,1,$000
dn ___,0,$000
dn D_3,1,$C00
dn ___,0,$000
dn D_4,1,$000
dn ___,0,$000
dn D_4,1,$C00
dn ___,0,$000
dn D_5,1,$000
dn ___,0,$000
dn D_5,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn D#3,1,$000
dn ___,0,$000
dn D#3,1,$C00
dn ___,0,$000
dn D#4,1,$000
dn ___,0,$000
dn D#4,1,$C00
dn ___,0,$000
dn D#5,1,$000
dn ___,0,$000
dn D#5,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
P1:
dn C_4,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn F_4,1,$000
dn ___,0,$000
dn F_4,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn D_5,1,$000
dn ___,0,$000
dn C_5,1,$000
dn ___,0,$000
dn F_4,1,$000
dn ___,0,$000
dn F_4,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn F_4,1,$000
dn ___,0,$000
dn F_4,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn A#3,1,$000
dn ___,0,$000
dn C_4,1,$000
dn ___,0,$000
P2:
dn D_4,1,$000
dn ___,0,$000
dn D_4,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn D_4,1,$000
dn ___,0,$000
dn D_4,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn C_4,1,$000
dn ___,0,$000
dn C_4,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn C_3,1,$000
dn ___,0,$000
dn D_3,1,$000
dn ___,0,$000
dn D_3,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
P3:
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn C_5,1,$000
dn C_5,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn C_5,1,$000
dn C_5,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn C_5,1,$000
dn C_5,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn C_5,1,$000
dn C_5,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn C_5,1,$000
dn C_5,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn C_5,1,$000
dn C_5,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn C_5,1,$000
dn C_5,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn C_5,1,$000
dn C_5,1,$C00
P4:
dn D_3,1,$000
dn ___,0,$000
dn D_3,1,$C00
dn ___,0,$000
dn D_4,1,$000
dn ___,0,$000
dn D_4,1,$C00
dn ___,0,$000
dn D_5,1,$000
dn ___,0,$000
dn D_5,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn D#3,1,$000
dn ___,0,$000
dn D#3,1,$C00
dn ___,0,$000
dn D#4,1,$000
dn ___,0,$000
dn D#4,1,$C00
dn ___,0,$000
dn D#5,1,$000
dn ___,0,$000
dn D#5,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn D_3,1,$000
dn ___,0,$000
dn D_3,1,$C00
dn ___,0,$000
dn D_4,1,$000
dn ___,0,$000
dn D_4,1,$C00
dn ___,0,$000
dn D_5,1,$000
dn ___,0,$000
dn D_5,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn D#3,1,$000
dn ___,0,$000
dn D#3,1,$C00
dn ___,0,$000
dn D#4,1,$000
dn ___,0,$000
dn D#4,1,$C00
dn ___,0,$000
dn D#4,1,$000
dn ___,0,$000
dn D_4,1,$000
dn ___,0,$000
dn C_4,1,$000
dn ___,0,$000
dn C_4,1,$C00
dn ___,0,$000
P5:
dn G_6,1,$000
dn ___,0,$000
dn G#6,1,$000
dn ___,0,$000
dn A#6,1,$000
dn ___,0,$000
dn G#6,1,$000
dn ___,0,$000
dn G#6,1,$000
dn ___,0,$000
dn A#6,1,$000
dn ___,0,$000
dn G#6,1,$000
dn ___,0,$000
dn G_6,1,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn G_6,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn G_6,1,$000
dn ___,0,$000
dn G#6,1,$000
dn ___,0,$000
dn A#6,1,$000
dn ___,0,$000
dn G#6,1,$000
dn ___,0,$000
dn G#6,1,$000
dn ___,0,$000
dn A#6,1,$000
dn ___,0,$000
dn G#6,1,$000
dn ___,0,$000
dn G_6,1,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn D#6,1,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn D#6,1,$C00
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
P10:
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
dn ___,0,$000
duty_instruments:
itSquareinst1: db 8,0,240,128
itSquareinst2: db 8,64,240,128
itSquareinst3: db 8,128,240,128
itSquareinst4: db 8,192,240,128
itSquareinst5: db 8,0,241,128
itSquareinst6: db 8,64,241,128
itSquareinst7: db 8,128,241,128
itSquareinst8: db 8,192,241,128
itSquareinst9: db 8,128,240,128
itSquareinst10: db 8,128,240,128
itSquareinst11: db 8,128,240,128
itSquareinst12: db 8,128,240,128
itSquareinst13: db 8,128,240,128
itSquareinst14: db 8,128,240,128
itSquareinst15: db 8,128,240,128
wave_instruments:
itWaveinst1: db 0,32,0,128
itWaveinst2: db 0,32,1,128
itWaveinst3: db 0,32,2,128
itWaveinst4: db 0,32,3,128
itWaveinst5: db 0,32,4,128
itWaveinst6: db 0,32,5,128
itWaveinst7: db 0,32,6,128
itWaveinst8: db 0,32,7,128
itWaveinst9: db 0,32,8,128
itWaveinst10: db 0,32,9,128
itWaveinst11: db 0,32,10,128
itWaveinst12: db 0,32,11,128
itWaveinst13: db 0,32,12,128
itWaveinst14: db 0,32,13,128
itWaveinst15: db 0,32,14,128
noise_instruments:
itNoiseinst1: db 240,0,-31,32,-31,32,-31,32
itNoiseinst2: db 240,0,0,0,0,0,0,0
itNoiseinst3: db 240,0,0,0,0,0,0,0
itNoiseinst4: db 240,0,0,0,0,0,0,0
itNoiseinst5: db 240,0,0,0,0,0,0,0
itNoiseinst6: db 240,0,0,0,0,0,0,0
itNoiseinst7: db 240,0,0,0,0,0,0,0
itNoiseinst8: db 240,0,0,0,0,0,0,0
itNoiseinst9: db 240,0,0,0,0,0,0,0
itNoiseinst10: db 240,0,0,0,0,0,0,0
itNoiseinst11: db 240,0,0,0,0,0,0,0
itNoiseinst12: db 240,0,0,0,0,0,0,0
itNoiseinst13: db 240,0,0,0,0,0,0,0
itNoiseinst14: db 240,0,0,0,0,0,0,0
itNoiseinst15: db 240,0,0,0,0,0,0,0
routines:
__hUGE_Routine_0:
__end_hUGE_Routine_0:
ret
__hUGE_Routine_1:
__end_hUGE_Routine_1:
ret
__hUGE_Routine_2:
__end_hUGE_Routine_2:
ret
__hUGE_Routine_3:
__end_hUGE_Routine_3:
ret
__hUGE_Routine_4:
__end_hUGE_Routine_4:
ret
__hUGE_Routine_5:
__end_hUGE_Routine_5:
ret
__hUGE_Routine_6:
__end_hUGE_Routine_6:
ret
__hUGE_Routine_7:
__end_hUGE_Routine_7:
ret
__hUGE_Routine_8:
__end_hUGE_Routine_8:
ret
__hUGE_Routine_9:
__end_hUGE_Routine_9:
ret
__hUGE_Routine_10:
__end_hUGE_Routine_10:
ret
__hUGE_Routine_11:
__end_hUGE_Routine_11:
ret
__hUGE_Routine_12:
__end_hUGE_Routine_12:
ret
__hUGE_Routine_13:
__end_hUGE_Routine_13:
ret
__hUGE_Routine_14:
__end_hUGE_Routine_14:
ret
__hUGE_Routine_15:
__end_hUGE_Routine_15:
ret
waves:
wave0: db 0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255
wave1: db 0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255
wave2: db 0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255
wave3: db 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255
wave4: db 0,1,18,35,52,69,86,103,120,137,154,171,188,205,222,239
wave5: db 254,220,186,152,118,84,50,16,18,52,86,120,154,188,222,255
wave6: db 122,205,219,117,33,19,104,189,220,151,65,1,71,156,221,184
wave7: db 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15
wave8: db 254,252,250,248,246,244,242,240,242,244,246,248,250,252,254,255
wave9: db 254,221,204,187,170,153,136,119,138,189,241,36,87,138,189,238
wave10: db 132,17,97,237,87,71,90,173,206,163,23,121,221,32,3,71
wave11: db 9,221,121,137,227,27,203,59,32,190,49,4,32,179,160,158
wave12: db 133,46,98,136,183,66,205,189,100,23,57,24,54,125,115,25
wave13: db 199,94,4,173,222,87,147,208,0,54,220,214,5,148,23,131
wave14: db 153,183,37,42,197,106,210,23,133,41,236,167,30,208,14,204
wave15: db 58,64,136,231,133,42,212,220,193,158,147,235,125,194,86,57

+ 5
- 0
src/title.c View File

@ -1,6 +1,7 @@
#include <string.h>
#include "game.h"
#include "hugedriver.h"
#include "sdk/assets.h"
#include "sdk/hardware.h"
#include "sdk/joypad.h"
@ -37,5 +38,9 @@ void title(void) {
// Wait for VBLANK. Clear IF since global interrupts are disabled.
HALT();
rIF = 0;
hUGE_dosound();
}
audio_reset();
}

Loading…
Cancel
Save