60.asm
lima21bd_Heaven-of-Assembly/60.asm
.MODEL SMALL
 .STACK 100H

 .DATA
   PROMPT_1  DB  'Enter a decimal digit string : $'
   PROMPT_2  DB  0DH,0AH,'The sum of the decimal digit string in Hex is : $'
   ILLEGAL   DB  0DH,0AH,'Illegal character. Try again : $'

   TEMP      DW  ?
   VALUE     DW  ?
   v         dw  ?

 .CODE
   MAIN PROC
     MOV AX, @DATA                ; initialize DS
     MOV DS, AX

     LEA DX, PROMPT_1             ; load and display the string PROMPT_1
     MOV AH, 9
     INT 21H

     JMP @START_2                 ; jump to label @START_2 

     @START_1:                    ; jump label
       LEA DX, ILLEGAL            ; load and display the string ILLEGAL 
       MOV AH, 9
       INT 21H

     XOR BX, BX                   ; clear BX
     XOR CX, CX                   ; clear CX

     @START_2:                    ; jump label
       MOV AH, 1
       INT 21H

       INC CX                     ; increment CX

       CMP AL, 0DH                ; compare AL with CR
       JNE @SKIP                  ; jump to label @SKIP if AL!=CR

       CMP CX, 1                  ; compare CX with 1
       JB @START_1                ; jump to label @START_1 if CX<1
       JMP @END_INPUT             ; jump to label @END_INPUT

       @SKIP:                     ; jump label

       CMP AL, 30H                ; compare AL with 0
       JB @START_1                ; jump to label @START_1 of AL<0

       CMP AL, 39H                ; compare AL with 1
       JA @START_1                ; jump to label @START_1 if AL>9

       AND AL, 0FH                ; convert the ascii to decimal code
       XOR AH, AH                 ; clear AH
       ADD BX, AX                 ; add BX and AX

       JMP @START_2               ; jump to label @START_2

     @END_INPUT:                  ; jump label

     LEA DX, PROMPT_2             ; load and display the string PROMPT_2
     MOV AH, 9
     INT 21H

     MOV CX, 4                    ; initialize loop counter
     MOV AH, 2                    ; set output function

     @LOOP_1:                     ; loop label
       XOR DX, DX                 ; clear DX

       @LOOP_2:                   ; jump label
         SHL BX, 1                ; shift BX towards left by 1 position
         RCL DL, 1                ; rotate DL towards left by 1 position
         INC DH                   ; increment DH
         CMP DH, 4                ; compare DH with 4
       JNE @LOOP_2                ; jump to label @LOOP_2 if DH!=4

       CMP DL, 9                  ; compare DL with 9
       JBE @NUMERIC_DIGIT         ; jump to label @NUMERIC_DIGIT if DL<=9
       SUB DL, 9                  ; convert it to number i.e. 1,2,3,4,5,6
       OR DL, 40H                 ; convert number to letter i.e. A,B...F
       JMP @DISPLAY               ; jump to label @DISPLAY

       @NUMERIC_DIGIT:            ; jump label
         OR DL, 30H               ; convert decimal to ascii code

       @DISPLAY:                  ; jump label
         INT 21H                  ; print the character
     LOOP @LOOP_1                 ; jump to label @LOOP_1 if CX!=0

     MOV AH, 4CH                  ; return control to DOS
     INT 21H
   MAIn ENDP   
 END MAIN