--- /dev/null
+; MMURTL Operating System Source Code\r
+; Copyright 1991,1992,1993,1994 Richard A. Burgess\r
+; ALL RIGHTS RESERVED Version 1.0\r
+\r
+.DATA\r
+.INCLUDE MOSEDF.INC\r
+;=============================================================================\r
+.CODE\r
+;=============================================================================\r
+;\r
+; HextoDD - Converts a text string of Hex chars to a DD\r
+; This converts an ASCII string of hex digits to a DD (3 params)\r
+; 1) 32 bit near ptr to the ASCII Hex String\r
+; 2) The 32 Bit Near Ptr (relative to DS) of returned DD\r
+; 3) DD with count of bytes in string\r
+; This can easily be converted to accept a DF (48 bit Far Ptr)\r
+; EAX returns ercBadString if string supplied was not convertable!\r
+; This only saves segment registers!!!\r
+;\r
+pHexStr EQU DWORD PTR [EBP+10h]\r
+pDDOut EQU DWORD PTR [EBP+0Ch]\r
+cbHexStr EQU DWORD PTR [EBP+08h]\r
+HexTotal EQU DWORD PTR [EBP-04h] ;Local variable\r
+\r
+PUBLIC HexToDD:\r
+ ENTER 4,0\r
+ MOV ECX,cbHexStr ;how long is the string\r
+ MOV ESI,pHexStr ;EBX points to str[1]\r
+ ADD ESI, ECX ;EBX points to str[cbStr] (LSD)\r
+ DEC ESI ;Offset of last is p - 1\r
+ MOV EDI,pDDOut ;prepare to return answer\r
+ MOV HexTotal, 0 ;start with nothing\r
+ MOV EBX, 1 ;First mutliplier\r
+NextHex:\r
+ XOR EAX, EAX\r
+ MOV AL, [ESI]\r
+ CMP AL, 47h ;\r
+ JB Hex000 ;It's not lower case...\r
+ AND AL, 01001111b ;make it Upper case\r
+Hex000:\r
+ CMP AL, 30h ;Less than "0"?\r
+ JB BadHex ;Yes...\r
+ SUB AL, 30h ;No, make it a binary number\r
+ CMP AL, 0Ah ;Is it A-F??\r
+ JB Hex001\r
+ SUB AL, 07h ;Yes, make it a number\r
+Hex001:\r
+ MUL EBX ;TIMES multiplier\r
+ ADD EAX, HexTotal ;add to total\r
+ MOV HexTotal, EAX\r
+ SHL EBX, 4 ;increase mutiplier TIMES 16\r
+ DEC ESI\r
+ LOOP NextHex\r
+ MOV EAX, HexTotal\r
+ MOV [EDI], EAX\r
+ MOV EAX, ercOk\r
+ JMP HexDone\r
+BadHex:\r
+ MOV EAX, ercBadString\r
+HexDone:\r
+ LEAVE\r
+ RETN 12\r
+\r
+;=============================================================================\r
+;\r
+; DecToDD:\r
+; This converts an ASCII string of Decimal digits to a DD (3 params)\r
+; 1) 32 bit near ptr to the ASCII Decimal String\r
+; 2) The 32 Bit Near Ptr (relative to DS) of returned DD\r
+; 3) DD with count of bytes in string\r
+; EAX returns ercBadString if string supplied was not convertable!\r
+;\r
+;=============================================================================\r
+\r
+pDecStr EQU DWORD PTR [EBP+16]\r
+pDDOut1 EQU DWORD PTR [EBP+12]\r
+cbDecStr EQU DWORD PTR [EBP+08]\r
+DecTotal EQU DWORD PTR [EBP-04]\r
+\r
+PUBLIC DecToDD:\r
+ ENTER 4,0\r
+ MOV ECX,cbDecStr ;how long is the string\r
+ MOV ESI,pDecStr ;EBX points to str[1]\r
+ ADD ESI, ECX ;EBX points to str[cbStr] (LSD)\r
+ DEC ESI ;Offset of last is p - 1\r
+ MOV EDI,pDDOut1 ;prepare to return answer\r
+ MOV DecTotal, 0 ;start with nothing\r
+ MOV EBX, 1 ;First mutliplier\r
+NextDec:\r
+ XOR EAX, EAX\r
+ MOV AL, [ESI]\r
+ CMP AL, 39h ;> "9"?\r
+ JA BadDec ;It's not lower case...\r
+Dec000:\r
+ CMP AL, 30h ;Less than "0"?\r
+ JB BadDec ;Yes...\r
+ SUB AL, 30h ;No, make it a binary number\r
+ MUL EBX ;TIMES multiplier\r
+ ADD EAX, DecTotal ;add to total\r
+ MOV DecTotal, EAX\r
+ MOV EAX, 10\r
+ MUL EBX ;increase mutiplier TIMES 10\r
+ MOV EBX, EAX\r
+ DEC ESI\r
+ LOOP NextDec\r
+ MOV EAX, DecTotal\r
+ MOV [EDI], EAX\r
+ MOV EAX, ercOk\r
+ JMP DecDone\r
+BadDec:\r
+ MOV EAX, ercBadString\r
+DecDone:\r
+ LEAVE\r
+ RETN 12\r
+\r
+;=============================================================================\r
+;\r
+; DDtoHex:\r
+; This converts a DD to an 8 Byte ASCII String in Hex (2 params)\r
+; 1) the DD to convert\r
+; 2) The 32 Bit Near Ptr (relative to DS) of returned string\r
+;\r
+;=============================================================================\r
+\r
+DDin EQU DWORD PTR [EBP+0Ch]\r
+pStrOut EQU DWORD PTR [EBP+08h]\r
+\r
+PUBLIC DDtoHex:\r
+ ENTER 0,0\r
+ PUSHAD\r
+ MOV EAX,DDin\r
+ MOV EDI,pStrOut\r
+ MOV ECX,8h\r
+DDAgain:\r
+ MOV BL,AL\r
+ AND BL,0Fh\r
+ MOV BH,30h ;0 in ASCII\r
+ ADD BH, BL\r
+ CMP BH,39h\r
+ JLE SHORT PutOut\r
+ ADD BH,7\r
+PutOut:\r
+ MOV [EDI+ECX-1],BH\r
+ DEC ECX\r
+ JZ SHORT DDDone\r
+ SHR EAX,4\r
+ JMP SHORT DDAgain\r
+ddDone: POPAD\r
+ LEAVE\r
+ RETN 08h\r
+\r
+;=============================================================================\r
+;\r
+; DDtoDec:\r
+; This converts a DD to a 10 Byte ASCII DECIMAL String (2 params)\r
+; 1) the DD to convert\r
+; 2) The 32 Bit Near Ptr (relative to DS) of returned string\r
+; This can easily be converted to accept a DF (48 bit Far Ptr)\r
+;\r
+;=============================================================================\r
+\r
+DDinD EQU DWORD PTR [EBP+0Ch]\r
+pStrOutD EQU DWORD PTR [EBP+08h]\r
+\r
+PUBLIC DDtoDec:\r
+ ENTER 0,0\r
+ PUSHAD\r
+ MOV ESI,DDin ;ESI has what's left of DD\r
+ MOV EDI,pStrOut\r
+ MOV ECX,10\r
+ MOV EBX, 1000000000 ;A billion (exactly...DUH)\r
+ MOV AL, 30h ;A zero (ASCII)\r
+DDtoDec0:\r
+ CMP ESI, EBX\r
+ JB DDtoDec1 ;Go for the next digit\r
+ SUB ESI, EBX\r
+ INC AL\r
+ JMP DDtoDec0\r
+DDtoDec1:\r
+ MOV [EDI], AL ;Give them this byte\r
+ INC EDI ;setup for next byte in string\r
+ XOR EDX,EDX ;Div EBX by 10 put back in EBX\r
+ MOV EAX,EBX\r
+ MOV EBX,10\r
+ DIV EBX\r
+ MOV EBX, EAX ;\r
+ MOV AL, 30h ;start with zero again\r
+ LOOP DDtoDec0 ;Go back for more\r
+ POPAD\r
+ LEAVE\r
+ RETN 08h\r
+\r
+;============ End of Module ==================\r