]> pd.if.org Git - mmurtl/blob - ossource/numcnvrt.asm
autocommit for file dated 2003-12-29 17:36:54
[mmurtl] / ossource / numcnvrt.asm
1 ;   MMURTL Operating System Source Code\r
2 ;   Copyright 1991,1992,1993,1994 Richard A. Burgess\r
3 ;   ALL RIGHTS RESERVED   Version 1.0\r
4 \r
5 .DATA\r
6 .INCLUDE MOSEDF.INC\r
7 ;=============================================================================\r
8 .CODE\r
9 ;=============================================================================\r
10 ;\r
11 ; HextoDD - Converts a text string of Hex chars to a DD\r
12 ; This converts an ASCII string of hex digits to a DD  (3 params)\r
13 ;  1) 32 bit near ptr to the ASCII Hex String\r
14 ;  2) The 32 Bit Near Ptr (relative to DS) of returned DD\r
15 ;  3) DD with count of bytes in string\r
16 ;  This can easily be converted to accept a DF (48 bit Far Ptr)\r
17 ;  EAX returns ercBadString if string supplied was not convertable!\r
18 ;  This only saves segment registers!!!\r
19 ;\r
20 pHexStr         EQU DWORD PTR [EBP+10h]\r
21 pDDOut          EQU DWORD PTR [EBP+0Ch]\r
22 cbHexStr        EQU DWORD PTR [EBP+08h]\r
23 HexTotal        EQU DWORD PTR [EBP-04h]   ;Local variable\r
24 \r
25 PUBLIC HexToDD:\r
26                 ENTER 4,0\r
27                 MOV ECX,cbHexStr        ;how long is the string\r
28                 MOV ESI,pHexStr         ;EBX points to str[1]\r
29                 ADD ESI, ECX            ;EBX points to str[cbStr] (LSD)\r
30                 DEC ESI                 ;Offset of last is p - 1\r
31                 MOV EDI,pDDOut          ;prepare to return answer\r
32                 MOV HexTotal, 0         ;start with nothing\r
33                 MOV EBX, 1              ;First mutliplier\r
34 NextHex:\r
35                 XOR EAX, EAX\r
36                 MOV AL, [ESI]\r
37                 CMP AL, 47h             ;\r
38                 JB Hex000               ;It's not lower case...\r
39                 AND AL, 01001111b       ;make it Upper case\r
40 Hex000:\r
41                 CMP AL, 30h             ;Less than "0"?\r
42                 JB BadHex               ;Yes...\r
43                 SUB AL, 30h             ;No, make it a binary number\r
44                 CMP AL, 0Ah             ;Is it A-F??\r
45                 JB Hex001\r
46                 SUB AL, 07h             ;Yes, make it a number\r
47 Hex001:\r
48                 MUL EBX                 ;TIMES multiplier\r
49                 ADD EAX, HexTotal       ;add to total\r
50                 MOV HexTotal, EAX\r
51                 SHL EBX, 4              ;increase mutiplier TIMES 16\r
52                 DEC ESI\r
53                 LOOP NextHex\r
54                 MOV EAX, HexTotal\r
55                 MOV [EDI], EAX\r
56                 MOV EAX, ercOk\r
57                 JMP HexDone\r
58 BadHex:\r
59                 MOV EAX, ercBadString\r
60 HexDone:\r
61                 LEAVE\r
62                 RETN 12\r
63 \r
64 ;=============================================================================\r
65 ;\r
66 ; DecToDD:\r
67 ; This converts an ASCII string of Decimal digits to a DD  (3 params)\r
68 ;  1) 32 bit near ptr to the ASCII Decimal String\r
69 ;  2) The 32 Bit Near Ptr (relative to DS) of returned DD\r
70 ;  3) DD with count of bytes in string\r
71 ;  EAX returns ercBadString if string supplied was not convertable!\r
72 ;\r
73 ;=============================================================================\r
74 \r
75 pDecStr         EQU DWORD PTR [EBP+16]\r
76 pDDOut1         EQU DWORD PTR [EBP+12]\r
77 cbDecStr        EQU DWORD PTR [EBP+08]\r
78 DecTotal        EQU DWORD PTR [EBP-04]\r
79 \r
80 PUBLIC DecToDD:\r
81                 ENTER 4,0\r
82                 MOV ECX,cbDecStr        ;how long is the string\r
83                 MOV ESI,pDecStr         ;EBX points to str[1]\r
84                 ADD ESI, ECX            ;EBX points to str[cbStr] (LSD)\r
85                 DEC ESI                 ;Offset of last is p - 1\r
86                 MOV EDI,pDDOut1         ;prepare to return answer\r
87                 MOV DecTotal, 0         ;start with nothing\r
88                 MOV EBX, 1              ;First mutliplier\r
89 NextDec:\r
90                 XOR EAX, EAX\r
91                 MOV AL, [ESI]\r
92                 CMP AL, 39h             ;> "9"?\r
93                 JA BadDec               ;It's not lower case...\r
94 Dec000:\r
95                 CMP AL, 30h             ;Less than "0"?\r
96                 JB BadDec               ;Yes...\r
97                 SUB AL, 30h             ;No, make it a binary number\r
98                 MUL EBX                 ;TIMES multiplier\r
99                 ADD EAX, DecTotal       ;add to total\r
100                 MOV DecTotal, EAX\r
101                 MOV EAX, 10\r
102                 MUL EBX                 ;increase mutiplier TIMES 10\r
103                 MOV EBX, EAX\r
104                 DEC ESI\r
105                 LOOP NextDec\r
106                 MOV EAX, DecTotal\r
107                 MOV [EDI], EAX\r
108                 MOV EAX, ercOk\r
109                 JMP DecDone\r
110 BadDec:\r
111                 MOV EAX, ercBadString\r
112 DecDone:\r
113                 LEAVE\r
114                 RETN 12\r
115 \r
116 ;=============================================================================\r
117 ;\r
118 ; DDtoHex:\r
119 ; This converts a DD to an 8 Byte ASCII String in Hex (2 params)\r
120 ;  1) the DD to convert\r
121 ;  2) The 32 Bit Near Ptr (relative to DS) of returned string\r
122 ;\r
123 ;=============================================================================\r
124 \r
125 DDin    EQU DWORD PTR [EBP+0Ch]\r
126 pStrOut EQU DWORD PTR [EBP+08h]\r
127 \r
128 PUBLIC DDtoHex:\r
129                 ENTER 0,0\r
130                 PUSHAD\r
131                 MOV EAX,DDin\r
132                 MOV EDI,pStrOut\r
133                 MOV ECX,8h\r
134 DDAgain:\r
135                 MOV BL,AL\r
136                 AND BL,0Fh\r
137                 MOV BH,30h              ;0 in ASCII\r
138                 ADD BH, BL\r
139                 CMP BH,39h\r
140                 JLE SHORT PutOut\r
141                 ADD BH,7\r
142 PutOut:\r
143                 MOV [EDI+ECX-1],BH\r
144                 DEC ECX\r
145                 JZ SHORT DDDone\r
146                 SHR EAX,4\r
147                 JMP SHORT DDAgain\r
148 ddDone: POPAD\r
149                 LEAVE\r
150                 RETN 08h\r
151 \r
152 ;=============================================================================\r
153 ;\r
154 ; DDtoDec:\r
155 ; This converts a DD to a 10 Byte ASCII DECIMAL String  (2 params)\r
156 ;  1) the DD to convert\r
157 ;  2) The 32 Bit Near Ptr (relative to DS) of returned string\r
158 ;  This can easily be converted to accept a DF (48 bit Far Ptr)\r
159 ;\r
160 ;=============================================================================\r
161 \r
162 DDinD           EQU DWORD PTR [EBP+0Ch]\r
163 pStrOutD        EQU DWORD PTR [EBP+08h]\r
164 \r
165 PUBLIC DDtoDec:\r
166                 ENTER 0,0\r
167                 PUSHAD\r
168                 MOV ESI,DDin            ;ESI has what's left of DD\r
169                 MOV EDI,pStrOut\r
170                 MOV ECX,10\r
171                 MOV EBX, 1000000000     ;A billion (exactly...DUH)\r
172                 MOV AL, 30h             ;A zero (ASCII)\r
173 DDtoDec0:\r
174                 CMP ESI, EBX\r
175                 JB  DDtoDec1            ;Go for the next digit\r
176                 SUB ESI, EBX\r
177                 INC AL\r
178                 JMP DDtoDec0\r
179 DDtoDec1:\r
180                 MOV [EDI], AL           ;Give them this byte\r
181                 INC EDI                 ;setup for next byte in string\r
182                 XOR EDX,EDX             ;Div EBX by 10 put back in EBX\r
183                 MOV EAX,EBX\r
184                 MOV EBX,10\r
185                 DIV EBX\r
186                 MOV EBX, EAX            ;\r
187                 MOV AL, 30h             ;start with zero again\r
188                 LOOP DDtoDec0           ;Go back for more\r
189                 POPAD\r
190                 LEAVE\r
191                 RETN 08h\r
192 \r
193 ;============ End of Module ==================\r