; UTF-8 macro du? arg local current,__input,char if arg eqtype '' virtual at 0 __input:: db arg count = $ end virtual current = 0 while current < count load char byte from __input:current wide = char current = current + 1 if char > 0C0h if char < 0E0h wide = char and 11111b load char byte from __input:current wide = wide shl 6 + (char and 111111b) current = current + 1 else if char < 0F0h wide = char and 1111b load char byte from __input:current wide = wide shl 6 + (char and 111111b) load char byte from __input:current+1 wide = wide shl 6 + (char and 111111b) current = current + 2 else if char < 0F8h wide = char and 111b load char byte from __input:current wide = wide shl 6 + (char and 111111b) load char byte from __input:current+1 wide = wide shl 6 + (char and 111111b) load char byte from __input:current+2 wide = wide shl 6 + (char and 111111b) current = current + 3 else if char < 0FCh wide = char and 11b load char byte from __input:current wide = wide shl 6 + (char and 111111b) load char byte from __input:current+1 wide = wide shl 6 + (char and 111111b) load char byte from __input:current+2 wide = wide shl 6 + (char and 111111b) load char byte from __input:current+3 wide = wide shl 6 + (char and 111111b) current = current + 4 else wide = char and 1 load char byte from __input:current wide = wide shl 6 + (char and 111111b) load char byte from __input:current+1 wide = wide shl 6 + (char and 111111b) load char byte from __input:current+2 wide = wide shl 6 + (char and 111111b) load char byte from __input:current+3 wide = wide shl 6 + (char and 111111b) load char byte from __input:current+4 wide = wide shl 6 + (char and 111111b) current = current + 5 end if end if if wide < 10000h dw wide else dw 0D7C0h + wide shr 10,0DC00h or (wide and 3FFh) end if end while else dw arg end if end macro macro du? args& iterate arg,args du arg end iterate end macro struc du? args& label . word du args end struc