]> pd.if.org Git - mmurtl/commitdiff
autocommit for file dated 1994-12-20 09:58:02
authorRichard Burgess <>
Tue, 20 Dec 1994 09:58:02 +0000 (09:58 +0000)
committerNathan Wagner <nw@hydaspes.if.org>
Mon, 17 Oct 2016 14:03:47 +0000 (14:03 +0000)
ossource/numcnvrt.asm [new file with mode: 0644]

diff --git a/ossource/numcnvrt.asm b/ossource/numcnvrt.asm
new file mode 100644 (file)
index 0000000..60622ee
--- /dev/null
@@ -0,0 +1,193 @@
+;   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