summaryrefslogtreecommitdiffstats
path: root/pathname.asm
blob: 6525ff0924bc7b74b68791535851a4bdb774f8ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/* -*- asm -*- ----------------------------------------------------------- *
 *   
 *   Copyright 2013 H. Peter Anvin - All Rights Reserved
 *
 *   Permission is hereby granted, free of charge, to any person
 *   obtaining a copy of this software and associated documentation
 *   files (the "Software"), to deal in the Software without
 *   restriction, including without limitation the rights to use,
 *   copy, modify, merge, publish, distribute, sublicense, and/or
 *   sell copies of the Software, and to permit persons to whom
 *   the Software is furnished to do so, subject to the following
 *   conditions:
 *   
 *   The above copyright notice and this permission notice shall
 *   be included in all copies or substantial portions of the Software.
 *   
 *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 *   OTHER DEALINGS IN THE SOFTWARE.
 *
 * ----------------------------------------------------------------------- */

#include "v9fs.h"

	.code16
	.section ".rtext","ax"

/* ------------------------------------------------------------------------- *
 *  genpath_asciiz
 *
 *  Convert a DOS-format path in FS:SI into a walk path in (ES|DS):DI
 *
 *  The DOS path is expected to be an absolute path starting with \
 * ------------------------------------------------------------------------- */
GPROC(genpath_asciiz)
	pushw %bx
	pushw %ax
	movw %si,%bx
1:
	movb %fs:(%bx),%al
	incw %bx
	andb %al,%al
	jnz 1b
	decw %bx
	popw %ax
	call genpath
	popw %bx
	retw
END(genpath_asciiz)
	
/* ------------------------------------------------------------------------- *
 *  genpath
 *
 *  Convert a DOS-format path in FS:SI into a walk path in (ES|DS):DI
 *  BX marks the end of the path to convert.
 *
 *  The DOS path is expected to be an absolute path starting with \
 * ------------------------------------------------------------------------- */

GPROC(genpath)
	pushw %bp
	movw %sp,%bp
	pushw %bx		/* -2(%bp) - end of string */
	pushw %di		/* -4(%bp) - chunk count pointer */
	pushw %ax		/* -6(%bp) */

#ifdef DEBUG
	debugmsg "P: "
	pushw %ds
	pushw %fs
	popw %ds
	pushw %si
	call debug_puts
	popw %ds
	debugmsg " "
	pushw %si
	call debug_printhex4
	debugmsg " "
	pushw %bx
	call debug_printhex4
	call debug_crlf
#endif
	
	incw %si		/* Skip leading backslash */
	
	xorw %ax,%ax
	stosw

1:
	cmpw -2(%bp),%si
	jae 4f			/* End of string */

	stosw			/* Chunk length */
	movw %di,%bx		/* Save pointer to chunk beginning */

2:
	cmpw -2(%bp),%si
	jae 3f

	fs lodsb
	cmpb $0x5c,%al		/* Backslash */
	je 3f

	call cptoutf
	jmp 2b
3:
	/* Update chunk length */
	movw %di,%ax
	subw %bx,%ax
	movw %ax,-2(%bx)

	/* Update chunk count */
	movw -4(%bp),%bx
	incw (%bx)
	jmp 1b
4:
	popw %ax
	popw %bx		/* Drop saved %di */
	popw %bx
	popw %bp
	retw
END(genpath)