PRINT_UNSIGNED	PROC	NEAR

	  PUSH	AX
          PUSH	BX
	  PUSH	CX
	  PUSH	DX

	  XOR	CX,CX
	  MOV	BX,10
_CALC_DIGS:
	  XOR	DX,DX
	  DIV	BX
	  PUSH	DX
	  INC	CX
	  CMP	AX,0
	  JNE	_CALC_DIGS

_PRINT_DIGS:
	  POP	DX
	  MOV	AH,02H
	  ADD	DL,'0'
	  INT	21H
	  LOOP	_PRINT_DIGS

	  POP	DX
	  POP	CX
	  POP	BX
          POP	AX
	  RET

PRINT_UNSIGNED	ENDP

PRINT_SIGNED	PROC	NEAR
	  PUSH  DX
	  PUSH	AX
	  CMP AX,0
	  JGE _PS_PRINT
	  PUSH AX
	  MOV AH,02H
	  MOV DL,'-'
	  INT 21H
	  POP AX
	  NEG AX
_PS_PRINT:
	  CALL PRINT_UNSIGNED
      POP	AX
      POP       DX
	  RET

PRINT_SIGNED	ENDP

READ_UNSIGNED	PROC	NEAR
	  PUSH	BX
	  PUSH	CX
	  PUSH	DX

	  MOV	BX,10
	  XOR	AX,AX	  
_RU_READ_CHAR:
	  PUSH  AX
	  MOV	AH,01H
	  INT	21H
	  CMP	AL,0DH
	  JE	_RU_DONE
	  SUB	AL,'0'
          XOR	CH,CH
          MOV	CL,AL
	  POP	AX
	  MUL	BX	;TIMES 10
	  ADD	AX,CX
	  JMP	_RU_READ_CHAR
_RU_DONE:
        POP AX          
	  POP	DX
	  POP	CX
	  POP	BX
	  RET
READ_UNSIGNED	ENDP      

READ_SIGNED	PROC	NEAR
	  PUSH	BX
	  PUSH	CX
	  PUSH	DX
	  PUSH	SI

	  XOR	SI,SI
	  MOV	BX,10
	  XOR	AX,AX	  
	  PUSH  AX	  
_FIRST_CHAR:
	  MOV	AH,01H
	  INT	21H
	  CMP	AL,0DH
	  JE   _DONE
_MINUS:	  CMP	AL,'-'
	  JNE	_PLUS
	  MOV	SI,1
	  POP	AX
	  JMP	_READ_CHAR
_PLUS:	  CMP	AL,'+'
	  JNE	_SPACE
	  POP	AX
	  JMP	_READ_CHAR
_SPACE:	  CMP	AL,' '
	  JE	_FIRST_CHAR
	  SUB	AL,'0'
          XOR	CH,CH
          MOV	CL,AL
	  POP	AX
	  MUL	BX	;TIMES 10
	  ADD	AX,CX
_READ_CHAR:
	  PUSH  AX
	  MOV	AH,01H
	  INT	21H
	  CMP	AL,0DH
	  JE	_DONE
	  SUB	AL,'0'
          XOR	CH,CH
          MOV	CL,AL
	  POP	AX
	  MUL	BX	;TIMES 10
	  ADD	AX,CX
	  JMP	_READ_CHAR
_DONE:
                  
          POP	AX
	  CMP	SI,1
	  JNE	_RESTORE
	  NEG	AX
_RESTORE:
	  POP	SI
	  POP	DX
	  POP	CX
	  POP	BX
	  RET
READ_SIGNED	ENDP     
