
; pusher , poper
; cls2 screen,y1,y2
; cls3 screen,x1,x2
;~~~~~~~~~~~~~~~~~~~~~
pusher macro a,b,c,d,e
	push a
	push b
	ifnb<c>
		push c
	endif
	ifnb<d> 
		push d
	endif
	ifnb<e>
		push e
	endif 
ENDM
;~~~~~~~~~~~~~~~~~~~~~
poper macro a,b,c,d,e
	pop a
	pop b
	ifnb <c>
		pop c
		ifnb<d>
			pop d
			ifnb <e>
			   pop e
			endif
		endif
	endif
ENDM
;~~~~~~~~~~~~~~~~~~~~~
cls2 MACRO screen,a,b
	pusher ax,bx,cx,dx
	mov bh,screen
	mov ch,a
	mov dh,b
	mov al,0
	mov cl,0
	mov dl,79
	mov ax,0600h
	INT 10H
	poper dx,cx,bx,ax
ENDM
;~~~~~~~~~~~~~~~~~~~~~
cls3 MACRO screen,a,b
	pusher ax,bx,cx,dx
	mov bh,screen
	mov cl,a
	mov dl,b
	mov al,0
	mov ch,0
	mov dh,24
	mov ax,0600h
	INT 10H
	poper dx,cx,bx,ax
ENDM
;~~~~~~~~~~~~~~~~~~~~~

; gets:	cin.get ( [dx],cx ) 
; puts:	cout << [dx]
; putc:	cout << dl 
; endl:	cout << endl
;---------------------------------
; cls:	clear screen (bh)
; cursor   move cursor to (dl,dh)
; hidecursor
; showcursor
; sleep	ch second and cl h.s
;----------------------------------
; len	ax <- strlen ( [si] )
; strcpy	[di] <- [si]
;----------------------------------
; itoa	[dx] <- ax
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
proceseg segment
assume cs:proceseg
gets proc far; inputs [dx],cl ;  changes cx
	pusher ax,bx,dx
	mov bx,dx
	sub cl,2
	mov [bx],cl
	mov ah,10
	int 21h
	mov cl,[bx]+1
	mov ch,0
loop1:		mov al,[bx+2]
		cmp al,13
		je endofloop1
		mov [bx],al
		inc bx
		jmp loop1
endofloop1:	
	mov byte ptr[bx],'$'
	mov dl,10
	mov ah,2
	int 21h
	poper  dx,bx,ax
	Ret
gets endp
;-----------------------------------------------------------------
puts proc far; cout << [dx]
	push ax
	mov ah,9
	int 21h
	pop ax	
	ret
puts endp
;-----------------------------------------------------------------
putc proc far ; cout<<dl
	push ax
	mov ah,2
	int 21h
	pop ax
	ret
putc endp
;-----------------------------------------------------------------
endl proc far ; cout<<endl
	pusher ax,dx
	mov ah,2
	mov dl,10
	int 21h
	mov dl,13
	int 21h
	poper dx,ax
	Ret
endl endp
;-----------------------------------------------------------------
cls proc far ; clear screen (bh)
	pusher ax,bx,cx,dx
	mov ax,600h
	mov cx,0000H
	mov dx,184FH
	int 10H
	poper dx,cx,bx,ax
	ret
cls endp	
;-----------------------------------------------------------------
cursor proc far ; move cursor to (dl,dh)
	pusher ax,bx
	mov ah,2
	mov bh,0
	int 10h
	poper bx,ax
	Ret
cursor endp
;-----------------------------------------------------------------
hidecursor proc far
	pusher ax,cx
	mov ah,1
	mov ch,-1
	mov cl,0
	int 10h
	poper cx,ax
	ret
hidecursor endp
;-------------------------------------
showcursor proc far
	pusher ax,cx
	mov ah,1
	mov ch,0
	mov cl,1
	int 10h
	poper cx,ax
	ret
showcursor endp
;-----------------------------------------------------------------
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sleep proc far ; ch second and cl HS
	pusher ax,bx,cx,dx,si
	mov bx,cx
	mov ah,2ch
	int 21h
	add bh,dh
	add bl,dl
	CMP BL, 100 
	Jb next
	SUB BL, 100
	INC BH
next:	mov ax,bx
	mov bl,cl	
	cmp ah,60
	jb next2
	inc bl
	sub ah,60
next2:	mov si,ax
check:
	mov ah,2ch
	int 21h
	cmp cl,bl
	jb check
	ja quit
	cmp dx,si
	JB CHECK
quit:	poper si,dx,cx,bx,ax
	ret
sleep ENDP
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
len proc far; ax <- strlen( [si] )
	push si
	mov ax,0
loop1:  cmp byte ptr [si],'$'
	    je end1
	    inc ax
	    inc si
	    jmp loop1
end1: pop si
	Ret
len endp
;----------------------------------------------------
strcpy proc far ; di <-- si
	pusher ax,si,di
	whileSI:
		cmp byte ptr[si],'$'
		je end1
		mov al,[si]
		mov [di],al
		inc si
		inc di
	jmp whileSI
end1:
	mov byte ptr [di],'$'
	poper di,si,ax
	Ret
strcpy endp
;----------------------------------------------------
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
itoa proc far ; [dx]<-- ax 
	pusher ax,bx,dx,si,di
	mov si,dx
	cmp ax,0
	jge cont
	mov [si],byte ptr '-'
	inc si
	neg ax
cont: 	mov di,si
		mov bx,10
loop1:
	mov dx,0
	div bx
	add dl,'0'
	mov [si],dl
	inc si
	cmp ax,0
	jne loop1
	mov byte ptr [si],'$'
	dec si
	
loop2:	cmp si,di
		jna end1
		mov al,[si]
		mov ah,[di]
		mov [si],ah
		mov [di],al
		dec si
		inc di
		jmp loop2
end1:	
	poper di,si,dx,bx,ax
	Ret
itoa endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
proceseg ends

