; ******************************************************* ; * * ; * Turbo Pascal Run-time Library * ; * Integer Binary/Decimal Routines * ; * * ; * Copyright (c) 1988,92 Borland International * ; * * ; ******************************************************* TITLE DINT INCLUDE SE.ASM CODE SEGMENT BYTE PUBLIC ASSUME CS:CODE ; Publics PUBLIC Int2Str,Str2Int ; Convert integer to string ; In DX:AX = Value ; ES:DI = String end pointer ; Out CX = String length ; ES:DI = String pointer Int2Str: MOV CX,DI MOV SI,10 MOV BX,DX OR BX,BX JNS @@1 NEG BX NEG AX SBB BX,0 CALL @@1 DEC DI MOV ES:[DI].b0,'-' INC CX RET @@1: XOR DX,DX XCHG AX,BX DIV SI XCHG AX,BX DIV SI ADD DL,'0' CMP DL,'0'+10 JB @@2 ADD DL,'A'-'0'-10 @@2: DEC DI MOV ES:[DI],DL MOV DX,AX OR DX,BX JNE @@1 SUB CX,DI RET ; Convert string to integer ; In CX = String length ; ES:DI = String pointer ; Out DX:AX = Value ; CX = Remaining characters ; ES:DI = Pointer past string ; CF = 1 if error Str2Int: XOR AX,AX XOR DX,DX XOR SI,SI JCXZ @@6 CMP BYTE PTR ES:[DI],'+' JE @@1 CMP BYTE PTR ES:[DI],'-' JNE @@2 DEC SI @@1: INC DI DEC CX JE @@6 @@2: CMP BYTE PTR ES:[DI],'$' JE @@7 @@3: MOV BL,ES:[DI] SUB BL,'0'+10 ADD BL,10 JNC @@4 TEST DH,0F0H JNE @@6 PUSH BX SHL AX,1 RCL DX,1 PUSH DX PUSH AX SHL AX,1 RCL DX,1 SHL AX,1 RCL DX,1 POP BX ADD AX,BX POP BX ADC DX,BX POP BX XOR BH,BH ADD AX,BX ADC DX,0 INC DI LOOP @@3 @@4: MOV BX,AX OR BX,DX JE @@5a OR SI,SI JNS @@5 NEG DX NEG AX SBB DX,0 @@5: XOR SI,DX JS @@6 @@5a: RET @@6: STC RET @@7: INC DI DEC CX JE @@6 @@8: MOV BL,ES:[DI] CMP BL,'a' JB @@9 SUB BL,32 @@9: SUB BL,'0'+10 ADD BL,10 JC @@10 SUB BL,7+16 ADD BL,6 JNC @@4 ADD BL,10 @@10: MOV BH,4 @@11: SHL AX,1 RCL DX,1 JC @@6 DEC BH JNE @@11 OR AL,BL INC DI LOOP @@8 OR SI,SI JNS @@12 NEG DX NEG AX SBB DX,0 @@12: CLC RET CODE ENDS END