1# Copyright (c) KATO Takenori, 2007.
2#
3# All rights reserved.  Unpublished rights reserved under the copyright
4# laws of Japan.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9#
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer as
12#    the first lines of this file unmodified.
13# 2. Redistributions in binary form must reproduce the above copyright
14#    notice, this list of conditions and the following disclaimer in the
15#    documentation and/or other materials provided with the distribution.
16#
17# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27#
28# $FreeBSD: releng/10.3/sys/boot/pc98/boot0.5/putssjis.s 168457 2007-04-07 08:37:04Z kato $
29#
30
31	.code16
32	.section	.putssjis, "awx", @progbits
33
34	#
35	# Display string with Shift-JIS support
36	# %si: addres of string, %di: T-VRAM address, %cx: count
37	#
38
39	# Absolute address of putssjis_entry must be 0x1243.
40putssjis_entry:
41	push	%es
42	push	%ax
43	# Setup the T-VRAM segement address.
44	xorw	%ax, %ax
45	movw	%ax, %es
46	movw	$0xa000, %ax
47	testb	$0x08, %es:0x501
48	jz	normalmode
49	movw	$0xe000, %ax
50normalmode:
51	movw	%ax, %es
52
53putssjis_loop:
54	lodsw
55	call	check_sjis
56	jc	put_2byte_char
57
58	# 1 byte character
59	xorb	%ah, %ah
60	testb	$0xe0, %al	# Check control code.
61	jnz	put_1byte_char
62	movb	$0x20, %al	# Convert control code into the space.
63put_1byte_char:
64	stosw
65	decw	%si
66	jmp	putssjis_loop_end
67
68put_2byte_char:
69	subb	$0x20, %al
70
71	# Check 2byte "hankaku"
72	cmp	$0x09, %al
73	je	put_2byte_hankaku
74	cmp	$0x0a, %al
75	je	put_2byte_hankaku
76	cmp	$0x0b, %al
77	je	put_2byte_hankaku
78	jmp	put_2byte_zenkaku
79
80put_2byte_hankaku:
81	stosw
82	jmp	putssjis_loop_end
83
84put_2byte_zenkaku:
85	stosw
86	orb	$0x80, %ah
87	stosw
88	decw	%cx
89
90putssjis_loop_end:
91	loop	putssjis_loop
92
93	pop	%ax
94	pop	%es
95	ret
96
97	# Check 2-byte code.
98check_sjis:
99	cmpb	$0x80, %al
100	jbe	found_ank_kana
101	cmpb	$0xa0, %al
102	jb	found_2byte_char
103	cmpb	$0xe0, %al
104	jb	found_ank_kana
105	cmpb	$0xf0, %al
106	jae	found_ank_kana
107	jmp	found_2byte_char
108found_ank_kana:
109	clc
110	ret
111
112found_2byte_char:
113	# Convert Shift-JIS into JIS.
114	cmpb	$0x9f, %al
115	ja	sjis_h_2		# Upper > 0x9f
116	subb	$0x71, %al		# Upper -= 0x71
117	jmp	sjis_lower
118sjis_h_2:
119	subb	$0xb1, %al		# Upper -= 0xb1
120sjis_lower:
121	salb	%al			# Upper *= 2
122	incb	%al			# Upper += 1
123
124	cmpb	$0x7f, %ah
125	jbe	sjis_l_2
126	decb	%ah			# Lower -= 1 if lower > 0x7f
127sjis_l_2:
128	cmpb	$0x9e, %ah
129	jb	sjis_l_3
130	subb	$0x7d, %ah		# Lower -= 0x7d
131	incb	%al			# Upper += 1
132	jmp	check_2byte_end
133sjis_l_3:
134	subb	$0x1f, %ah		# Lower -= 0x1f
135check_2byte_end:
136	stc
137	ret
138