게임보이
매크로ReadNextByte는 다음
macro read_next_byte
inc de
call ReadNextByte
endm
; @return wConvertedUnicode: utf-32 codepoint
UTF8_to_UTF32::
.dialog
ld l, $00
jr .begin
.dialog_name
ld l, $01
jr .begin
.tile
ld l, $02
.begin
ld h, $00
bit 7, a
jr z, .singleByte
bit 6, a
jp z, .end
bit 5, a
jr z, .doubleByte
bit 4, a
jr z, .tripleByte
bit 3, a
jr z, .quadByte
jr .end
.quadByte
and a, $07
rla
rla
ld h, a
read_next_byte
push af
and a, $30
rra
rra
rra
rra
or h
ld h, a
pop af
and a, $0f
rla
rla
rla
rla
ld b, a
read_next_byte
push af
and a, $3c
rra
rra
or b
ld b, a
jr .lastByte
.tripleByte
and a, $0f
rla
rla
rla
rla
ld b, a
read_next_byte
push af
and a, $3c
rra
rra
or b
ld b, a
jr .lastByte
.doubleByte
push af
and a, $1c
rra
rra
ld b, a
.lastByte
pop af
and a, $03
rra
rra
rra
ld c, a
read_next_byte
and a, $3f
or c
ld c, a
jr .end
.singleByte
and a, $7f
ld b, $00
ld c, a
.end
push af
xor a
ld [wConvertedUnicode + 0], a
ld a, h
ld [wConvertedUnicode + 1], a
ld a, b
ld [wConvertedUnicode + 2], a
ld a, c
ld [wConvertedUnicode + 3], a
pop af
ret