format MS COFF

public EXPORTS

section '.flat' code readable align 16

; int version()
version:
	mov	eax, 1
	ret


; void __stdcall dos2win (const char text_in[], char text_out[])
dos2win:
	push	ecx
	push	edx

	mov	ecx, [esp+12]
	mov	edx, [esp+16]

	pushad

	mov	ebx, d2w
	mov	[charset], ebx
	call	translate8

	popad

	pop	edx
	pop	ecx
	ret	8

; void __stdcall win2dos (const char text_in[], char text_out[])
win2dos:
	push	ecx
	push	edx

	mov	ecx, [esp+12]
	mov	edx, [esp+16]

	pushad

	mov	ebx, w2d
	mov	[charset], ebx
	call	translate8

	popad

	pop	edx
	pop	ecx
	ret	8

; void __stdcall koi2dos (const char text_in[], char text_out[])
koi2dos:
	push	ecx
	push	edx

	mov	ecx, [esp+12]
	mov	edx, [esp+16]

	pushad

	mov	ebx, k2d
	mov	[charset], ebx
	call	translate8

	popad

	pop	edx
	pop	ecx
	ret	8

translate8:
	mov	byte al, [ecx]

	cmp	al, 0
	je	_translate8_end

	cmp	al, 127
	jb	_translate8_copy

	and	eax, 127
	mov	ebx, [charset]
	add	ebx, eax	

	mov	byte al, [ebx]

	_translate8_copy:
		mov	byte [edx], al

		inc	edx
		inc	ecx

		jmp	translate8

	_translate8_end:
		mov	byte [edx], 0
		ret


align 16
EXPORTS:
		dd	szVersion,	version
		dd	szDos2win,	dos2win
		dd	szWin2dos,	win2dos
		dd	szKoi2dos,	koi2dos
		dd	0,		0

szVersion	db	'version',0
szDos2win	db	'dos2win',0
szWin2dos	db	'win2dos',0
szKoi2dos	db	'koi2dos',0

d2w		db	192, 193, 194, 195, 196, 197, 198, 199 
		db	200, 201, 202, 203, 204, 205, 206, 207
		db	208, 209, 210, 211, 212, 213, 214, 215
		db	216, 217, 218, 219, 220, 221, 222, 223
		db	224, 225, 226, 227, 228, 229, 230, 231
		db	232, 233, 234, 235, 236, 237, 238, 239
		db	32,  32,  32,  32,  32,  32,  32,  32
		db	32,  32,  32,  32,  32,  32,  32,  32
		db	32,  32,  32,  32,  32,  32,  32,  32
		db	32,  32,  32,  32,  32,  32,  32,  32
		db	32,  32,  32,  32,  32,  32,  32,  32
		db	32,  32,  32,  32,  32,  32,  32,  32
		db	240, 241, 242, 243, 244, 245, 246, 247
		db	248, 249, 250, 251, 252, 253, 254, 255
		db	168, 184, 170, 186, 175, 191, 161, 162
		db	176, 32,  32,  32,  185, 164, 32,  32


w2d		db	32,  32,  44,  32,  34,  32,  32,  32
		db	94,  32,  32,  60,  32,  32,  32,  32
		db	32,  39,  39,  34,  34,  32,  45,  45 
		db	126, 32,  32,  62,  32,  32,  32,  32
		db	32,  246, 247, 74,  253, 131, 32,  32
		db	240, 32,  242, 34,  32,  32,  32,  244
		db	248, 32,  73,  105, 163, 32,  32,  250
		db	241, 252, 243, 34,  106, 83,  115, 245
		db	128, 129, 130, 131, 132, 133, 134, 135
		db	136, 137, 138, 139, 140, 141, 142, 143
		db	144, 145, 146, 147, 148, 149, 150, 151
		db	152, 153, 154, 155, 156, 157, 158, 159
		db	160, 161, 162, 163, 164, 165, 166, 167
		db	168, 169, 170, 171, 172, 173, 174, 175
		db	224, 225, 226, 227, 228, 229, 230, 231
		db	232, 233, 234, 235, 236, 237, 238, 239


k2d		db	196, 179, 218, 191, 192, 217, 195, 180
		db	194, 193, 197, 223, 220, 219, 221, 222
		db	176, 177, 178, 32,  254, 249, 251, 32 
		db	32,  32,  32,  32,  248, 32,  250, 32 
		db	205, 186, 184, 241, 214, 201, 184, 183
		db	187, 212, 211, 200, 190, 189, 188, 198
		db	199, 204, 181, 240, 182, 185, 209, 210
		db	203, 207, 208, 202, 216, 215, 206, 32 
		db	238, 160, 161, 230, 164, 165, 228, 163
		db	229, 168, 169, 170, 171, 172, 173, 174
		db	175, 239, 224, 225, 226, 227, 166, 162
		db	236, 235, 167, 232, 237, 233, 231, 234 
		db	158, 128, 129, 150, 132, 133, 148, 131
		db	149, 136, 137, 138, 139, 140, 141, 142
		db	143, 159, 144, 145, 146, 147, 134, 130
		db	156, 155, 135, 152, 157, 153, 151, 154

section '.data' data readable writable align 16

charset		rd	1