mid-kid
4 years ago
commit
72b1ab6035
21 changed files with 1018 additions and 0 deletions
@ -0,0 +1,5 @@ |
|||||
|
--languages=asm |
||||
|
--langmap=asm:.asm.inc |
||||
|
--regex-asm=/^([a-z0-9_]+):+.*/\1/l,labels/i |
||||
|
--regex-asm=/^([a-z0-9_]+)\s+=.*/\1/c,constants/i |
||||
|
--regex-asm=/^([a-z0-9_]+)\s+[Ee][Qq][Uu][Ss]?.*/\1/c,constants/i |
@ -0,0 +1,3 @@ |
|||||
|
if expand("<afile>:e") ==? 'asm' || expand("<afile>:e") ==? 'inc' || expand("<afile>:e") ==? 'link' |
||||
|
setf rgbds |
||||
|
endif |
@ -0,0 +1,7 @@ |
|||||
|
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ |
||||
|
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ |
||||
|
!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/ |
||||
|
!_TAG_PROGRAM_AUTHOR Universal Ctags Team // |
||||
|
!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/ |
||||
|
!_TAG_PROGRAM_URL https://ctags.io/ /official site/ |
||||
|
!_TAG_PROGRAM_VERSION 0.0.0 // |
@ -0,0 +1,56 @@ |
|||||
|
name := Something |
||||
|
|
||||
|
dir_build := build |
||||
|
dir_source := source |
||||
|
dir_assets := assets |
||||
|
|
||||
|
RGBASM := rgbasm |
||||
|
RGBGFX := rgbgfx |
||||
|
RGBLINK := rgblink |
||||
|
RGBFIX := rgbfix |
||||
|
|
||||
|
RGBASMFLAGS := -p 0xff -L |
||||
|
RGBLINKFLAGS := -p 0xff -d -t |
||||
|
RGBFIXFLAGS := -p 0xff -j -m 0 -r 0 -n 0 -k "HB" -i "SMTH" -t "Something" |
||||
|
|
||||
|
rwildcard = $(foreach d, $(wildcard $1*), $(filter $(subst *, %, $2), $d) $(call rwildcard, $d/, $2)) |
||||
|
objects := $(patsubst $(dir_source)/%.asm, $(dir_build)/%.o, $(call rwildcard, $(dir_source)/, *.asm)) |
||||
|
|
||||
|
RGBASMFLAGS += -DENABLE_CGB #-DENABLE_CLEAR |
||||
|
RGBFIXFLAGS += -c |
||||
|
|
||||
|
.SECONDEXPANSION: |
||||
|
|
||||
|
.PHONY: all |
||||
|
all: $(name).gb |
||||
|
|
||||
|
.PHONY: clean |
||||
|
clean: |
||||
|
rm -rf $(name).gb $(name).sym $(name).map $(dir_build) |
||||
|
|
||||
|
$(name).gb: $(objects) |
||||
|
|
||||
|
%.gb: layout.link |
||||
|
$(RGBLINK) $(RGBLINKFLAGS) -l $< -n $(@:.gb=.sym) -m $(@:.gb=.map) -o $@ $(filter-out $<, $^) |
||||
|
$(RGBFIX) $(RGBFIXFLAGS) -v $@ |
||||
|
|
||||
|
$(dir_build)/%.o: $(dir_source)/%.asm | $$(dir $$@) |
||||
|
$(RGBASM) $(RGBASMFLAGS) -i $(dir_build)/ -i $(dir_source)/ -M $(@:.o=.d) -o $@ $< |
||||
|
|
||||
|
$(dir_build)/%.pal: $(dir_assets)/%.png | $$(dir $$@) |
||||
|
$(RGBGFX) -p $@ $< |
||||
|
|
||||
|
$(dir_build)/%.tilemap: $(dir_assets)/%.png | $$(dir $$@) |
||||
|
$(RGBGFX) -u -t $@ $< |
||||
|
|
||||
|
$(dir_build)/%.2bpp: $(dir_assets)/%.png | $$(dir $$@) |
||||
|
$(RGBGFX) -u -o $@ $< |
||||
|
|
||||
|
$(dir_build)/%.1bpp: $(dir_assets)/%.png | $$(dir $$@) |
||||
|
$(RGBGFX) -d 1 -u -o $@ $< |
||||
|
|
||||
|
.PRECIOUS: %/ |
||||
|
%/: |
||||
|
mkdir -p $@ |
||||
|
|
||||
|
-include $(patsubst %.o, %.d, $(objects)) |
Binary file not shown.
After Width: | Height: | Size: 308 B |
@ -0,0 +1,12 @@ |
|||||
|
rom0 |
||||
|
org $40 |
||||
|
"home/vblank.asm@int40" |
||||
|
org $58 |
||||
|
"home/serial.asm@int58" |
||||
|
org $100 |
||||
|
"home/start.asm" |
||||
|
wram0 |
||||
|
"home/start.asm@wram0" |
||||
|
vram 0 |
||||
|
org $9800 |
||||
|
"home/video.asm@vram" |
@ -0,0 +1,58 @@ |
|||||
|
; vim:set syn=asm: |
||||
|
|
||||
|
if 0 ;!def(_charmap_inc_) |
||||
|
_charmap_inc_ equ 0 |
||||
|
|
||||
|
char: macro |
||||
|
charmap \1, x |
||||
|
x = x + 1 |
||||
|
endm |
||||
|
|
||||
|
x = 0 |
||||
|
char " " |
||||
|
char "0" |
||||
|
char "1" |
||||
|
char "2" |
||||
|
char "3" |
||||
|
char "4" |
||||
|
char "5" |
||||
|
char "6" |
||||
|
char "7" |
||||
|
char "8" |
||||
|
char "9" |
||||
|
char "A" |
||||
|
char "B" |
||||
|
char "C" |
||||
|
char "D" |
||||
|
char "E" |
||||
|
char "F" |
||||
|
char "G" |
||||
|
char "H" |
||||
|
char "I" |
||||
|
char "J" |
||||
|
char "K" |
||||
|
char "L" |
||||
|
char "M" |
||||
|
char "N" |
||||
|
char "O" |
||||
|
char "P" |
||||
|
char "Q" |
||||
|
char "R" |
||||
|
char "S" |
||||
|
char "T" |
||||
|
char "U" |
||||
|
char "V" |
||||
|
char "W" |
||||
|
char "X" |
||||
|
char "Y" |
||||
|
char "Z" |
||||
|
char "." |
||||
|
char "-" |
||||
|
|
||||
|
charmap "$", $ff |
||||
|
|
||||
|
dstr: macro |
||||
|
db \1, "$" |
||||
|
endm |
||||
|
|
||||
|
endc |
@ -0,0 +1,45 @@ |
|||||
|
if !def(_defines_inc_) |
||||
|
_defines_inc_ equ 0 |
||||
|
|
||||
|
bits: macro |
||||
|
; Defines a _f constant and a mask constant for one |
||||
|
; or multiple bits in a byte. |
||||
|
|
||||
|
if _NARG < 2 |
||||
|
\1_f rb 1 |
||||
|
\1 equ 1 << \1_f |
||||
|
else |
||||
|
\1_f rb \2 |
||||
|
x = 0 |
||||
|
rept \2 |
||||
|
x = x << 1 | 1 |
||||
|
endr |
||||
|
\1 equ x << \1_f |
||||
|
endc |
||||
|
endm |
||||
|
|
||||
|
enum: macro |
||||
|
\1 rb 1 |
||||
|
endm |
||||
|
|
||||
|
; h_console |
||||
|
rsreset |
||||
|
enum console_dmg |
||||
|
enum console_mgb |
||||
|
enum console_cgb |
||||
|
enum console_agb |
||||
|
|
||||
|
; h_joypad |
||||
|
rsreset |
||||
|
bits joy_a |
||||
|
bits joy_b |
||||
|
bits joy_select |
||||
|
bits joy_start |
||||
|
bits joy_right |
||||
|
bits joy_left |
||||
|
bits joy_up |
||||
|
bits joy_down |
||||
|
joy_buttons equ joy_a | joy_b | joy_select | joy_start |
||||
|
joy_dpad equ joy_right | joy_left | joy_up | joy_down |
||||
|
|
||||
|
endc |
@ -0,0 +1,103 @@ |
|||||
|
if !def(_hardware_inc_) |
||||
|
_hardware_inc_ equ 0 |
||||
|
|
||||
|
include "defines.inc" |
||||
|
|
||||
|
; Memory map |
||||
|
rsreset |
||||
|
mmap_rom0 rb $4000 |
||||
|
mmap_rom0_end rb 0 |
||||
|
mmap_romx rb $4000 |
||||
|
mmap_romx_end rb 0 |
||||
|
mmap_vram rb $2000 |
||||
|
mmap_vram_end rb 0 |
||||
|
mmap_sram rb $2000 |
||||
|
mmap_sram_end rb 0 |
||||
|
mmap_wram0 rb $1000 |
||||
|
mmap_wram0_end rb 0 |
||||
|
mmap_wramx rb $1000 |
||||
|
mmap_wramx_end rb 0 |
||||
|
mmap_echo rb $1e00 |
||||
|
mmap_echo_end rb 0 |
||||
|
mmap_oam rb $a0 |
||||
|
mmap_oam_end rb 0 |
||||
|
mmap_nu rb $60 |
||||
|
mmap_nu_end rb 0 |
||||
|
mmap_io rb $80 |
||||
|
mmap_io_end rb 0 |
||||
|
mmap_hram rb $7f |
||||
|
mmap_hram_end rb 0 |
||||
|
|
||||
|
rsreset |
||||
|
r_joyp equ $ff00 |
||||
|
bits r_joyp_data, 4 |
||||
|
bits r_joyp_select, 2 |
||||
|
r_joyp_select_dpad equ %10 << r_joyp_select_f |
||||
|
r_joyp_select_buttons equ %01 << r_joyp_select_f |
||||
|
|
||||
|
r_sb equ $ff01 |
||||
|
|
||||
|
rsreset |
||||
|
r_sc equ $ff02 |
||||
|
bits r_sc_clk_internal |
||||
|
bits r_sc_clk_fast |
||||
|
rsset _RS + 5 |
||||
|
bits r_sc_start |
||||
|
|
||||
|
rsreset |
||||
|
r_if equ $ff0f |
||||
|
r_ie equ $ffff |
||||
|
bits r_int_vblank |
||||
|
bits r_int_stat |
||||
|
bits r_int_timer |
||||
|
bits r_int_serial |
||||
|
bits r_int_joypad |
||||
|
|
||||
|
rsreset |
||||
|
r_nr52 equ $ff26 |
||||
|
bits r_nr52_ch1 |
||||
|
bits r_nr52_ch2 |
||||
|
bits r_nr52_ch3 |
||||
|
bits r_nr52_ch4 |
||||
|
rsset _RS + 3 |
||||
|
bits r_nr52_on |
||||
|
|
||||
|
rsreset |
||||
|
r_lcdc equ $ff40 |
||||
|
bits r_lcdc_bg_on |
||||
|
bits r_lcdc_obj_on |
||||
|
bits r_lcdc_obj_big |
||||
|
bits r_lcdc_bg_map_high |
||||
|
bits r_lcdc_tiles_low |
||||
|
bits r_lcdc_window_on |
||||
|
bits r_lcdc_window_map_high |
||||
|
bits r_lcdc_on |
||||
|
|
||||
|
rsreset |
||||
|
r_stat equ $ff41 |
||||
|
bits r_stat_mode, 2 |
||||
|
bits r_stat_lyc_match |
||||
|
bits r_stat_int_hblank |
||||
|
bits r_stat_int_vblank |
||||
|
bits r_stat_int_oam |
||||
|
bits r_stat_int_lyc |
||||
|
r_stat_mode_hblank equ 0 << r_stat_mode_f |
||||
|
r_stat_mode_vblank equ 1 << r_stat_mode_f |
||||
|
r_stat_mode_oam equ 2 << r_stat_mode_f |
||||
|
r_stat_mode_vram equ 3 << r_stat_mode_f |
||||
|
|
||||
|
r_ly equ $ff44 |
||||
|
r_ly_vblank equ 144 |
||||
|
|
||||
|
rsreset |
||||
|
r_bcps equ $ff68 |
||||
|
bits r_bcps_offs, 3 |
||||
|
bits r_bcps_pal, 3 |
||||
|
rsset _RS + 1 |
||||
|
bits r_bcps_inc |
||||
|
|
||||
|
r_bcpd equ $ff69 |
||||
|
|
||||
|
r_svbk equ $ff70 |
||||
|
|
||||
|
endc |
@ -0,0 +1,8 @@ |
|||||
|
include "hardware.inc" |
||||
|
|
||||
|
section "home/audio.asm", rom0 |
||||
|
|
||||
|
audio_disable:: |
||||
|
ld hl, r_nr52 |
||||
|
res r_nr52_on_f, [hl] |
||||
|
ret |
@ -0,0 +1,58 @@ |
|||||
|
include "hardware.inc" |
||||
|
|
||||
|
section "home/joypad.asm@hram", hram |
||||
|
h_joypad: db |
||||
|
h_joypad_down:: db |
||||
|
h_joypad_pressed:: db |
||||
|
h_joypad_released:: db |
||||
|
|
||||
|
section "home/joypad.asm", rom0 |
||||
|
|
||||
|
joypad_read:: |
||||
|
ld a, r_joyp_select_dpad |
||||
|
ldh [r_joyp], a |
||||
|
rept 2 |
||||
|
ldh a, [r_joyp] |
||||
|
endr |
||||
|
|
||||
|
; Save the dpad value to the high nybble |
||||
|
cpl |
||||
|
and r_joyp_data |
||||
|
swap a |
||||
|
ld b, a |
||||
|
|
||||
|
ld a, r_joyp_select_buttons |
||||
|
ldh [r_joyp], a |
||||
|
rept 6 |
||||
|
ldh a, [r_joyp] |
||||
|
endr |
||||
|
|
||||
|
; Save the buttons to the low nybble |
||||
|
cpl |
||||
|
and r_joyp_data |
||||
|
or b |
||||
|
ldh [h_joypad], a |
||||
|
|
||||
|
ld a, r_joyp_select |
||||
|
ldh [r_joyp], a |
||||
|
ret |
||||
|
|
||||
|
joypad_update:: |
||||
|
ldh a, [h_joypad] |
||||
|
ld b, a |
||||
|
ldh a, [h_joypad_down] |
||||
|
ld c, a |
||||
|
|
||||
|
xor b |
||||
|
ld d, a |
||||
|
and c |
||||
|
ldh [h_joypad_released], a |
||||
|
|
||||
|
ld a, d |
||||
|
and b |
||||
|
ldh [h_joypad_pressed], a |
||||
|
|
||||
|
ld a, b |
||||
|
ldh [h_joypad_down], a |
||||
|
|
||||
|
ret |
@ -0,0 +1,24 @@ |
|||||
|
section "home/math.asm", rom0 |
||||
|
|
||||
|
bits_swap:: |
||||
|
ld c, $80 |
||||
|
ld b, a |
||||
|
xor a |
||||
|
.loop |
||||
|
rrc b |
||||
|
jr nc, .skip |
||||
|
or c |
||||
|
.skip |
||||
|
rrc c |
||||
|
jr nc, .loop |
||||
|
ret |
||||
|
|
||||
|
divide:: |
||||
|
ld b, 0 |
||||
|
.loop |
||||
|
inc b |
||||
|
sub c |
||||
|
jr nc, .loop |
||||
|
dec b |
||||
|
add c |
||||
|
ret |
@ -0,0 +1,54 @@ |
|||||
|
section "home/copy.asm", rom0 |
||||
|
|
||||
|
memcpy:: |
||||
|
inc b |
||||
|
inc c |
||||
|
jr .check |
||||
|
|
||||
|
.loop |
||||
|
ld a, [hli] |
||||
|
ld [de], a |
||||
|
inc de |
||||
|
|
||||
|
.check |
||||
|
dec c |
||||
|
jr nz, .loop |
||||
|
dec b |
||||
|
jr nz, .loop |
||||
|
ret |
||||
|
|
||||
|
memcpy_double:: |
||||
|
call swap_hl_de |
||||
|
|
||||
|
inc b |
||||
|
inc c |
||||
|
jr .check |
||||
|
|
||||
|
.loop |
||||
|
ld a, [de] |
||||
|
inc de |
||||
|
ld [hli], a |
||||
|
ld [hli], a |
||||
|
|
||||
|
.check |
||||
|
dec c |
||||
|
jr nz, .loop |
||||
|
dec b |
||||
|
jr nz, .loop |
||||
|
|
||||
|
jp swap_hl_de |
||||
|
|
||||
|
memset:: |
||||
|
inc b |
||||
|
inc c |
||||
|
jr .check |
||||
|
|
||||
|
.loop |
||||
|
ld [hli], a |
||||
|
|
||||
|
.check |
||||
|
dec c |
||||
|
jr nz, .loop |
||||
|
dec b |
||||
|
jr nz, .loop |
||||
|
ret |
@ -0,0 +1,132 @@ |
|||||
|
include "hardware.inc" |
||||
|
|
||||
|
section "home/serial.asm@hram", hram |
||||
|
h_serial_len: dw |
||||
|
h_serial_send_ptr: dw |
||||
|
h_serial_recv_ptr: dw |
||||
|
|
||||
|
section "home/serial.asm@int58", rom0[$58] |
||||
|
push af |
||||
|
push hl |
||||
|
push bc |
||||
|
push de |
||||
|
jp serial_shift_int |
||||
|
|
||||
|
section "home/serial.asm", rom0 |
||||
|
|
||||
|
serial_shift_int: |
||||
|
call serial_shift |
||||
|
pop de |
||||
|
pop bc |
||||
|
pop hl |
||||
|
pop af |
||||
|
reti |
||||
|
|
||||
|
serial_end: |
||||
|
|
||||
|
serial_shift: |
||||
|
ldh a, [h_serial_len + 0] |
||||
|
ld c, a |
||||
|
ldh a, [h_serial_len + 1] |
||||
|
ld b, a |
||||
|
|
||||
|
; End early if we're done |
||||
|
or c |
||||
|
ret z |
||||
|
|
||||
|
ldh a, [h_serial_recv_ptr + 0] |
||||
|
ld e, a |
||||
|
ldh a, [h_serial_recv_ptr + 1] |
||||
|
ld d, a |
||||
|
|
||||
|
; Store the last received byte |
||||
|
or e |
||||
|
jr z, .no_recv |
||||
|
ldh a, [r_sb] |
||||
|
ld [de], a |
||||
|
inc de |
||||
|
.no_recv |
||||
|
|
||||
|
; We've transferred an entire byte in both directions |
||||
|
dec bc |
||||
|
|
||||
|
ldh a, [h_serial_send_ptr + 0] |
||||
|
ld l, a |
||||
|
ldh a, [h_serial_send_ptr + 1] |
||||
|
ld h, a |
||||
|
|
||||
|
; fallthrough |
||||
|
|
||||
|
serial_queue: |
||||
|
; If the length is 0, not much should be done |
||||
|
ld a, b |
||||
|
or c |
||||
|
jr z, .empty |
||||
|
|
||||
|
ld a, h |
||||
|
or l |
||||
|
ld a, -1 |
||||
|
jr z, .no_send |
||||
|
ld a, [hli] |
||||
|
.no_send |
||||
|
ldh [r_sb], a |
||||
|
|
||||
|
ldh a, [r_sc] |
||||
|
set r_sc_start_f, a |
||||
|
jr .store |
||||
|
|
||||
|
.empty |
||||
|
ldh a, [r_sc] |
||||
|
res r_sc_start_f, a |
||||
|
|
||||
|
.store |
||||
|
ldh [r_sc], a |
||||
|
|
||||
|
ld a, c |
||||
|
ldh [h_serial_len + 0], a |
||||
|
ld a, b |
||||
|
ldh [h_serial_len + 1], a |
||||
|
|
||||
|
ld a, e |
||||
|
ldh [h_serial_recv_ptr + 0], a |
||||
|
ld a, d |
||||
|
ldh [h_serial_recv_ptr + 1], a |
||||
|
|
||||
|
ld a, l |
||||
|
ldh [h_serial_send_ptr + 0], a |
||||
|
ld a, h |
||||
|
ldh [h_serial_send_ptr + 1], a |
||||
|
|
||||
|
ret |
||||
|
|
||||
|
serial_finished:: |
||||
|
; ret: z if done, nz if not done |
||||
|
ldh a, [r_sc] |
||||
|
bit r_sc_start_f, a |
||||
|
ret |
||||
|
|
||||
|
serial_transfer:: |
||||
|
; hl: Source buffer |
||||
|
; de: Destination buffer |
||||
|
; bc: Size |
||||
|
; ret: nz if previous transfer is still in transit |
||||
|
call serial_finished |
||||
|
ret nz |
||||
|
jp serial_queue |
||||
|
|
||||
|
serial_init_master:: |
||||
|
ld a, 1 |
||||
|
db $fe ; CP A, n8 |
||||
|
|
||||
|
serial_init_slave:: |
||||
|
xor a |
||||
|
|
||||
|
; fallthrough |
||||
|
|
||||
|
serial_init: |
||||
|
ldh [r_sc], a |
||||
|
|
||||
|
ldh a, [r_ie] |
||||
|
set r_int_serial_f, a |
||||
|
ldh [r_ie], a |
||||
|
ret |
@ -0,0 +1,161 @@ |
|||||
|
include "hardware.inc" |
||||
|
include "defines.inc" |
||||
|
|
||||
|
NULL equ 0 |
||||
|
global NULL |
||||
|
|
||||
|
section "home/start.asm@wram0", wram0 |
||||
|
ds $100 - 1 |
||||
|
w_stack: |
||||
|
ds 1 |
||||
|
|
||||
|
section "home/start.asm@hram", hram |
||||
|
h_console:: db |
||||
|
|
||||
|
section "home/start.asm", rom0[$100] |
||||
|
nop |
||||
|
jp _start |
||||
|
|
||||
|
rept $150 - $104 |
||||
|
db 0 |
||||
|
endr |
||||
|
|
||||
|
_start: |
||||
|
di |
||||
|
|
||||
|
; Attempt to detect console model |
||||
|
cp $ff |
||||
|
jr z, .console_mgb |
||||
|
cp $11 |
||||
|
jr z, .console_cgb |
||||
|
|
||||
|
ld a, console_dmg |
||||
|
jr .console_end |
||||
|
|
||||
|
.console_mgb |
||||
|
ld a, console_mgb |
||||
|
jr .console_end |
||||
|
|
||||
|
.console_cgb |
||||
|
dec b |
||||
|
jr z, .console_agb |
||||
|
ld a, console_cgb |
||||
|
jr .console_end |
||||
|
|
||||
|
.console_agb |
||||
|
ld a, console_agb |
||||
|
|
||||
|
.console_end |
||||
|
ldh [h_console], a |
||||
|
|
||||
|
xor a |
||||
|
ldh [r_ie], a |
||||
|
ldh [r_if], a |
||||
|
|
||||
|
if def(ENABLE_CLEAR) |
||||
|
; Clear wram0 |
||||
|
ld hl, mmap_wram0 |
||||
|
ld bc, mmap_wram0_end - mmap_wram0 |
||||
|
call memset |
||||
|
endc |
||||
|
|
||||
|
ld sp, w_stack |
||||
|
ldh a, [h_console] |
||||
|
push af |
||||
|
|
||||
|
if def(ENABLE_CLEAR) |
||||
|
; Clear the hram and wram1 |
||||
|
xor a |
||||
|
ld hl, mmap_hram |
||||
|
ld bc, mmap_hram_end - mmap_hram |
||||
|
call memset |
||||
|
ld hl, mmap_wramx |
||||
|
ld bc, mmap_wramx_end - mmap_wramx |
||||
|
call memset |
||||
|
endc |
||||
|
|
||||
|
pop af |
||||
|
ldh [h_console], a |
||||
|
|
||||
|
if def(ENABLE_CGB) && def(ENABLE_CLEAR) |
||||
|
; Clear the different wram banks |
||||
|
cp console_cgb |
||||
|
jr c, .end |
||||
|
|
||||
|
ld d, 8 |
||||
|
.cgb_loop |
||||
|
dec d |
||||
|
ld a, d |
||||
|
ldh [r_svbk], a |
||||
|
cp 2 |
||||
|
jr c, .end |
||||
|
|
||||
|
ld hl, mmap_wramx |
||||
|
ld bc, mmap_wramx_end - mmap_wramx |
||||
|
call memset |
||||
|
|
||||
|
jr .cgb_loop |
||||
|
.end |
||||
|
endc |
||||
|
|
||||
|
ei |
||||
|
jp main |
||||
|
|
||||
|
_halt_:: |
||||
|
halt |
||||
|
jr _halt_ |
||||
|
|
||||
|
_stop_:: |
||||
|
; Save registers |
||||
|
ldh a, [r_ie] |
||||
|
ld b, a |
||||
|
ldh a, [r_lcdc] |
||||
|
ld c, a |
||||
|
|
||||
|
; Turn everything off |
||||
|
xor a |
||||
|
ldh [r_ie], a |
||||
|
ldh [r_if], a |
||||
|
ldh [r_joyp], a |
||||
|
call lcd_vblank_wait |
||||
|
xor a |
||||
|
ldh [r_lcdc], a |
||||
|
|
||||
|
; Make sure the joypad doesn't inmediately trigger anything. |
||||
|
ld d, $ff |
||||
|
.wait |
||||
|
ldh a, [r_joyp] |
||||
|
cpl |
||||
|
and r_joyp_data |
||||
|
jr nz, .wait |
||||
|
dec d |
||||
|
jr nz, .wait |
||||
|
|
||||
|
stop |
||||
|
|
||||
|
; Restore registers |
||||
|
ld a, c |
||||
|
ldh [r_lcdc], a |
||||
|
ld a, b |
||||
|
ldh [r_ie], a |
||||
|
ret |
||||
|
|
||||
|
_hl_:: |
||||
|
jp hl |
||||
|
|
||||
|
_bc_:: |
||||
|
push bc |
||||
|
ret |
||||
|
|
||||
|
_de_:: |
||||
|
push de |
||||
|
ret |
||||
|
|
||||
|
swap_hl_de:: |
||||
|
ld a, h |
||||
|
ld h, d |
||||
|
ld d, a |
||||
|
ld a, l |
||||
|
ld l, e |
||||
|
ld e, a |
||||
|
ret |
@ -0,0 +1,42 @@ |
|||||
|
include "charmap.inc" |
||||
|
|
||||
|
section "home/text.asm", rom0 |
||||
|
|
||||
|
print:: |
||||
|
; hl: String |
||||
|
; de: Tilemap position |
||||
|
ld a, [hli] |
||||
|
cp "$" |
||||
|
ret z |
||||
|
call lcd_blank_wait ; TODO: Really hackish. |
||||
|
ld [de], a |
||||
|
inc de |
||||
|
jr print |
||||
|
|
||||
|
print_num_3digit:: |
||||
|
; a: Number |
||||
|
; de: Tilemap positon |
||||
|
push af |
||||
|
call lcd_blank_wait |
||||
|
xor a |
||||
|
ld [de], a |
||||
|
inc de |
||||
|
ld [de], a |
||||
|
inc de |
||||
|
ld [de], a |
||||
|
pop af |
||||
|
|
||||
|
ld l, 3 |
||||
|
.loop |
||||
|
ld c, 10 |
||||
|
call divide |
||||
|
add "0" |
||||
|
call lcd_blank_wait |
||||
|
ld [de], a |
||||
|
ld a, b |
||||
|
and a |
||||
|
ret z |
||||
|
dec de |
||||
|
dec l |
||||
|
jr nz, .loop |
||||
|
ret |
@ -0,0 +1,36 @@ |
|||||
|
include "defines.inc" |
||||
|
include "hardware.inc" |
||||
|
|
||||
|
section "home/vblank.asm@hram", hram |
||||
|
h_vblank: db |
||||
|
|
||||
|
section "home/vblank.asm@int40", rom0[$40] |
||||
|
push af |
||||
|
ld a, 1 |
||||
|
ldh [h_vblank], a |
||||
|
jp vblank |
||||
|
|
||||
|
section "home/vblank.asm", rom0 |
||||
|
|
||||
|
vblank: |
||||
|
push hl |
||||
|
push bc |
||||
|
push de |
||||
|
|
||||
|
call joypad_read |
||||
|
|
||||
|
pop de |
||||
|
pop bc |
||||
|
pop hl |
||||
|
pop af |
||||
|
reti |
||||
|
|
||||
|
vblank_wait:: |
||||
|
xor a |
||||
|
ldh [h_vblank], a |
||||
|
.loop |
||||
|
halt |
||||
|
ld a, [h_vblank] |
||||
|
and a |
||||
|
jr z, .loop |
||||
|
ret |
@ -0,0 +1,54 @@ |
|||||
|
include "video.inc" |
||||
|
include "hardware.inc" |
||||
|
|
||||
|
section "home/video.asm@vram", vram[$9800] |
||||
|
v_bgmap1:: ds $400 |
||||
|
v_bgmap2:: ds $400 |
||||
|
|
||||
|
section "home/video.asm", rom0 |
||||
|
|
||||
|
lcd_vblank_wait:: |
||||
|
ldh a, [r_ly] |
||||
|
cp r_ly_vblank + 1 |
||||
|
jr nz, lcd_vblank_wait |
||||
|
ret |
||||
|
|
||||
|
lcd_blank_wait:: |
||||
|
push af |
||||
|
.loop |
||||
|
ldh a, [r_stat] |
||||
|
and r_stat_mode |
||||
|
cp r_stat_mode_vblank + 1 |
||||
|
jr nc, .loop |
||||
|
pop af |
||||
|
ret |
||||
|
|
||||
|
lcd_disable:: |
||||
|
call lcd_vblank_wait |
||||
|
|
||||
|
ld hl, r_lcdc |
||||
|
res r_lcdc_on_f, [hl] |
||||
|
|
||||
|
ld hl, r_ie |
||||
|
res r_int_vblank_f, [hl] |
||||
|
ret |
||||
|
|
||||
|
lcd_enable:: |
||||
|
ld hl, r_lcdc |
||||
|
set r_lcdc_on_f, [hl] |
||||
|
|
||||
|
ld hl, r_if |
||||
|
res r_int_vblank_f, [hl] |
||||
|
|
||||
|
ld hl, r_ie |
||||
|
set r_int_vblank_f, [hl] |
||||
|
ret |
||||
|
|
||||
|
vram_clear:: |
||||
|
xor a |
||||
|
ld hl, mmap_vram |
||||
|
ld bc, mmap_vram_end - mmap_vram |
||||
|
call memset |
||||
|
ld hl, mmap_oam |
||||
|
ld bc, mmap_oam_end - mmap_oam |
||||
|
jp memset |
@ -0,0 +1,127 @@ |
|||||
|
include "charmap.inc" |
||||
|
include "defines.inc" |
||||
|
include "video.inc" |
||||
|
include "hardware.inc" |
||||
|
|
||||
|
section "main.asm@data", rom0 |
||||
|
gfx_font: |
||||
|
incbin "assets/tetrisfont.1bpp" |
||||
|
gfx_font_end: |
||||
|
|
||||
|
section "main.asm@vram", vram |
||||
|
|
||||
|
ds $2D tiles |
||||
|
v_font_dash_period: ds 2 tiles |
||||
|
ds $1 tiles |
||||
|
v_font_numbers: ds 10 tiles |
||||
|
ds $7 tiles |
||||
|
v_font_uppercase: ds 26 tiles |
||||
|
ds $6 tiles |
||||
|
v_font_lowercase: ds 26 tiles |
||||
|
|
||||
|
section "main.asm", rom0 |
||||
|
|
||||
|
main:: |
||||
|
call audio_disable |
||||
|
call lcd_disable |
||||
|
if def(ENABLE_CLEAR) |
||||
|
call vram_clear |
||||
|
endc |
||||
|
|
||||
|
; Load the font |
||||
|
ld hl, gfx_font |
||||
|
ld de, v_font_numbers |
||||
|
ld bc, (10 tiles) / 2 |
||||
|
call memcpy_double |
||||
|
ld de, v_font_uppercase |
||||
|
ld bc, (26 tiles) / 2 |
||||
|
call memcpy_double |
||||
|
ld hl, gfx_font + (10 tiles) / 2 |
||||
|
ld de, v_font_lowercase |
||||
|
ld bc, (26 tiles) / 2 |
||||
|
call memcpy_double |
||||
|
ld de, v_font_dash_period + (1 tiles) |
||||
|
ld bc, (1 tiles) / 2 |
||||
|
call memcpy_double |
||||
|
ld de, v_font_dash_period |
||||
|
ld bc, (1 tiles) / 2 |
||||
|
call memcpy_double |
||||
|
|
||||
|
; Setup the palettes |
||||
|
if def(ENABLE_CGB) |
||||
|
ldh a, [h_console] |
||||
|
cp console_cgb |
||||
|
jr c, .skip_pals |
||||
|
|
||||
|
ld a, r_bcps_inc | 0 << r_bcps_pal_f | 0 << r_bcps_offs_f |
||||
|
ld c, LOW(r_bcps) |
||||
|
ldh [c], a |
||||
|
inc c |
||||
|
ld b, 4 |
||||
|
ld a, $ff |
||||
|
.loop_pal_1 |
||||
|
ldh [c], a |
||||
|
dec b |
||||
|
jr nz, .loop_pal_1 |
||||
|
ld b, 4 |
||||
|
xor a |
||||
|
.loop_pal_2 |
||||
|
ldh [c], a |
||||
|
dec b |
||||
|
jr nz, .loop_pal_2 |
||||
|
|
||||
|
.skip_pals |
||||
|
endc |
||||
|
|
||||
|
; Clear the background map |
||||
|
xor a |
||||
|
ld hl, v_bgmap1 |
||||
|
ld bc, bgmap_width * bgmap_height |
||||
|
call memset |
||||
|
|
||||
|
call lcd_enable |
||||
|
ld hl, string_something |
||||
|
bgcoord de, 5, 2 |
||||
|
call print |
||||
|
|
||||
|
call serial_init_master |
||||
|
|
||||
|
main_loop: |
||||
|
call joypad_update |
||||
|
bit joy_a_f, a |
||||
|
jr nz, .send_shit |
||||
|
|
||||
|
bgcoord hl, 7, 5 |
||||
|
call lcd_blank_wait |
||||
|
ld [hl], " " |
||||
|
|
||||
|
.continue |
||||
|
call vblank_wait |
||||
|
jr main_loop |
||||
|
|
||||
|
.send_shit |
||||
|
call vblank_wait |
||||
|
call joypad_update |
||||
|
bit joy_a_f, a |
||||
|
jr nz, .send_shit |
||||
|
|
||||
|
bgcoord hl, 7, 5 |
||||
|
call lcd_blank_wait |
||||
|
ld [hl], "A" |
||||
|
ld hl, transfer_buffer |
||||
|
ld de, NULL |
||||
|
ld bc, transfer_buffer.end - transfer_buffer |
||||
|
call serial_transfer |
||||
|
|
||||
|
.send_shit_wait |
||||
|
call vblank_wait |
||||
|
call serial_finished |
||||
|
jr nz, .send_shit_wait |
||||
|
|
||||
|
jr .continue |
||||
|
|
||||
|
transfer_buffer: |
||||
|
db $00, $11, $22, $33, $44, $55, $66, $77, $88, $99, $AA, $BB, $CC, $DD, $EE, $FF |
||||
|
.end |
||||
|
|
||||
|
string_something: db "SOMETHING$" |
@ -0,0 +1,33 @@ |
|||||
|
; vim:set syn=asm: |
||||
|
|
||||
|
if !def(_video_inc_) |
||||
|
_video_inc_ equ 0 |
||||
|
|
||||
|
bgmap_width equ 32 |
||||
|
bgmap_height equ 32 |
||||
|
screen_width equ 20 |
||||
|
screen_height equ 18 |
||||
|
|
||||
|
tile_height equ 8 |
||||
|
len_1bpp_tile equ 1 * tile_height |
||||
|
len_2bpp_tile equ 2 * tile_height |
||||
|
tile equs "+ len_2bpp_tile *" |
||||
|
tiles equs "* len_2bpp_tile" |
||||
|
|
||||
|
coord: MACRO |
||||
|
if _NARG < 4 |
||||
|
ld \1, (\3) * screen_width + (\2) + w_tilemap |
||||
|
else |
||||
|
ld \1, (\3) * screen_height + (\2) + (\4) |
||||
|
endc |
||||
|
ENDM |
||||
|
|
||||
|
bgcoord: MACRO |
||||
|
if _NARG < 4 |
||||
|
ld \1, (\3) * bgmap_width + (\2) + v_bgmap1 |
||||
|
else |
||||
|
ld \1, (\3) * bgmap_width + (\2) + (\4) |
||||
|
endc |
||||
|
ENDM |
||||
|
|
||||
|
endc |
Loading…
Reference in new issue