Skip to content
This repository has been archived by the owner on Jun 5, 2022. It is now read-only.

Commit

Permalink
Can display and animate the snowfox sprite with tail
Browse files Browse the repository at this point in the history
  • Loading branch information
InvisibleUp committed Jun 17, 2018
1 parent 8c0a4ea commit be99d97
Show file tree
Hide file tree
Showing 9 changed files with 523 additions and 34 deletions.
2 changes: 1 addition & 1 deletion build.bat
@@ -1,5 +1,5 @@
@echo off
for %%f in (gfx/*.png) do rgbds\rgbgfx -o gfx/bin/%%f.bin gfx/%%f
for %%f in (gfx/*.png) do rgbds\rgbgfx -h -o gfx/bin/%%f.bin gfx/%%f
if %errorlevel% neq 0 call :exit 1
rgbds\rgbasm -ogame.obj .\src\main.z80
if %errorlevel% neq 0 call :exit 1
Expand Down
2 changes: 1 addition & 1 deletion src/display.z80
Expand Up @@ -26,6 +26,6 @@ EnableLCD:

InitDisplay:
ld a, GB_LCD_CTRL_ON | GB_LCD_CTRL_BG_ON | GB_LCD_CTRL_OBJ_ON | \
GB_LCD_CTRL_OBJ_8x8 | GB_LCD_CTRL_BG_MAP1 | GB_LCD_CTRL_TILESET1
GB_LCD_CTRL_OBJ_8x16 | GB_LCD_CTRL_BG_MAP1 | GB_LCD_CTRL_TILESET1
ld [GB_LCD_CTRL],a
ret
8 changes: 4 additions & 4 deletions src/gameboy.z80
Expand Up @@ -366,10 +366,10 @@ GB_LINK_CTRL_CLOCK_INTERNAL EQU $01
GB_LINK_CTRL_CLOCK_EXTERNAL EQU $00

; Timer.
gb_timer_divider EQU $FF04
gb_timer_counter EQU $FF05
gb_timer_modulo EQU $FF06
gb_timer_ctrl EQU $FF07
GB_TIMER_DIVIDER EQU $FF04
GB_TIMER_COUNTER EQU $FF05
GB_TIMER_MODULO EQU $FF06
GB_TIMER_CTRL EQU $FF07

GB_TIMER_CTRL_STOP EQU $00
GB_TIMER_CTRL_START EQU $04
Expand Down
41 changes: 41 additions & 0 deletions src/gfxinclude.z80
@@ -0,0 +1,41 @@
; GRAPHICS DATA
SECTION "GFX",ROMX,BANK[1]
gfx_start:

gfx_arcticfox_standing:
arcticfox_standing_tile EQU 0
incbin "gfx/bin/arcticfox-standing.png.bin"

gfx_arcticfox_tail0000:
arcticfox_tail_tile EQU ((gfx_arcticfox_tail0000 - gfx_arcticfox_standing) / 16)
incbin "gfx/bin/arcticfox-tail0000.png.bin"

gfx_arcticfox_tail0001:
;arcticfox_tail0001_tile RB (gfx_arcticfox_tail0001 - gfx_arcticfox_tail0000) / 64
incbin "gfx/bin/arcticfox-tail0001.png.bin"

gfx_arcticfox_tail0002:
;arcticfox_tail0002_tile RB (gfx_arcticfox_tail0002 - gfx_arcticfox_tail0001) / 64
incbin "gfx/bin/arcticfox-tail0002.png.bin"

gfx_arcticfox_tail0003:
;arcticfox_tail0003_tile RB (gfx_arcticfox_tail0003 - gfx_arcticfox_tail0002) / 64
incbin "gfx/bin/arcticfox-tail0003.png.bin"

gfx_arcticfox_thinking0000:
arcticfox_thinking_tile EQU arcticfox_tail_tile + ((gfx_arcticfox_thinking0000 - gfx_arcticfox_tail0000) / 16)
;arcticfox_thinking0000_tile RB (gfx_arcticfox_thinking0000 - gfx_arcticfox_tail0003) / 64
incbin "gfx/bin/arcticfox-thinking0000.png.bin"

gfx_arcticfox_thinking0001:
;arcticfox_thinking0001_tile RB (gfx_arcticfox_thinking0001 - gfx_arcticfox_thinking0000) / 64
incbin "gfx/bin/arcticfox-thinking0001.png.bin"

gfx_gecko_standing:
incbin "gfx/bin/gecko-standing.png.bin"
gfx_gecko_thinking0000:
incbin "gfx/bin/gecko-thinking0000.png.bin"
gfx_gecko_thinking0001:
incbin "gfx/bin/gecko-thinking0001.png.bin"
gfx_end:
SECTION "ENDGFX",ROM0
2 changes: 1 addition & 1 deletion src/header.z80
Expand Up @@ -25,7 +25,7 @@ SECTION "vblank",ROM0[$40]
SECTION "lcdc",ROM0[$48]
reti
SECTION "timer",ROM0[$50]
reti
jp timer
SECTION "serial",ROM0[$58]
reti
SECTION "joypad",ROM0[$60]
Expand Down
118 changes: 92 additions & 26 deletions src/main.z80
Expand Up @@ -2,32 +2,85 @@ include "src/constants.z80"
include "src/variables.z80"
include "src/gameboy.z80" ; GB constants

SECTION "rom", ROM0
include "src/header.z80" ; ROM header

; Core Libraries
include "src/memory.z80"
include "src/display.z80"
include "src/math.z80"

; Game stuff
include "src/gfxinclude.z80"
include "src/sprites.z80"

SECTION "main", ROM0
; Interrupt handlers
vblank:
; Jumping here clears vblank flag automatically
;push hl
;ld hl, GB_SCROLL_X
;dec [hl]
;dec [hl]
;ld hl, GB_SCROLL_Y
;dec [hl]
;pop hl

call RenderSprites
reti

timer:
push hl
ld hl, GB_SCROLL_X
dec [hl]
dec [hl]
ld hl, GB_SCROLL_Y
dec [hl]
push bc
push af

ld hl, GlobalTimer
inc [hl]
ld b, [hl]
ld c, $80 + charAnimSpeed
and a, 8

.objloop:
ld a, [$ff00+c] ; A = timer speed
sub a, 0
jr z, .updateobjtimer

ld h, a
.shiftloop:
srl b
jr nc, .objloop_checkdone ; If all bits are not 1, don't update
dec h
jr nz, .shiftloop

.updateobjtimer
inc c
ld a, [$ff00+c] ; A = timer
inc a
ld [$ff00+c], a
dec c

.objloop_checkdone:
ld a, charSizeOf
add a, c
ld c, a
ld a, $80 + (charStruct_end - charStruct) + charAnimSpeed
cp a, c
jr nz, .objloop

pop af
pop bc
pop hl
reti

; Main Loop
main:
; Set interrupts
; Set interrupts and timers
xor a
ld [GB_INTERRUPT_FLAG], a
ld a, GB_INTERRUPT_VBLANK
ld [GB_TIMER_MODULO], a
ld a, GB_INTERRUPT_VBLANK | GB_INTERRUPT_TIMER
ld [GB_INTERRUPT_ENABLE], a
ld a, GB_TIMER_CTRL_START | GB_TIMER_CTRL_CLOCK_4096
ld [GB_TIMER_CTRL], a

; Set stack to top of HiRAM
ld sp, $FFFE
Expand All @@ -39,14 +92,27 @@ main:
ld a, %11100100
ld [GB_PALETTE_BG], a
ld [GB_PALETTE_OBJ1], a
; Light palette
rlca
rlca
ld [GB_PALETTE_OBJ2], a

; Set scroll position
xor a
ld [GB_SCROLL_X], a
ld [GB_SCROLL_Y], a

; Clear VRAM
; Clear RAM and VRAM
ld hl, $C000
ld bc, WramEnd - $C000
xor a
call memset

ld hl, charStruct
ld bc, charStruct_end - charStruct
xor a
call memset

ld hl, $8000
ld bc, $9FFF - $8000
ld a, $FF
Expand All @@ -58,15 +124,24 @@ main:
call memset

; Load graphics
ld hl, .testgfx
ld de, $9000
ld bc, 704
ld hl, gfx_start
ld de, GB_RAM_TILE
ld bc, gfx_end - gfx_start
call memcpy

ld hl, .testgfxmap
ld de, GB_RAM_MAP
ld bc, 32*4
call memcpy
; Make a dummy object
ld c, $80
ld a, %11000000
ld [$ff00+c], a
inc c
ld a, 64
ld [$ff00+c], a
inc c
xor a
ld [$ff00+c], a
inc c
ld a, 64
ld [$ff00+c], a

; Init display
call InitDisplay
Expand All @@ -75,13 +150,4 @@ main:
.loop:
halt
jr .loop

.testgfx:
incbin "gfx/gfx.bin"
.testgfxmap:
DB $0,$1,$2,$3,$4,$5,$6,$7,$8,$9,$A,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
DB $B,$C,$D,$E,$F,$10,$11,$12,$13,$14,$15,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
DB $16,$17,$18,$19,$1A,$1B,$1C,$1D,$1E,$1F,$20,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
DB $21,$22,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF


; End Main
93 changes: 93 additions & 0 deletions src/math.z80
@@ -0,0 +1,93 @@
; http://map.grauw.nl/articles/mult_div_shifts.php

;Multiply 8-bit values
;In: Multiply H with E
;Out: HL = result
;Clobbers: d, b, l
Mult8:
ld d,0
ld l,d
ld b,8
Mult8_Loop:
add hl,hl
jr nc,Mult8_NoAdd
add hl,de
Mult8_NoAdd:
dec b
jr nz, Mult8_Loop
ret


;
;Multiply 8-bit value with a 16-bit value
;In: Multiply A with DE
;Out: HL = result
;Clobbers: B
Mult12: ld l,0
ld b,8
Mult12_Loop:
add hl,hl
add a,a
jr nc,Mult12_NoAdd
add hl,de
Mult12_NoAdd:
dec b
jr nz, Mult12_Loop
ret


;
;Multiply 16-bit values (with 16-bit result)
;In: Multiply BC with DE
;Out: HL = result
;
Mult16: ld a,b
ld b,16
Mult16_Loop:
add hl,hl
sla c
rla
jr nc,Mult16_NoAdd
add hl,de
Mult16_NoAdd:
dec b
jr nz, Mult16_Loop
ret


;
;Multiply 16-bit values (with 32-bit result)
;In: Multiply BC with DE
;Out: BCHL = result
;
Mult32: ld a,c
ld c,b
ld hl,0
ld b,16
Mult32_Loop:
add hl,hl
rla
rl c
jr nc,Mult32_NoAdd
add hl,de
adc a,0
jr nc,Mult32_NoAdd
inc c
Mult32_NoAdd:
dec b
jr nz, Mult32_Loop
ld b,c
ld c,a
ret

NegateHL: MACRO
ld a, 255
xor a, h
ld h, a

ld a, 255
xor a, l
ld l, a

inc hl
ENDM

0 comments on commit be99d97

Please sign in to comment.