extraSeg segment
assume cs:extraseg,ds:extraseg
	tab		equ 20
	color1	equ 	37h ; 2fh
	color2	equ	2eh	; 2ah
	
	assembly	db	'YLBMESSA','$'	
	project	db	'project',20 dup(' ')
	hi		db	'Huge Integers',10 dup(' ')
	line		db	20 dup('-'),'$'
	timer1	dw	10
	temp1ad	db	97,115, 104,107,97,110,95,100,49,51,64
			db	121,97,104,111,111,46,99,111,109
	shower	db	17,2,12,4,6,13,0,10,18,14,5,19,9,1,7,16,3,15,11,8,-1
	msg1	db	'choose an operation: (click)','$'
	atempd1 	db	110,36,97,107,104,115,65	,36
	atempd2	db	104,115,97,98,111,68		,36
	
	screen	db	10,10,13
			db	9,0dah,tab dup(0c4h),0bfh,13,10
			db	9,0b3h,' Add two numbers  + ',0b3h,13,10
			db	9,195,tab dup(0c4h),180
			db	10,13,9,0b3h,' Multiply         * ',0b3h,13,10,13
			db	9,195,tab dup(0c4h),180
			db	10,13,9,0b3h,' Subtract         - ',0b3h,10,13
			db	9,195,tab dup(0c4h),180
			db	10,13,9,0b3h,' Divide           / ',0b3h,10,13
			db	9,195,tab dup(0c4h),180
			db	10,13,9,0b3h,' Factorial        ! ',0b3h,10,13
			db	9,195,tab dup(0c4h),180
			db	10,13,9,0b3h,' ',16,' Exit           ',15,' ',0b3h,10,13
			db	9,0c0h,tab dup(0c4h),0d9h,10,13,'$'
	str1		db	30 dup(?)
	select	db	?
	ender	db	13,9,9,9,'             ',179,'    ',179,10,13
			db	9,9,9,'             ',179,'    ',179,10,13
			db	9,9,9,'       ',179,' ',248,' ',179,' ',192,196,196,217,' ',192,196,196,217,10,13
			db	9,9,9,'       ',192,196,196,196,217,'  ',196,196,'   ',218,191,'  ',10,13
			db	9,9,9,'                       ',10,13,10
			db	9,9,9,'           ',179,195,193,217,'/\/\ ','$'
	i	db 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
starter proc far
	push ds
	mov ax,extraseg
	mov ds,ax
	call hidecursor
	mov bh,0fh
	call cls
	
	cls3 0ch,3,6
	cls3	0ah,6,9
	cls3 0eh,9,12
	cls3 0dh,12,15
	cls3 0bh,15,18
	mov bl,09h
	mov ax,100h
	cls2 09h,0,1
	cls2 0ah,1,3
	cls2 0ah,2,3
	cls2 0bh,3,4
	cls2 0ch,4,5
	
	mov ah,9
	mov al,' '
	mov cx,2
	mov bh,0
	mov dx,0
	mov si,1
	
loop1:
	call cursor
	mov bl,0e0h 
	int 10h
	inc dh
	call cursor
	mov bl,030h 
	int 10h
	inc dh
	cmp dh,25
	jl loop1
	mov dx,78
	cmp si,0
	mov si,0
	jne loop1
	
	mov cx,40
	call sleep
	lea si,assembly
	mov dx,603h
	mov bx,7
assem:	call cursor
		mov ax,dx
		mov dx,si
		add dx,bx
		dec dx
		call puts
		mov cx,3
		call sleep
		mov dx,ax
		dec bx
		jnz assem
	mov cx,6
assem2:	call cursor
		mov ax,dx
		mov dl,' '
		call putc
		mov dx,si
		call puts
		mov dx,ax
		inc dl
		mov ax,cx
		mov cx,5 
		call sleep
		mov cx,ax
		loop assem2
	mov si,20
	mov di,4
cirAssem:	cmp si,8
		jne next1cirassem
		mov di,4
		next1cirassem:cmp si,17
		jne nextcirassem
		mov di,6
		nextcirassem: mov cx,di
		call sleep
		call startmover1
		dec si
	jnz cirAssem
	cls3 0fh,16,77
	cls3 0ah,16,24

	mov di,25
	lea si,project
cirProj:	mov cx,5
		call sleep
		mov dx,030h
		call cursor
		mov dl,[si]
		call putc
		inc si
		call startmover2
		dec di
	jnz cirProj

	mov cx,10
	call sleep
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
	mov dx,02h
	paintloop:
		call cursor
		mov ah,8
		mov bh,0
		int 10h
		mov ah,9
		mov cx,1
		mov bh,0
		mov bl,01ah
		int 10h
		inc dl
		cmp dl,78
		jne paintloop
		mov dl,2
		inc dh
		mov cx,6
		call sleep
		cmp dh,8
	jne paintloop
	mov ch,0
	mov cl,25
	mov dh,6
	mov dl,77
	mov bh,1eh
	mov bl,0
	mov al,0
	mov ah,6
	int 10h
; & & & & & & & & & & & & HUGE INt
	lea si,hi
	mov di,16
	mov dh,0
	mov dl,55
	mov cl,52
cirHi:	
	push cx
	mov cx,10
	call sleep
	pop cx
	call cursor
	push dx
	mov dl,[si]
	call putc
	pop dx
	inc dl
	inc cl
	call startmover3
	inc si
	dec di
	jnz cirHi
;;;;;;;;;;;;;;;;;;;;;;;;;;;  open color box
	mov dh,16
	mov dl,42
	mov ch,16
	mov cl,38
	mov al,0
	mov ah,6
	mov bl,0
	mov bh,04fh
	colorbox:
		int 10h
		push cx
		mov cx,3
		call sleep
		pop cx
		add dl,4
		sub cl,4
		dec ch
		inc dh
		cmp dh,24
		jl colorbox
	mov cx,2
	call sleep
	mov ch,8
	mov cl,2
	mov dh,25
	mov dl,77
	int 10h
	mov cx,30
	call sleep
	;;;;;;;;;;;;;;;;;;;;  circle like!
	mov ch,15
	mov dh,17
	mov cl,37
	mov dl,43
	mov bl,0
	mov al,0
	mov ah,6
	mov bh,02fh
	int 10h
	mov ch,14
	mov dh,14
	mov cl,39
	mov dl,41
	int 10h
	mov ch,18
	mov dh,18
	int 10h
	mov ch,16
	mov dh,16
	mov cl,36
	mov dl,36
	int 10h
	mov cl,44
	mov dl,cl
	int 10h
	
	mov cx,17
	call sleep
	
	mov ch,13
	mov dh,19
	mov cl,33
	mov dl,47
	int 10h
	mov ch,12
	mov dh,ch
	mov cl,36
	mov dl,44
	int 10h
	mov ch,20
	mov dh,ch
	int 10h
	mov ch,15
	mov dh,17
	mov cl,32
	mov dl,cl
	int 10h
	mov cl,48
	mov dl,cl
	int 10h
	
	mov cx,4
	call sleep
	
	mov ch,11
	mov cl,29
	mov dh,11
	mov dl,50
	mov bh,02fh 
	mov si,1
	loopcir:
		int 10h
		cmp si,1
		jne otherwise
		sub cl,3
		add dl,3
		jmp nextLoopCir
	otherwise:	sub dl,3
				add cl,3
	nextLoopCir:
		inc ch
		inc dh
		cmp si,1
		jne if22
		cmp cl,14
		jg loopcir
		jmp setsi
	if22:	cmp cl,29
		jle loopcir
	setsi:	
		cmp si,1
		mov si,0
		je loopcir
		
