; Using a proc for input of digits (inputgrades)
; and another proc for calculating average grades (averagegrades) 


IDEAL
MODEL small
STACK 100h
DATASEG
; --------------------------
avg    db ?
arrsz  db ?
userin db 'Please enter 9 digit grades:$'
grades db 12 dup(?)  ; for 9 grades
numg   db ?


; --------------------------
CODESEG 

; procs

;*******************************************************************************
proc  newline
      push ax   
      push dx   
      mov  ah,2              
	  mov  dl,10
      int  21h
	  pop  dx   
	  pop  ax   
	  ret
endp  newline
;*******************************************************************************

proc inputgrades    ; gets address of array of grades ( 1 param)
     push bp
     mov  bp,sp 
     ; save registers
     push ax
     push bx
     push cx
     push dx
     push si

     mov dx,[bp+4]
	 mov bx, dx
	 mov [byte ptr bx], 10 ; 9 digits + <enter>
	 mov ah, 0ah
	 int 21h
	 call newline
     add bx,2  ; now bx points to the first grade 
; loop on array of grades. For each, turn ASCII to number
     xor si,si
     mov cx,9
loopgrades:
     mov al,[bx+si]
     sub al,'0'
     mov [bx+si],al
     inc si
     loop loopgrades
     ; Now grades appear as numbers on input


     ; restore registers
     pop  si
     pop  dx
     pop  cx
     pop  bx
     pop  ax


     pop bp
     ret 2             ; clear stack from 1 parameter
endp inputgrades

;*********************************************************************


proc averagegrades    

; gets address of array of grades and number of grades ( 2 parms)
; puts the average in avg variable
     push bp
     mov  bp,sp 
     ; save registers
     push ax
     push bx
     push cx
     push dx

     mov bx,[bp+6]  ; address of grade array
     mov cx,[bp+4]  ; number of grades
     mov [numg],cl  ; save number of grades
     xor dl,dl      ; Will sum the grades
     add bx,2       ; point to first grade

loopg:              ; loop on grades and add them to dl
     mov al,[bx]
     add dl,al
     inc bx
     loop loopg 

     mov al,dl
     xor ah,ah
     div [numg]     ; al will have the integer average
     mov [avg],al

     ; restore registers

     pop  dx
     pop  cx
     pop  bx
     pop  ax


     pop bp
     ret 4          ; clear stack from 2 parameters
endp averagegrades

;*********************************************************************


; main program

start:
	mov ax, @data
	mov ds, ax
; --------------------------
;printing the instruction
	mov dx, offset userin
	mov ah, 9h
	int 21h
;
	call newline
    push offset grades
    call inputgrades
    push offset grades
    push 9
    call averagegrades    ; puts the average in variable avg
	
; --------------------------
exit:
	mov ax, 4c00h
	int 21h
END start