summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormid-kid <esteve.varela@gmail.com>2020-09-10 23:47:11 +0200
committermid-kid <esteve.varela@gmail.com>2020-09-10 23:47:11 +0200
commitacf910ba7cc321c0d57a928e4cbba599b837b8b8 (patch)
treee0870f419c95fe5b8582dc92ccd1e105856980c7
parent6a48df93672e8771e893be040f87178d0607d3ef (diff)
Document char printing routine
-rw-r--r--Makefile20
-rw-r--r--gfx/text_chars.pngbin0 -> 2362 bytes
-rw-r--r--gfx/textbox_border.pngbin0 -> 150 bytes
-rwxr-xr-xmgbdis.sh6
-rw-r--r--shim.sym30
-rw-r--r--source/bank_00.asm1100
-rw-r--r--source/bank_02.asm61
-rw-r--r--source/bank_3c.asm8
-rw-r--r--source/bank_69.asm4
-rw-r--r--source/bank_6f.asm4
10 files changed, 1224 insertions, 9 deletions
diff --git a/Makefile b/Makefile
index a5c11e8..2cf4922 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ baserom := DMGAKVJ0.1
dir_source := source
dir_build := build
-dir_assets := assets
+dir_gfx := gfx
dir_tools := tools
RGBASM := rgbasm
@@ -12,13 +12,18 @@ RGBLINK := rgblink
RGBFIX := rgbfix
RGBASMFLAGS := -p 0xff -L
-RGBLINKFLAGS := -p 0xff -d -t
+RGBLINKFLAGS := -p 0xff -d
RGBFIXFLAGS := -p 0xff -c -m 0x1b -r 0x03 -k "01" -i "AKVJ" -t "POKEPICROSS"
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))
+
+objects := $(patsubst $(dir_source)/%.asm, $(dir_build)/%.o, \
+ $(call rwildcard, $(dir_source)/, *.asm))
objects += $(dir_build)/shim.o
+gfx := $(patsubst $(dir_gfx)/%.png, $(dir_build)/gfx/%.bin, \
+ $(call rwildcard, $(dir_gfx)/, *.png))
+
.SECONDEXPANSION:
.PHONY: all
@@ -33,14 +38,17 @@ $(name).gbc: layout.link $(objects) | $(baserom)
$(RGBLINK) $(RGBLINKFLAGS) -O $(baserom) -l $< -n $(@:.gbc=.sym) -m $(@:.gbc=.map) -o $@ $(filter-out $<, $^)
$(RGBFIX) $(RGBFIXFLAGS) -v $@
-$(dir_build)/shim.asm: shim.sym
+$(dir_build)/shim.asm: shim.sym | $$(dir $$@)
$(dir_tools)/makeshim.py $< > $@
-$(dir_build)/%.o: $(dir_build)/%.asm | $$(dir $$@)
+$(dir_build)/%.o: $(dir_build)/%.asm | $(gfx) $$(dir $$@)
$(RGBASM) $(RGBASMFLAGS) -i $(dir_build)/ -i $(dir_source)/ -M $(@:.o=.d) -o $@ $<
-$(dir_build)/%.o: $(dir_source)/%.asm | $$(dir $$@)
+$(dir_build)/%.o: $(dir_source)/%.asm | $(gfx) $$(dir $$@)
$(RGBASM) $(RGBASMFLAGS) -i $(dir_build)/ -i $(dir_source)/ -M $(@:.o=.d) -o $@ $<
+$(dir_build)/gfx/%.bin: $(dir_gfx)/%.png | $$(dir $$@)
+ $(RGBGFX) -o $@ $<
+
.PRECIOUS: %/
%/:
mkdir -p $@
diff --git a/gfx/text_chars.png b/gfx/text_chars.png
new file mode 100644
index 0000000..688e0d5
--- /dev/null
+++ b/gfx/text_chars.png
Binary files differ
diff --git a/gfx/textbox_border.png b/gfx/textbox_border.png
new file mode 100644
index 0000000..5393308
--- /dev/null
+++ b/gfx/textbox_border.png
Binary files differ
diff --git a/mgbdis.sh b/mgbdis.sh
index 5fd331d..867c797 100755
--- a/mgbdis.sh
+++ b/mgbdis.sh
@@ -1,4 +1,10 @@
#!/bin/sh
+
+if ! fgrep -qx ';APPEND' picross.sym; then
+ echo ';APPEND' >> picross.sym
+ cat shim_mgbdis.sym >> picross.sym
+fi
+
./mgbdis/mgbdis.py --overwrite \
--disable-auto-ldh \
--ld_c ldh_c \
diff --git a/shim.sym b/shim.sym
index 9725e70..bf06aa4 100644
--- a/shim.sym
+++ b/shim.sym
@@ -1,2 +1,28 @@
-00:c31e w_bank_temp
-00:c315 w_bank_rom
+00:c31e w_bank_temp ; db
+00:c317 w_farcall_target ; dw
+00:c315 w_bank_rom ; db
+
+00:c336 w_c336
+00:c35b w_vwf_char_start_x ; db
+00:c35c w_vwf_char_start_y ; db
+00:c35d w_vwf_char_end_x ; db
+00:c35e w_vwf_char_end_y ; db
+00:c35f w_vwf_char_addr ; dw
+00:c361 w_vwf_char_bank ; db
+00:c362 w_c362
+00:c363 w_c363
+00:c364 w_c364
+00:c365 w_c365
+00:c366 w_c366
+00:c367 w_c367
+00:c368 w_c368
+00:c369 w_c369
+00:c36a w_c36a
+00:c36b w_c36b
+00:c36c w_c36c
+00:c36d w_vwf_char_buffer ; ds ??
+00:cd6d w_cd6d
+00:cd6e w_cd6e
+
+01:d560 w_textbox_width ; db
+01:d561 w_textbox_height ; db
diff --git a/source/bank_00.asm b/source/bank_00.asm
index ac58661..a73c322 100644
--- a/source/bank_00.asm
+++ b/source/bank_00.asm
@@ -1,7 +1,553 @@
INCLUDE "hardware.inc"
-SECTION "vram_copy", ROM0[$0fbd]
+SECTION "vwf_draw_char", ROM0[$0723]
+vwf_char_draw::
+ ld a, [w_vwf_char_start_x]
+ and $07
+ ld c, a
+ ld b, $00
+ ld hl, .pixel_masks_right
+ add hl, bc
+ ld a, [hl]
+ ld [w_c363], a
+ ld a, [w_vwf_char_end_x]
+ and $07
+ ld c, a
+ ld b, $00
+ ld hl, .pixel_masks_left
+ add hl, bc
+ ld a, [hl]
+ ld [w_c364], a
+ ld a, [w_vwf_char_start_x]
+ and $f8
+ ld c, a
+ ld a, [w_vwf_char_end_x]
+ and $f8
+ sub c
+ srl a
+ srl a
+ srl a
+ ld [w_c365], a
+ ld a, [w_vwf_char_start_x]
+ ld c, a
+ ld a, [w_vwf_char_end_x]
+ sub c
+ srl a
+ srl a
+ srl a
+ inc a
+ ld [w_c366], a
+ ld a, [w_vwf_char_start_x]
+ and $07
+ ld c, a
+ add $38
+ ld [w_c368], a
+ ld b, $00
+ ld hl, .pixel_masks_right
+ add hl, bc
+ ld a, [hl]
+ ld [w_c369], a
+ ld hl, .Data_000_0a2c
+ add hl, bc
+ ld a, [hl]
+ ld [w_c36a], a
+ ld a, [w_vwf_char_addr + 0]
+ ld c, a
+ ld a, [w_vwf_char_addr + 1]
+ ld b, a
+ ld a, [w_bank_rom]
+ push af
+ ld a, [w_vwf_char_bank]
+ ld [w_bank_rom], a
+ ld [rROMB0], a
+
+ ld de, w_vwf_char_buffer
+ ld a, [w_vwf_char_start_y]
+ ld l, a
+ ld a, [w_vwf_char_start_x]
+ and $f8
+ ld h, a
+
+.Jump_000_07a9
+ xor a
+ ld [w_c36b], a
+ ld [w_c36c], a
+ ld a, [w_c366]
+ ld [w_c367], a
+ ld a, [w_c363]
+ ld [w_c362], a
+ push bc
+ push hl
+ ld a, [w_c365]
+ and a
+ jr nz, .jr_000_07d3
+
+ push hl
+ ld a, [w_c364]
+ ld hl, w_c363
+ and [hl]
+ ld [w_c362], a
+ pop hl
+ jp .Jump_000_0911
+
+.jr_000_07d3
+ push hl
+ ld a, [w_bank_rom]
+ push af
+ ld a, $23
+ ld [w_bank_rom], a
+ ld [rROMB0], a
+ push bc
+ push de
+ ld b, h
+ ld c, l
+ ld a, l
+ and $f8
+ srl a
+ srl a
+ ld e, a
+ ld d, $00
+ ld a, [w_cd6d]
+ ld l, a
+ ld a, [w_cd6e]
+ ld h, a
+ add hl, de
+ ld a, [hl+]
+ ld h, [hl]
+ ld l, a
+ ld a, b
+ and $f8
+ srl a
+ srl a
+ ld e, a
+ ld d, $00
+ add hl, de
+ ld a, [hl+]
+ ld h, [hl]
+ ld l, a
+ ld a, c
+ and $07
+ sla a
+ add l
+ ld l, a
+ pop de
+ pop bc
+ ld a, l
+ ld [de], a
+ inc de
+ ld a, h
+ ld [de], a
+ inc de
+ pop af
+ ld [w_bank_rom], a
+ ld [rROMB0], a
+ ld a, [w_c362]
+ ld [de], a
+ inc de
+ ld a, [bc]
+ ld l, a
+ ld a, [w_c368]
+ ld h, a
+ ld a, [hl]
+ ld [de], a
+ ld hl, w_c36a
+ and [hl]
+ ld [w_c36b], a
+ inc bc
+ inc de
+ ld a, [bc]
+ ld l, a
+ ld a, [w_c368]
+ ld h, a
+ ld a, [hl]
+ ld [de], a
+ ld hl, w_c36a
+ and [hl]
+ ld [w_c36c], a
+ ld a, c
+ add $0f
+ ld c, a
+ ld a, b
+ adc $00
+ ld b, a
+ inc de
+ pop hl
+ ld a, h
+ add $08
+ ld h, a
+ ld a, [w_c367]
+ dec a
+ ld [w_c367], a
+ ld a, [w_c365]
+ dec a
+ jp z, .Jump_000_090b
+.Jump_000_085f
+ push af
+ push hl
+ ld a, [w_bank_rom]
+ push af
+ ld a, $23
+ ld [w_bank_rom], a
+ ld [rROMB0], a
+ push bc
+ push de
+ ld b, h
+ ld c, l
+ ld a, l
+ and $f8
+ srl a
+ srl a
+ ld e, a
+ ld d, $00
+ ld a, [w_cd6d]
+ ld l, a
+ ld a, [w_cd6e]
+ ld h, a
+ add hl, de
+ ld a, [hl+]
+ ld h, [hl]
+ ld l, a
+ ld a, b
+ and $f8
+ srl a
+ srl a
+ ld e, a
+ ld d, $00
+ add hl, de
+ ld a, [hl+]
+ ld h, [hl]
+ ld l, a
+ ld a, c
+ and $07
+ sla a
+ add l
+ ld l, a
+ pop de
+ pop bc
+ ld a, l
+ ld [de], a
+ inc de
+ ld a, h
+ ld [de], a
+ inc de
+ pop af
+ ld [w_bank_rom], a
+ ld [rROMB0], a
+ ld a, $ff
+ ld [de], a
+ inc de
+ ld a, [w_c367]
+ and a
+ jr z, .jr_000_08b7
+
+ ld a, [bc]
+ inc bc
+
+.jr_000_08b7
+ ld l, a
+ ld a, [w_c368]
+ ld h, a
+ ld a, [hl]
+ push af
+ ld hl, w_c369
+ and [hl]
+ ld hl, w_c36b
+ or [hl]
+ ld [de], a
+ pop af
+ ld hl, w_c36a
+ and [hl]
+ ld [w_c36b], a
+ inc de
+ ld a, [w_c367]
+ and a
+ jr z, .jr_000_08e1
+
+ ld a, [bc]
+ push af
+ ld a, c
+ add $0f
+ ld c, a
+ ld a, b
+ adc $00
+ ld b, a
+ pop af
+
+.jr_000_08e1
+ ld l, a
+ ld a, [w_c368]
+ ld h, a
+ ld a, [hl]
+ push af
+ ld hl, w_c369
+ and [hl]
+ ld hl, w_c36c
+ or [hl]
+ ld [de], a
+ pop af
+ ld hl, w_c36a
+ and [hl]
+ ld [w_c36c], a
+ inc de
+ pop hl
+ ld a, h
+ add $08
+ ld h, a
+ ld a, [w_c367]
+ dec a
+ ld [w_c367], a
+ pop af
+ dec a
+ jp nz, .Jump_000_085f
+
+.Jump_000_090b
+ ld a, [w_c364]
+ ld [w_c362], a
+
+.Jump_000_0911
+ ld a, [w_bank_rom]
+ push af
+ ld a, $23
+ ld [w_bank_rom], a
+ ld [rROMB0], a
+ push bc
+ push de
+ ld b, h
+ ld c, l
+ ld a, l
+ and $f8
+ srl a
+ srl a
+ ld e, a
+ ld d, $00
+ ld a, [w_cd6d]
+ ld l, a
+ ld a, [w_cd6e]
+ ld h, a
+ add hl, de
+ ld a, [hl+]
+ ld h, [hl]
+ ld l, a
+ ld a, b
+ and $f8
+ srl a
+ srl a
+ ld e, a
+ ld d, $00
+ add hl, de
+ ld a, [hl+]
+ ld h, [hl]
+ ld l, a
+ ld a, c
+ and $07
+ sla a
+ add l
+ ld l, a
+ pop de
+ pop bc
+ ld a, l
+ ld [de], a
+ inc de
+ ld a, h
+ ld [de], a
+ inc de
+ pop af
+ ld [w_bank_rom], a
+ ld [rROMB0], a
+ ld a, [w_c362]
+ ld [de], a
+ inc de
+ ld a, [w_c367]
+ and a
+ jr z, .jr_000_0968
+
+ ld a, [bc]
+ inc bc
+
+.jr_000_0968
+ ld l, a
+ ld a, [w_c368]
+ ld h, a
+ ld a, [hl]
+ push af
+ ld hl, w_c369
+ and [hl]
+ ld hl, w_c36b
+ or [hl]
+ ld [de], a
+ pop af
+ ld hl, w_c36a
+ and [hl]
+ ld [w_c36b], a
+ inc de
+ ld a, [w_c367]
+ and a
+ jr z, .jr_000_0992
+
+ ld a, [bc]
+ push af
+ ld a, c
+ add $0f
+ ld c, a
+ ld a, b
+ adc $00
+ ld b, a
+ pop af
+
+.jr_000_0992
+ ld l, a
+ ld a, [w_c368]
+ ld h, a
+ ld a, [hl]
+ push af
+ ld hl, w_c369
+ and [hl]
+ ld hl, w_c36c
+ or [hl]
+ ld [de], a
+ pop af
+ ld hl, w_c36a
+ and [hl]
+ ld [w_c36c], a
+ inc de
+ pop hl
+ pop bc
+ inc bc
+ inc bc
+ ld a, c
+ and $0f
+ jr nz, .jr_000_09bc
+
+ ld a, c
+ add $f0
+ ld c, a
+ ld a, b
+ adc $00
+ ld b, a
+
+.jr_000_09bc
+ inc l
+ ld a, [w_vwf_char_end_y]
+ cp l
+ jp nc, .Jump_000_07a9
+
+ xor a
+ ld [de], a
+ inc de
+ ld [de], a
+
+ ; Write tiles stored in the buffer
+ ld bc, w_vwf_char_buffer
+
+ ; Ignore hblank (update during vblank?)
+ ld a, [w_c336]
+ bit 7, a
+ jr z, .write_tile_ignore_hblank_loop
+
+.write_tile_loop
+ ; Get location to write to
+ ld a, [bc]
+ ld l, a
+ inc bc
+ ld a, [bc]
+ ld h, a
+ or l
+ jr z, .write_tile_done
+
+ ; Get mask in e, and pixels in d
+ inc bc
+ ld a, [bc]
+ ld e, a
+ inc bc
+ ld a, [bc]
+ ld d, a
+ inc bc
+
+.hblank_finish
+ ldh a, [rSTAT]
+ and STATF_LCD
+ jr z, .hblank_finish
+
+.hblank_enter
+ ldh a, [rSTAT]
+ and STATF_LCD
+ jr nz, .hblank_enter
+
+ ; Write pixels high bit, preserving background
+ ld a, d
+ xor [hl]
+ and e
+ xor [hl]
+ ld [hl+], a
+ ld a, [bc]
+ ld d, a
+ inc bc
+
+.hblank_next
+ ldh a, [rSTAT]
+ and STATF_LCD
+ jr nz, .hblank_next
+
+ ; Write 8 pixels low bit, preserving background
+ ld a, d
+ xor [hl]
+ and e
+ xor [hl]
+ ld [hl], a
+ jr .write_tile_loop
+
+.write_tile_done
+ pop af
+ ld [w_bank_rom], a
+ ld [rROMB0], a
+ ret
+
+.write_tile_ignore_hblank_loop
+ ; Get location to write to
+ ld a, [bc]
+ ld l, a
+ inc bc
+ ld a, [bc]
+ ld h, a
+ or l
+ jr z, .write_tile_done
+
+ ; Get mask in e, and pixels in d
+ inc bc
+ ld a, [bc]
+ ld e, a
+ inc bc
+ ld a, [bc]
+ inc bc
+
+ ; Write pixels high bit, preserving background
+ xor [hl]
+ and e
+ xor [hl]
+ ld [hl+], a
+ ld a, [bc]
+ inc bc
+
+ ; Write 8 pixels low bit, preserving background
+ xor [hl]
+ and e
+ xor [hl]
+ ld [hl], a
+ jr .write_tile_ignore_hblank_loop
+
+.pixel_masks_right:
+ db $ff, $7f, $3f, $1f, $0f, $07, $03, $01
+
+.Data_000_0a2c:
+ db $00
+
+.pixel_masks_left:
+ db $80, $c0, $e0, $f0, $f8, $fc, $fe, $ff
+
+ db $00, $00, $68, $01, $d0, $02, $38, $04, $a0, $05, $08, $07, $70, $08, $d8, $09, $40, $0b, $a8, $0c, $fa, $57, $c3, $a7, $c8, $f0, $00, $f6, $30, $e0, $00, $f0, $4d, $3e, $01, $e0, $4d, $10, $6f
+
+SECTION "vram_copy", ROM0[$0fbd]
; Parameters:
; a - bank
; hl - source
@@ -54,3 +600,555 @@ vram_copy::
ld [w_bank_rom], a
ld [rROMB0], a
ret
+
+SECTION "farcall", ROM0[$10cd]
+; Save current bank and jump to w_farcall_target in w_bank_temp
+farcall::
+ push af
+ push af
+ push af
+ push hl
+ ld hl, sp + 4
+ ld a, [w_farcall_target + 0]
+ ld [hl+], a
+ ld a, [w_farcall_target + 1]
+ ld [hl+], a
+ ld a, [w_bank_rom]
+ ld [hl], a
+ ld a, [w_bank_temp]
+ ld [w_bank_rom], a
+ ld [rROMB0], a
+ pop hl
+ pop af
+ ret
+
+; Return to bank and address in stack
+farcall_ret::
+ push af
+ push hl
+ ld hl, sp + 4
+ ld a, [hl]
+ ld [w_bank_rom], a
+ ld [rROMB0], a
+ pop hl
+ pop af
+ inc sp
+ inc sp
+ ret
+
+SECTION "text_chars_offsets", ROM0[$286f]
+text_chars_widths::
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 4
+ db 7
+ db 7
+ db 6
+ db 6
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 8
+ db 7
+ db 6
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 6
+ db 6
+ db 6
+ db 6
+ db 7
+ db 6
+ db 7
+ db 6
+ db 7
+ db 5
+ db 5
+ db 5
+ db 4
+ db 9
+ db 8
+ db 7
+ db 8
+ db 8
+ db 9
+ db 7
+ db 9
+ db 8
+ db 8
+ db 8
+ db 8
+ db 8
+ db 8
+ db 8
+ db 9
+ db 9
+ db 9
+ db 8
+ db 9
+ db 9
+ db 9
+ db 9
+ db 8
+ db 10
+ db 5
+ db 5
+ db 4
+ db 4
+ db 5
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 5
+ db 7
+ db 7
+ db 6
+ db 7
+ db 6
+ db 7
+ db 7
+ db 7
+ db 8
+ db 7
+ db 7
+ db 6
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 6
+ db 7
+ db 6
+ db 7
+ db 7
+ db 7
+ db 7
+ db 5
+ db 5
+ db 5
+ db 4
+ db 9
+ db 8
+ db 9
+ db 9
+ db 9
+ db 8
+ db 8
+ db 9
+ db 9
+ db 9
+ db 9
+ db 8
+ db 8
+ db 9
+ db 6
+ db 8
+ db 8
+ db 9
+ db 8
+ db 8
+ db 9
+ db 7
+ db 8
+ db 8
+ db 8
+ db 5
+ db 4
+ db 5
+ db 5
+ db 5
+ db 6
+ db 4
+ db 6
+ db 6
+ db 6
+ db 6
+ db 6
+ db 6
+ db 6
+ db 6
+ db 5
+ db 7
+ db 6
+ db 7
+ db 6
+ db 6
+ db 6
+ db 7
+ db 6
+ db 3
+ db 7
+ db 6
+ db 6
+ db 7
+ db 7
+ db 7
+ db 6
+ db 7
+ db 6
+ db 6
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 7
+ db 6
+ db 6
+ db 5
+ db 5
+ db 5
+ db 5
+ db 6
+ db 6
+ db 5
+ db 1
+ db 5
+ db 5
+ db 2
+ db 7
+ db 5
+ db 5
+ db 5
+ db 5
+ db 5
+ db 5
+ db 5
+ db 5
+ db 5
+ db 7
+ db 6
+ db 6
+ db 5
+ db 0
+ db 4
+ db 4
+ db 5
+ db 5
+ db 8
+ db 5
+ db 5
+ db 4
+ db 5
+ db 5
+ db 2
+ db 2
+ db 2
+ db 4
+ db 3
+ db 3
+ db 7
+ db 8
+ db 5
+ db 0
+ db 0
+ db 0
+ db 0
+ db 0
+ db 0
+ db 0
+ db 0
+ db 0
+ db 0
+ db 0
+ db 0
+ db 0
+
+text_chars_offsets::
+ dw $0000
+ dw $0020
+ dw $0040
+ dw $0060
+ dw $0080
+ dw $00a0
+ dw $00c0
+ dw $00e0
+ dw $0104
+ dw $0124
+ dw $0144
+ dw $0164
+ dw $0184
+ dw $01a4
+ dw $01c4
+ dw $01e4
+ dw $0208
+ dw $0228
+ dw $0248
+ dw $0268
+ dw $0288
+ dw $02a8
+ dw $02c8
+ dw $02e8
+ dw $030c
+ dw $032c
+ dw $034c
+ dw $036c
+ dw $038c
+ dw $03ac
+ dw $03cc
+ dw $03ec
+ dw $0500
+ dw $0520
+ dw $0540
+ dw $0560
+ dw $0580
+ dw $05a0
+ dw $05c0
+ dw $05e0
+ dw $0604
+ dw $0624
+ dw $0644
+ dw $0664
+ dw $0684
+ dw $06a4
+ dw $06c4
+ dw $06e4
+ dw $0708
+ dw $0728
+ dw $0748
+ dw $0768
+ dw $0788
+ dw $07a8
+ dw $07c8
+ dw $07e8
+ dw $080c
+ dw $082c
+ dw $084c
+ dw $086c
+ dw $088c
+ dw $08ac
+ dw $08cc
+ dw $08ec
+ dw $0a00
+ dw $0a20
+ dw $0a40
+ dw $0a60
+ dw $0a80
+ dw $0aa0
+ dw $0ac0
+ dw $0ae0
+ dw $0b04
+ dw $0b24
+ dw $0b44
+ dw $0b64
+ dw $0b84
+ dw $0ba4
+ dw $0bc4
+ dw $0be4
+ dw $0c08
+ dw $0c28
+ dw $0c48
+ dw $0c68
+ dw $0c88
+ dw $0ca8
+ dw $0cc8
+ dw $0ce8
+ dw $0d0c
+ dw $0d2c
+ dw $0d4c
+ dw $0d6c
+ dw $0d8c
+ dw $0dac
+ dw $0dcc
+ dw $0dec
+ dw $0f00
+ dw $0f20
+ dw $0f40
+ dw $0f60
+ dw $0f80
+ dw $0fa0
+ dw $0fc0
+ dw $0fe0
+ dw $1004
+ dw $1024
+ dw $1044
+ dw $1064
+ dw $1084
+ dw $10a4
+ dw $10c4
+ dw $10e4
+ dw $1108
+ dw $1128
+ dw $1148
+ dw $1168
+ dw $1188
+ dw $11a8
+ dw $11c8
+ dw $11e8
+ dw $120c
+ dw $122c
+ dw $124c
+ dw $126c
+ dw $128c
+ dw $12ac
+ dw $12cc
+ dw $12ec
+ dw $1400
+ dw $1420
+ dw $1440
+ dw $1460
+ dw $1480
+ dw $14a0
+ dw $14c0
+ dw $14e0
+ dw $1504
+ dw $1524
+ dw $1544
+ dw $1564
+ dw $1584
+ dw $15a4
+ dw $15c4
+ dw $15e4
+ dw $1608
+ dw $1628
+ dw $1648
+ dw $1668
+ dw $1688
+ dw $16a8
+ dw $16c8
+ dw $16e8
+ dw $170c
+ dw $172c
+ dw $174c
+ dw $176c
+ dw $178c
+ dw $17ac
+ dw $17cc
+ dw $17ec
+ dw $1900
+ dw $1920
+ dw $1940
+ dw $1960
+ dw $1980
+ dw $19a0
+ dw $19c0
+ dw $19e0
+ dw $1a04
+ dw $1a24
+ dw $1a44
+ dw $1a64
+ dw $1a84
+ dw $1aa4
+ dw $1ac4
+ dw $1ae4
+ dw $1b08
+ dw $1b28
+ dw $1b48
+ dw $1b68
+ dw $1b88
+ dw $1ba8
+ dw $1bc8
+ dw $1be8
+ dw $1c0c
+ dw $1c2c
+ dw $1c4c
+ dw $1c6c
+ dw $1c8c
+ dw $1cac
+ dw $1ccc
+ dw $1cec
+ dw $1e00
+ dw $1e20
+ dw $1e40
+ dw $1e60
+ dw $1e80
+ dw $1ea0
+ dw $1ec0
+ dw $1ee0
+ dw $1f04
+ dw $1f24
+ dw $1f44
+ dw $1f64
+ dw $1f84
+ dw $1fa4
+ dw $1fc4
+ dw $1fe4
+ dw $2008
+ dw $2028
+ dw $2048
+ dw $2068
+ dw $2088
+ dw $20a8
+ dw $20c8
+ dw $20e8
+ dw $210c
+ dw $212c
+ dw $214c
+ dw $216c
+ dw $218c
+ dw $21ac
+ dw $21cc
+ dw $21ec
+ dw $2300
+ dw $2320
+ dw $2340
+ dw $2360
+ dw $2380
+ dw $23a0
+ dw $23c0
+ dw $23e0
+ dw $2404
+ dw $2424
+ dw $2444
+ dw $2464
+ dw $2484
+ dw $24a4
+ dw $24c4
+ dw $24e4
+ dw $2508
+ dw $2528
+ dw $2548
+ dw $2568
+ dw $2588
+ dw $25a8
+ dw $25c8
+ dw $25e8
+ dw $260c
+ dw $262c
+ dw $264c
+ dw $266c
+ dw $268c
+ dw $26ac
+ dw $26cc
+ dw $26ec
diff --git a/source/bank_02.asm b/source/bank_02.asm
new file mode 100644
index 0000000..1300a2e
--- /dev/null
+++ b/source/bank_02.asm
@@ -0,0 +1,61 @@
+SECTION "print_char", ROMX[$4c80], BANK[$02]
+; Parameters:
+; de - character to print
+; b - x position
+; c - y position
+text_char_draw::
+ push de
+
+ ; Get char address
+ sla e
+ rl d
+ ld hl, text_chars_offsets
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, gfx_text_chars
+ add hl, de
+ ld a, l
+ ld [w_vwf_char_addr + 0], a
+ ld a, h
+ ld [w_vwf_char_addr + 1], a
+ ld a, BANK(gfx_text_chars)
+ ld [w_vwf_char_bank], a
+
+ ld a, b
+ ld [w_vwf_char_start_x], a
+
+ ; Get character width
+ pop de
+ ld hl, text_chars_widths
+ add hl, de
+ ld a, [hl]
+ and a
+ jp z, farcall_ret
+
+ ; Check we aren't drawing outside the textbox
+ push af
+ add b
+ ld hl, w_textbox_width
+ cp [hl]
+ jr c, .inside_width
+ pop af
+ jp farcall_ret
+.inside_width
+ ld [w_vwf_char_end_x], a
+
+ ld a, c
+ ld [w_vwf_char_start_y], a
+ add 9
+ ld hl, w_textbox_height
+ cp [hl]
+ jr c, .inside_height
+ pop af
+ jp farcall_ret
+.inside_height
+ ld [w_vwf_char_end_y], a
+
+ call vwf_char_draw
+ pop af
+ jp farcall_ret
diff --git a/source/bank_3c.asm b/source/bank_3c.asm
new file mode 100644
index 0000000..f113abf
--- /dev/null
+++ b/source/bank_3c.asm
@@ -0,0 +1,8 @@
+SECTION "textbox_border_load", ROMX[$4d16], BANK[$3c]
+textbox_border_load:
+ ld a, BANK(gfx_textbox_border)
+ ld hl, gfx_textbox_border
+ ld de, $8900
+ ld bc, gfx_textbox_border.end - gfx_textbox_border
+ call vram_copy
+ jp farcall_ret
diff --git a/source/bank_69.asm b/source/bank_69.asm
new file mode 100644
index 0000000..ccd64a6
--- /dev/null
+++ b/source/bank_69.asm
@@ -0,0 +1,4 @@
+SECTION "gfx_textbox_border", ROMX[$6000], BANK[$69]
+gfx_textbox_border::
+INCBIN "gfx/textbox_border.bin"
+.end::
diff --git a/source/bank_6f.asm b/source/bank_6f.asm
new file mode 100644
index 0000000..d72f8d7
--- /dev/null
+++ b/source/bank_6f.asm
@@ -0,0 +1,4 @@
+SECTION "gfx_text_chars", ROMX[$4000], BANK[$6f]
+gfx_text_chars::
+INCBIN "gfx/text_chars.bin"
+.end::