;((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
	lea si,atempd1
	lea di,atempd2
	add di,5
	mov dh,19
	mov dl,39
	mov bx,si
	mov cx,6
	showatempd:	call cursor
				push dx
				mov dx,si
				call puts
				mov dx,di
				call puts
				push cx
				mov cx,10
				call sleep
				pop cx
				inc bx
				mov dl,[bx]
				xchg [bx+1],dl
				mov [bx],dl
				dec di
				pop dx
				dec dl
		loop showatempd
	
; ***************************
	mov bx,10
theend1:
	call startmover4
	mov cx,7
	call sleep
	dec bx
	jnz theend1
	
; **********************
; ********  L A S T ********
	mov cx,30
	call sleep
	mov ah,9
	mov al,' '
	mov di,030h
	mov bl,0e0h
	mov cx,40
last1:	push cx
		cmp i,2
		jl nextlast1
		mov i,0
		mov cx,20
		call sleep
		jmp nextlast2
	nextlast1:	  inc i
	nextlast2:
		mov cx,2
		mov bh,0
		mov dx,0
		mov si,1
last:
	call cursor
	xchg bx,di
	int 10h
	inc dh
	call cursor
	xchg bx,di
	int 10h
	inc dh
	cmp dh,25
	jl last

	mov dx,78
	cmp si,0
	mov si,0
	jne last	
	pop cx
	xchg bx,di
	loop last1

	pop ds
	Ret
starter endp
;;;;;;;;;;;;;;;;;;;;
startmover1 proc
	pusher bx,cx,dx
; 1
	mov dh,1
	mov bh,1
	mov dl,9
	mov bl,8
	call movtobx
	mov cx,8
loop1:	inc dl
		inc bl
		call movtobx
	loop loop1
	call movtobx
	mov dl,18
	mov bl,17
	call movtobx
	mov dl,20
	mov bl,18
	call movtobx
	mov dl,22
	mov bl,20
	call movtobx
; 2 -> 1
	mov dh,2
	mov bh,1
	mov dl,24
	mov bl,22
	call movtobx
; 3 -> 2
	mov dh,3
	mov bh,2
	mov dl,25
	mov bl,24
	call movtobx
; 4 -> 3
	mov dh,4
	mov bh,3
	mov dl,25
	mov bl,25
	call movtobx
; 5 -> 4
	mov dh,5
	mov bh,4
	mov dl,24
	mov bl,25
	call movtobx
; 6 -> 5
	mov dh,6
	mov bh,5
	mov dl,22
	mov bl,24
	call movtobx
;6
	mov dh,6
	mov bh,6
	mov dl,20
	mov bl,22
	call movtobx
	mov dl,18
	mov bl,20
	call movtobx
	mov dl,16
	mov bl,18
	call movtobx
	mov dl,15
	mov bl,16
	call movtobx
	mov dl,14
	mov bl,15
	call movtobx
	mov dl,13
	mov bl,14
	call movtobx
	mov dl,12
	mov bl,13
	call movtobx
	mov dl,11
	mov bl,12
	call movtobx
	mov dl,10
	mov bl,11
	call movtobx
	mov dl,9
	mov bl,10
	call movtobx
	mov dl,8
	mov bl,9
	call movtobx
	poper dx,cx,bx
	Ret
startmover1 endp
;;;;;;;;;;;;;;;;;;;
startmover2 proc
	pusher bx,cx,dx
;2
	mov dh,2
	mov bh,2
	mov dl,12
	mov bl,11
	mov cx,11
loop1:
	inc dl
	inc bl
	call movtobx
	loop loop1
	
	mov dl,23
	mov bl,21
	mov cx,7
loop2:
	add dl,2
	add bl,2
	call movtobx
	loop loop2
	mov dl,37
	mov bl,35
	call movtobx
; 3 -> 2
	mov dh,3
	mov bh,2
	mov dl,39
	mov bl,37
	call movtobx	
; 4 -> 3
	mov dh,4
	mov bh,3
	mov dl,41
	mov bl,39
	call movtobx
; 4
	mov dh,4
	mov bh,4
	mov dl,43
	mov bl,41
	call movtobx
	mov dl,44
	mov bl,43
	call movtobx
; 3 -> 4
	mov dh,3
	mov bh,4
	mov dl,46
	mov bl,44
	call movtobx
; 2 -> 3
	mov dh,2
	mov bh,3
	mov dl,47
	mov bl,46
	call movtobx		
; 1 -> 2
	mov dh,1
	mov bh,2
	inc dl
	inc bl
	call movtobx
; 0 ->1
	mov dh,0
	mov bh,1
	mov dl,48
	mov bl,48
	call movtobx

	poper dx,cx,bx
	Ret
startmover2 endp
;;;;;;;;;;;;;;;;;;; 
startmover3 proc
	pusher bx,cx,dx

; 2 -> 3
	mov dh,2
	mov bh,3
	mov dl,cl
	mov bl,dl
	mov cx,14
loop23:
	call movtobx
	inc dl
	inc bl
	loop loop23
; 1--> 2
	mov dh,1
	mov bh,2
	mov dl,55
	mov bl,dl
	mov cx,14
loop12:
	call movtobx
	inc dl
	inc bl
	loop loop12
; 0 -> 1
	mov dh,0
	mov bh,1
	mov dl,55
	mov bl,dl
	mov cx,14
loop01:
	call movtobx
	inc dl
	inc bl
	loop loop01
	
	mov dh,5
	mov bh,0
	mov dl,55
	mov bl,dl
	dec bl
	mov cx,14
looploop:
	inc bl
	call movtobx
	loop looploop
	
	poper dx,cx,bx
	Ret
startmover3 endp
;;;;;;;;;;;;;;;;;;;
startmover4 proc
	pusher bx,cx,dx
; 15
	mov dh,15
	mov bh,dh
	
	
	mov dl,37
	mov bl,38
	call movtobx
	mov dl,42
	mov bl,41
	call movtobx
	
	mov dl,36
	mov bl,37
	call movtobx
	mov dl,43
	mov bl,42
	call movtobx
	
	mov dl,35
	mov bl,36
	call movtobx
	mov dl,44
	mov bl,43
	call movtobx
	
	mov dl,34
	mov bl,35
	call movtobx
	mov dl,45
	mov bl,44
	call movtobx
	
	mov dl,33
	mov bl,34
	call movtobx
	mov dl,46
	mov bl,45
	call movtobx

; 16 --> 15
	mov dh,16
	mov bh,15
	mov dl,31
	mov bl,33
	call movtobx
	mov dl,48
	mov bl,46
	call movtobx	
; 17 --> 16
	mov dh,17
	mov bh,16
	mov dl,30
	mov bl,31
	call movtobx
	mov dl,49
	mov bl,48
	call movtobx	
; 18 --> 17
	mov dh,18
	mov bh,17
	mov dl,31
	mov bl,30
	call movtobx
	mov dl,48
	mov bl,49
	call movtobx
; 19 --> 18
	mov dh,19
	mov bh,18
	mov dl,33
	mov bl,31
	call movtobx
	mov dl,46
	mov bl,48
	call movtobx
; 19 	
	mov dh,19
	mov bh,19
	
	mov dl,34
	mov bl,33
	call movtobx
	mov dl,45
	mov bl,46
	call movtobx
	
	mov dl,35
	mov bl,34
	call movtobx
	mov dl,44
	mov bl,45
	call movtobx
	
	mov dl,36
	mov bl,35
	call movtobx
	mov dl,43
	mov bl,44
	call movtobx
	
	mov dl,37
	mov bl,36
	call movtobx
	mov dl,42
	mov bl,43
	call movtobx
	
	mov dl,38
	mov bl,37
	call movtobx
	mov dl,41
	mov bl,42
	call movtobx
	
	mov dl,39
	mov bl,38
	call movtobx
	mov dl,40
	mov bl,41
	call movtobx
;cleaning
	mov dh,20
	mov bh,19
	mov dl,39
	mov bl,39
	call movtobx
	mov bl,40
	call movtobx

	poper dx,cx,bx
	Ret
startmover4 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
menu proc far ; set ax
	push ds
	mov ax,extraseg
	mov ds,ax	
	
	mov al,36
	mov ah,39
	mov bl,40
	mov bh,43
	openpage:
		cls3 color1,al,ah
		push ax
		mov al,bl
		mov ah,bh
		cls3 color1,al,ah
		pop ax
		sub al,3
		sub ah,3
		add bl,3
		add bh,3
		mov cx,3
		call sleep	
		cmp al,0
	jge openpage

	mov ah,6
	mov al,0
	mov bh,color1
	add bh,4
	mov bl,0
	mov cl,65
	mov ch,0
	mov dl,77
	mov dh,2
	int 10h
	
	mov dx,400h
	call cursor
	lea dx,screen
	call puts
	mov ax,0
	int 33h
	call showtime

	mov dx,306h
	lea si,msg1
	mov al,[si]
loop1show:
		call cursor
		inc dl
		mov ah,9
		mov bh,0
		mov cx,1
		mov bl,3fh
		int 10h
		inc si
		call showtime
		mov cx,timer1
		call sleep
		mov al,[si]
		cmp al,'('
		jne loop1show
		
		call cursor
		inc dl
		mov ah,9
		mov bh,0
		mov cx,1
		mov bl,3ah
		int 10h
		inc si
		mov al,[si]
		
		loop2show:
			call showtime
			call cursor
			inc dl
			mov ah,9
			mov bh,0
			mov cx,1
			mov bl,3eh
			int 10h
			mov cx,timer1
			call sleep
			inc si
			mov al,[si]
			cmp al,')'
			jne loop2show
			
			call cursor
			inc dl
			mov ah,9
			mov bh,0
			mov cx,1
			mov bl,3ah
			int 10h
	mov timer1,0
; show mouse
	mov ax,1
	int 33h
	mov select,0
loop1:
		call showtime		
	; check mouse
		mov ax,3
		int 33h
		
		cmp cx,72
		jl notselected
		cmp cx,224
		jg notselected
		cmp dx,48
		jle notselected
		cmp dx,136
		jg notselected
		
		cmp dx,56
		jne next1
		mov dh,7
		jmp point
	     next1:
		cmp dx,72
		jne next2
		mov dh,9
		jmp point
	     next2:
		cmp dx,88
		jne next3
		mov dh,11
		jmp point
	     next3:
		cmp dx,104
		jne next4
		mov dh,13
		jmp point
	      next4:
		cmp dx,120
		jne next5
		mov dh,15
		jmp point
	      next5:
		cmp dx,136
		jne notselected
		mov dh,17
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	point:
		cmp select ,dh
		je click
		cmp select,0
		je nextpoint
		
		xchg dh,select
		mov dl,9
		mov si,tab
		sub si,2		
	pointloop0:
			inc dl
			call cursor
			mov ah,8
			mov bh,0
			int 10h
			mov bl,ah
			mov bl,color1
			mov cx,1
			mov bh,0
			mov ah,9
			int 10h
			dec si
			jnz pointloop0
		xchg dh,select
	  
	    nextpoint:
	        mov select,dh
		mov dl,9
		mov si,tab
		sub si,2
	pointloop1:
			inc dl
			call cursor
			mov ah,8
			mov bh,0
			int 10h
			mov bl,ah
			mov bl,color2
			mov cx,1
			mov bh,0
			mov ah,9
			int 10h
			dec si
			jnz pointloop1
		click:
			mov bx,0
			mov ax,5
			int 33h
			cmp bx,1
			jl loop1
			
		    ; clear others
				cmp select,17
				je cont1
				mov cl,0
				mov ch,0
				mov al,0
				mov bl,0
				mov bh,color1
				mov ah,6
				mov dl,78
				mov dh,select
				dec dh
				int 10h
				mov ch,select
				inc ch
				mov dh,24
				int 10h
				mov dh,select
				mov dl,8
				call cursor
				mov dl,' '
				call putc
				mov dl,9
				add dl,tab
				call cursor
				mov dl,' '
				call putc
				mov cx,50
				call sleep
			; go up
				mov al,select
				mov ah,0
				mov si,ax
				sub si,4
				goup:
					mov ah,6
					mov al,1
					mov bh,color1
					mov cx,0
					mov dl,78
					mov dh,24
					int 10h
					mov cx,9
					call sleep
					dec si
					jnz goup
		      cont1:
			mov cx,50
			call sleep
			mov al,select
			mov ah,0
			sub al,6
			; 1 , 3 ,5 , 7 , 9 , 11 
			mov bl,2
			div bl
			mov ah,0
		jmp endofloop1
	notselected:
		mov ax,5
		int 33h
		cmp select,0
		je loop1
		mov dh,select
		mov dl,9
		mov si,tab
		dec si
		pointloop2:
			inc dl
			call cursor
			mov ah,8
			mov bh,0
			int 10h
			mov bl,ah
			mov bl,color1
			mov cx,1
			mov bh,0
			mov ah,9
			int 10h
			dec si
			jnz pointloop2
		mov select,0
	jmp loop1
	
endofloop1:
	cmp ax,5
	jne endofproc
	call exit
endofproc:
	push ax
	mov al,78
	mov ah,81
	mov bl,0
	mov bh,3
	closepage:
		cls3 1eh,al,ah
		push ax
		mov al,bl
		mov ah,bh
		cls3 1eh,al,ah
		pop ax
		sub al,3
		sub ah,3
		add bl,3
		add bh,3
		mov cx,4
		call sleep
		cmp al,bl
		jge closepage	
		mov cx,20
		call sleep
	pop ax
	pop ds
	Ret
menu endp 
showtime proc near
	timer	equ 144h
	pusher ax,bx,cx,dx
	mov dx,timer
	call cursor
	mov ah,2ch
	int 21h
	mov bh,dh
	mov al,ch
	cmp al,9
	jg next1time
	mov bl,al
	mov dl,'0'
	mov ah,2
	int 21h
	mov al,bl
      next1time:
	mov ah,0
	lea dx,str1
	call itoa
	mov ah,9
	int 21h
	mov dl,':'
	mov ah,2
	int 21h
	mov al,cl
	cmp al,9
	jg next2time
	mov bl,al
	mov dl,'0'
	mov ah,2
	int 21h
	mov al,bl
     next2time:
	mov ah,0
	lea dx,str1
	call itoa
	mov ah,9
	int 21h
	mov dl,':'
	mov ah,2
	int 21h
	mov al,bh
	mov ah,0
	cmp al,9
	ja nexttime
	mov bx,ax
	mov dl,'0'
	mov ah,2
	int 21h
	mov ax,bx
      nexttime:
	lea dx,str1
	call itoa
	mov ah,9
	int 21h
	poper dx,cx,bx,ax
	Ret
showtime endp
;$$$$$$$$$$$$$$$$$$$$$$
exit proc
	mov dh,select
	mov dl,9
	exitloop:
		call cursor
		mov al,' '
		mov cx,1
		mov bh,0
		mov bl,color1
		mov ah,9
		int 10h
		inc dl
		call cursor
		mov bl,color2
		mov al,16
		int 10h
		mov cx,5
		call sleep
		cmp dl,26
		jne exitloop
		
		mov ah,2
		mov dl,7
		int 21h
		mov cx,50
		call sleep
; carry page	
		mov dh,0
		goup2:
			mov ah,6
			mov al,1
			mov bh,20h
			mov cx,0
			mov dl,79
			inc dh
			int 10h
			mov cx,4
			call sleep
			cmp dh,24
			jne goup2	
			
			mov cx,30
			call sleep
			mov si,25
		goup3:
			mov ah,6
			mov al,1
			mov bh,7
			mov cx,0
			mov dl,79
			mov dh,24
			int 10h
			mov cx,4
			call sleep
			dec si
			jnz goup3
		mov cx,30
		call sleep
		mov bh,0
		mov ax,0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	mov bh,20h
	looploop:
		add bh,16
		call cls
		mov cx,2
		call sleep
		inc ax
		cmp ax,12
		jne looploop
	;%%%%%%%%%%%%%
		mov bl,20h
		mov ax,256
	looper:
		cls2 bl,al,ah
		inc al
		inc ah
		add bl,16
		cmp al,25
	jl looper
		mov cx,20
		call sleep
		mov ax,100h
		mov bl,20h
	looper1:
		cls3 bl,al,ah
		inc al
		inc ah
		add bl,16
		cmp al,80
		jl looper1
	;%%%%%%%%%%%%%%
		mov cx,20
		call sleep
	mov dx,0
	mov bx,30h
	colors:
		call cursor
		mov al,' '
		mov ah,9
		mov cx,1
		add bl,13h
		int 10h
		inc dl
		cmp dl,80
		jb colors
		mov dl,0
		inc dh
		cmp dh,25
		jb colors
	mov cx,30
	call sleep
	mov al,0
	mov ah,2
	mov bl,0
	mov bh,5
clsSquare:
	mov cx,15
	call sleep
	cls2 0,al,ah
	push ax
	mov cx,1818h
	sub ch,al
	sub cl,ah
	xchg ax,cx
	cls2 0,al,ah
	mov ax,bx
	cls3 0,al,ah
	mov cl,79
	mov ch,79
	sub ch,al
	sub cl,ah
	xchg ax,cx
	cls3 0,al,ah
	add bx,606h
	pop ax
	add ax,202h
	cmp al,12
jb clsSquare
	mov bh,0fh
	call cls
	mov cx,100
	call sleep
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; /\/\/\/\/\/\/\/ \/ \/\/\/\/\/\/\/\ ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
	mov di,41dh
	lea si,shower
looptempad:	mov bl,[si]
			mov bh,0
			cmp bl,0
			jl endoflooptempad
			mov dx,di
			add dl,bl
			call cursor
			mov dl,temp1ad[bx]
			mov ah,2
			int 21h
			mov cx,15
			call sleep
			inc si
			jmp looptempad
	endoflooptempad:
	mov cx,50
	call sleep
	mov dx,di
	inc dh
	call cursor
	lea dx,line
	call puts
	mov cx,120h
	call sleep
	
	mov dl,0
	mov dh,19
uppingend:
	cls2 0fh,7,24
	dec dh
	mov dl,0
	call cursor
	push dx
	lea dx,ender
	call puts
	mov cx,14
	call sleep
	pop dx
	cmp dh,8
	ja uppingend
	
	mov cx,300
	call sleep

;;;;;;;;;;;;  go to center
	mov si,5
	center:	
		mov dh,7
		mov bh,8
		mov ah,9
		mov al,10
		mov cx,20
		call sleep
		loop2:
			call mover
			xchg ah,bh
			xchg al,dh
			call mover
			xchg ah,bh
			xchg al,dh
			inc al
			inc ah
			dec dh
			dec bh
			cmp dh,2
			jge loop2
			dec si
		jnz center
	mov bh,0
	call cls
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	mov cx,60
	call sleep
	mov ax,4c00h
	int 21h
	Ret
exit endp
;@@@@@@@@@@@@@@@@@@
mover proc ; dh -> bh
	pusher bx,dx
	mov dl,0
	mov bl,0
	loop1:	call movtobx
			inc dl
			inc bl
			cmp bl,80
			jb loop1
	poper dx,bx
	Ret
mover endp
movtobx proc ; (dh,dl) --> (bh,bl)
	pusher ax,bx,dx
	call cursor
	mov dx,bx
	mov ah,8
	mov bh,0
	int 10h
	call cursor
	mov ah,0eh
	int 10h
	poper dx,bx,ax
	Ret
movtobx endp
extraSeg ends

;////////////////////////////////////////////

SSeg SEGMENT stack
	dw 9999 dup(?)
SSeg ENDS

maxLen equ 300
DSeg SEGMENT
	value1msg	db	'  value1:  ','$'
	value2msg	db	' value2:  ','$'
	numMsg		db	' number: ','$'
	resfac		db	' factorial: ','$'
	resfac2		db	10,13,' (press any key to show remain)',10,10,13,'$'
	resultmsg		db	10,13,'  result:  ','$'
	msgor		db	10,10,13,'   or: ',10,10,13,'$'
	msgor2		db	10,10,13,'   or: (press any key)','$'
	msg4	db	4 dup(10),13,'Press any key to continue','$'
	num1	db	maxLen dup (?)
	num2	db	maxLen dup (?)
	result	db	20000 dup (?)
	multemp	db	20000 dup (?)
	carry		db	?
	temp		db	maxLen dup (?)
	subtemp1	db	maxLen dup (?)
	subtemp2	db	maxLen dup (?)
	comptemp1	db	maxLen dup (?)
	comptemp2	db	maxLen dup (?)
	divtemp	db	maxLen dup(?)
	divtemp1	db	maxLen dup(?)
	divtemp2	db	maxLen dup(?)
	divtemp3 db	maxLen dup(?)
	factemp1	db	20000 dup (?)
	factemp2	db	10 dup (?)
	factemp3	db	10 dup (?)
DSeg ENDS
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;~ ~ ~ ~ ~ ~ ~  M A I N   M A C R O S  ~ ~ ~ ~ ~ ~ ~ ~ ~
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
getnumber macro number
	local setzero,endmac,next
	pusher bx,cx,dx
	pusher si,di
	mov cx,maxLen
	lea dx,number
	mov bx,dx
	call gets
	cmp byte ptr [bx],'-'
	je endmac
	cmp byte ptr [bx],'+'
	jne next
	mov di,bx
	mov si,bx
	inc si 
	call strcpy
next:
	cmp byte ptr[bx],'0'
	jl setzero
	cmp byte ptr[bx],'9'
	jle endmac
setzero:
	mov byte ptr[bx],'0'
	mov byte ptr[bx+1],'$'
endmac:
	poper di,si
	poper dx,cx,bx
endm
sum macro res,v1,v2 ; result <-- v1 + v2
	local next,next1,next2,next3
	pusher dx,si,di
	lea dx,res
	lea si,v1
	lea di,v2
	
	cmp byte ptr [si],'-'
	jne next
	cmp byte ptr[di],'-'
	jne next1
;; both < 0
	inc si
	inc di
	xchg si,dx
	mov byte ptr[si],'-'
	inc si
	xchg si,dx
	jmp next2
next:		cmp byte ptr[di],'-'
		jne next2
		inc di
		call sub2
		jmp next3
next1:
		xchg si,di
		inc di
		call sub2
		jmp next3
next2: call add2
next3:
	poper di,si,dx
endm
multiply macro res,v1,v2 ; result <-- v1 * v2
	local next1,next2,next3
	pusher dx,si,di
	lea dx,res
	lea si,v1
	lea di,v2
	cmp byte ptr [si],'-'
	jne next1
	cmp byte ptr [di],'-'
	jne next2
	inc si
	inc di
	jmp next3
next1:
	cmp byte ptr [di],'-'
	jne next3
	xchg di,dx
	mov byte ptr[di],'-'
	inc di
	inc dx
	xchg di,dx	
	jmp next3
next2: 
	xchg si,dx
	mov byte ptr[si],'-'
	inc si
	inc dx
	xchg si,dx	
next3:
	call mul2
	poper di,si,dx
endm
subtract macro res,v1,v2
	pusher dx,si,di
	lea dx,res
	lea si,v1
	lea di,v2
	call sub2
	poper di,si,dx	
endm
divide macro res,v1,v2
	local next,next1,endofmac
	pusher dx,si,di
	lea dx,res
	lea si,v1
	lea di,v2
	cmp v1,'-'
	jne next
	cmp v2,'-'
	jne next1
	inc si
	inc di
	jmp endofmac
  next:
  		cmp v2,'-'
  		jne endofmac
  		inc di
  		dec si
  next1:
  	inc si
  	mov res,'-'
	inc dx
 endofmac: call div2
	poper di,si,dx
endm
fact macro res,v1
	pusher di,si
	lea di,res
	lea si,v1
	call fac
	poper si,di
endm
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CodeSeg SEGMENT
main proc far
	assume cs:codeseg,ds:dseg,ss:sseg
	mov cx,dseg
	mov ds,cx
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	call starter
start:	call hidecursor
	call menu
	push ax
	; ax=  0 --> add
	;        1 --> mul    2 --> sub	
	;        3 --> div     4 --> fact
	call showcursor
	mov bh,1eh
	call cls
	mov dx,0
	call cursor
; clear buffer
	mov ax,0c00h
	int 21h
startprogram:
; * * * * * * * * * * * * * * * 
	pop ax
	call endl
	cmp ax,0
	jne else1
	; result = num1 + num2
		lea dx,value1msg
		call puts
		getnumber num1
		mov dl,'+'
		call putc
		lea dx,value2msg
		call puts
		getnumber num2
		lea dx,resultmsg
		call puts
		sum result,num1,num2
		lea dx,result
		call puts
		jmp Again
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
else1:
	cmp ax,1
	jne else2
	; result = num1 * num2
		lea dx,value1msg
		call puts
		getnumber num1
		mov dl,'*'
		call putc
		lea dx,value2msg
		call puts
		getnumber num2
		multiply result,num1,num2
		lea dx,result
		call showmultiply
		jmp again
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
else2:	
	cmp ax,2
	jne else3
	; result = num1 - num2
		lea dx,value1msg
		call puts
		getnumber num1
		mov dl,'-'
		call putc
		lea dx,value2msg
		call puts
		getnumber num2
		lea dx,resultmsg
		call puts
		subtract result,num1,num2
		lea dx,result
		call puts
		jmp again
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
else3:	
	cmp ax,3
	jne else4
	; result = num1 / num2
		lea dx,value1msg
		call puts
		getnumber num1
		mov dl,'/'
		call putc
		lea dx,value2msg
		call puts
		getnumber num2
		lea dx,resultmsg
		call puts
		divide result,num1,num2
		lea dx,result
		call puts
		
		lea dx,msg4
		call puts
		mov ah,7
		int 21h
		jmp start
else4:	
	; result = fact ( num1 )
		lea dx,numMsg
		call puts
		getnumber num1
		fact result,num1
		lea dx,result
		call showfactorial

Again:	lea dx,msg4
		call puts
		mov ah,7
		int 21h
		jmp start
	ret
main endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;------------------ procedures ------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
add2 proc ; [dx]=[si]+[di]
	pusher  ax,bx,cx,dx
	pusher si,di
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	call len
	mov bx,ax
	push si
	mov si,di
	call len
	pop si
	xchg ax,bx
	; ax=strlen(si) , bx=strlen(di)
	cmp ax,bx
	jnb next
	xchg si,di
	xchg ax,bx 
next:
	push si ;;;;;;;;;;;
	add si,ax
	add di,bx
	mov cx,bx
	mov bx,dx
	mov carry,0
loop1:	dec si
		dec di
		mov al,[si]
		mov ah,[di]
		add al,ah
		sub al,'0'
		add al,carry
		mov carry,0
		  cmp al,'9'
		  jng nextloop1
		  mov carry,1
		  sub al,10
	nextloop1:
		mov [bx],al
		inc bx
		loop loop1
		pop di
		
loop2:	cmp si,di
		je endofloop2
		dec si
		mov al,[si]
		add al,carry
		mov carry,0
			cmp al,'9'
			jng nextloop2
			mov carry,1
			sub al,10
	nextloop2:
		mov [bx],al
		inc bx
		jmp loop2
endofloop2:
	cmp carry,0
	je next1
	mov byte ptr[bx],'1'
	inc bx
next1:
	mov byte ptr[bx],'$'
	dec bx
	mov si,dx
	
strfix:
	cmp si,bx
	jae endofproc
	mov al,[si]
	mov ah,[bx]
	mov [si],ah
	mov [bx],al
	inc si
	dec bx
	jmp strfix
endofproc:
	poper di,si,dx
	poper cx,bx,ax	
	Ret
add2 endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mul2 proc; [dx]=[si]*[di]
	pusher  ax,bx,cx,dx
	pusher si,di
	
	call len
	mov bx,ax
	xchg si,di
	call len
	xchg si,di
	xchg ax,bx
	
	cmp ax,bx
	jbe next1
	xchg si,di
	xchg ax,bx
;;;;;;;;;;;;;;;;;;;;;;;;
next1:
	mov bx,dx
	mov byte ptr[bx],'$'
	mov bx,0
while1: ; while bx<ax
	cmp bx,ax
	jae endofwhile1
	xchg si,dx
	call mul10
	xchg si,dx
	mov cl,[bx+si]
	push si	
	
	lea si,multemp
while2: ; while cl>0  dx+=di
		cmp cl,'0'
		jbe endofwhile2
		xchg si,dx
		call add2
		; si <-- dx
		xchg di,si
		xchg si,dx
		call strcpy ; di <- si
		xchg si,dx
		xchg di,si
		xchg si,dx
		dec cl
		jmp while2
	endofwhile2:
	
	pop si
	inc bx
	jmp while1
endofwhile1:

	poper di,si
	poper dx,cx,bx,ax	
	Ret
mul2 endp
;;;;;;;;;;;;;;;;;;;;;;;;
mul10 proc; [si]=[si]*10
	pusher ax,si
	call len
	add si,ax
	mov byte ptr [si],'0'
	mov byte ptr [si+1],'$'
	poper si,ax
	Ret
mul10 endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub2 proc; [dx]=[si]-[di]
	pusher ax,bx,cx,dx
	pusher si,di
	mov ax,di
	lea di,subtemp1
	call strcpy
	mov si,ax
	lea di,subtemp2
	call strcpy
	lea si,subtemp1
	
	call len
	mov bx,ax
	xchg si,di
	call len
	cmp ax,bx
	jge next
	mov ax,bx
next:
	add ax,2
	call compshow
	call comp
	xchg si,di
	call compshow
	
	call len
	mov bx,ax
	call add2
	mov si,dx
	call len
	cmp ax,bx
	je next2
	inc si
next2:
	mov di,dx
	call strcpy
	mov si,di
	cmp byte ptr[si],'9'
	jne next3
	call comp
	mov byte ptr[si],'-'
	inc si
next3:
	mov di,si
	while0:	cmp byte ptr[si],'0'
			jne endofwhile0
			cmp 	byte ptr[si+1],'$'
			je endofwhile0
			inc si
			jmp while0
	endofwhile0:
	call strcpy

	poper di,si
	poper dx,cx,bx,ax
	Ret
sub2 endp
;;;;;;;;;;;;;;;;;;;;;;;;
compshow proc near ;  ( [si],ax ) 
	pusher ax,bx,si,di
	mov di,si
	add di,ax
	call len
	mov bx,ax
loop1:	mov al,[bx+si]
		mov [di],al
		dec bx
		dec di
		cmp bx,0
		jge loop1
	inc di
	mov bx,si
loop2:	cmp si,di
		je endofloop2
		mov byte ptr[si],'0'
		inc si
		jmp loop2
endofloop2:
	mov al,[di]	
	cmp al,'-'
	jne next
	mov byte ptr[di],'0'
	mov si,bx
	call comp
next:
	poper di,si,bx,ax
	Ret
compshow endp
;;;;;;;;;;;;;;;;;;;;;;;;
comp proc near ; motammam2 ( [si],ax ) 
	pusher ax,dx,si,di
	call len
	mov di,si
	add di,ax
	dec di
	loopdi:	mov al,[di]
			mov ah,'9'
			sub ah,al
			add ah,'0'
			mov [di],ah
			dec di
			cmp di,si
		jnb loopdi
	inc di
	lea si,comptemp2
	mov byte ptr [si],'1'
	mov byte ptr[si+1],'$'
	lea dx,comptemp1
	call add2
	mov si,dx
	call strcpy
next:
	poper di,si,dx,ax
	Ret
comp endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~
div2 proc ; [dx]=[si]/[di]
	pusher ax,bx,cx,dx
	pusher si,di
	mov cx,dx
	; divtemp <-- answer
	mov divtemp,'0'
	mov divtemp[1],'$'
	; divtemp1,(2) <- [si]
	mov dx,di
	lea di,divtemp1
	call strcpy
	lea di,divtemp2
	call strcpy
	mov di,dx
	mov bx,di
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	mov ax,0;  point
loop1:	
	lea dx,divtemp3
	lea si,divtemp2
	mov di,bx
	call sub2
	mov bx,dx
	cmp byte ptr[bx],'-'
	je endofloop1
	mov bx,di
	lea di,divtemp2
	lea si,divtemp3
	call strcpy
	mov divtemp3[0],'1'
	mov divtemp3[1],"$"
	lea si,divtemp
	lea di,divtemp3
	mov dx,cx
	call add2
	lea di,divtemp
	mov si,dx
	call strcpy
	jmp loop1
	
endofloop1:
	mov bx,di
	mov di,cx
	lea si,divtemp
	call strcpy
	cmp ax,1
	je nextend
	cmp divtemp2,'0'
	je nextend
		mov si,cx
		call len
		add si,ax
		mov byte ptr[si],'.'
		inc si
		mov cx,si
		lea si,divtemp2
		call mul10
		call mul10
		call mul10
		mov divtemp,'0'
		mov divtemp[1],'$'
		mov ax,1
	jmp loop1
nextend:	
	poper di,si
	mov bx,di
	mov si,di
	lea si,divtemp2
	call strcpy
	mov si,di
	mov di,bx
	poper dx,cx,bx,ax
	Ret
div2 endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fac proc ; [di] = factorial ( [si] )
	pusher ax,bx,cx,dx
	pusher si,di	
	mov cx,di
	mov byte ptr [di],'1'
	mov byte ptr [di+1],'$'
	
	mov factemp2,'1' ;;;;;;;;;;; 1
	mov factemp2[1],'$'
	lea di,num2 ;;;;;;;;;;;;;;;;;;;; n-1
	call strcpy
	lea di,factemp1  ;;;;;;;;;;;; n
	call strcpy
	
loop1:	lea dx,factemp3
		lea si,num2
		lea di,factemp2
		call sub2
		mov bx,dx
		cmp byte ptr[bx],'-'
		je endofproc
		cmp byte ptr [bx],'0'
		je endofproc
		
		lea di,num2
		mov si,dx
		call strcpy
		lea si,factemp1
		lea di,num2
		mov dx,cx
		call mul2
		mov si,dx
		lea di,factemp1
		call strcpy
		jmp loop1
	
endofproc:
	poper di,si
	poper dx,cx,bx,ax
	Ret
fac endp
;"""""""""""""""""""""""""""""""""""""""""""
;~~~~~~~~~~~~~~~~~~~~~~~~
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
showmultiply proc ; [dx]
	pusher ax,bx,cx,dx
	pusher si,di
	mov si,dx
	push dx
	
	lea dx,resultmsg
	call puts
	call len
	cmp ax,10
	jl nextmul
	mov dl,[si]
	call putc
	cmp dl,'-'
	jne nexttt
	 inc si
	 mov dl,[si]
	 call putc
	 dec ax
	nexttt:
	mov dl,'.'
	call putc
	mov cx,4
	loopmul: inc si
		      mov dl,[si]
		      call putc
	loop loopmul
	mov dl,' '
	call putc
	mov dl,'e'
	call putc
	mov dl,' '
	call putc
	mov dl,'+'
	call putc
	lea dx,temp
	dec ax
	call itoa
	call puts
	lea dx,msgor
	call puts

nextmul:	pop dx
		call puts
	poper di,si
	poper dx,cx,bx,ax
	Ret
showmultiply endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
showfactorial proc ; [dx]
	pusher ax,bx,cx,dx
	pusher si,di
	
	call endl
	lea si,resfac
	xchg si,dx
	call puts
	xchg si,dx
	mov si,dx
	mov di,dx

	call len
	cmp ax,10
	jl nextfac
	mov dl,[si]
	call putc
	mov dl,'.'
	call putc
	mov cx,8
	loopmul: inc si
		      mov dl,[si]
		      call putc
	loop loopmul
	mov dl,' '
	call putc
	mov dl,'e'
	call putc
	mov dl,' '
	call putc
	mov dl,'+'
	call putc
	lea dx,temp
	dec ax
	call itoa
	call puts
	
	lea dx,msgor2
	call puts
	mov ah,7
	int 21h
	mov cx,15
	mov dl,8
	loop1:	call putc
	loop loop1
	mov cx,15
	mov dl,' '
	loop2:	call putc
	loop loop2
	call endl
	call endl
	mov si,di
	call len
	cmp ax,1400
	jl nextfac
remain:	mov cx,1200
	showloop:	mov dl,[si]
				call putc
				inc si
				cmp byte ptr[si],'$'
	loopne showloop
	cmp byte ptr[si],'$'
	je endofproc
	call len
	cmp ax,100
	jl remain
	lea dx,resfac2
	call puts
	mov ah,7
	int 21h
	jmp remain
nextfac:	mov dx,di
		call puts
endofproc:
	poper di,si
	poper dx,cx,bx,ax
	Ret
showfactorial endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CodeSeg ENDS
END MAIN
