home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug113.arc / OBESE.Z80 < prev    next >
Text File  |  1979-12-31  |  5KB  |  197 lines

  1. ;+
  2. ; Program to determine Obesity by computing the Body Mass Index.
  3. ; BMI = Weight in Kilograms / (Height in metres squared )
  4. ;-
  5. START:    LD    HL,TITLE    ; Program title.
  6.     LD    A,'.'         ; Terminating character.
  7.     CALL    OTL        ; Print the title.
  8.     CALL    CRLF        ; Carriage return line feed.
  9.         CALL    CRLF        ;
  10.  
  11.     LD    HL,MESS2    ; Ask user for Weight
  12.     LD    A,'.'        ; Terminating character.
  13.     CALL    OTL        ; Print the question.
  14.     CALL    IDEC        ; User types a Decimal Number.
  15.     LD    (WEIGHT),HL ; Store Weight in Kilograms.
  16.     CALL    CRLF        ;
  17.  
  18.     LD    HL,MESS3    ; Ask user for Height.
  19.     LD    A,'.'        ; Terminating Character.
  20.     CALL    OTL        ; Print the Question.
  21.     CALL    IDEC        ; User types a Decimal Number.
  22.     LD    (HEIGHT),HL ; Store Height in Centimetres.
  23.     CALL    CRLF        ;
  24.  
  25. SEX1:    LD    HL,MESS4    ; Is user Male or Female ?
  26.     LD    A,'.'        ; Terminating Character.
  27.     CALL    OTL        ; Print Question
  28.     CALL    MCHINW        ; Get Single Character reply
  29.     CP    'M'        ; M Is OK
  30.     JR    Z,SEXOK        ;
  31.     CP    'F'        ; So Is F
  32.     JR    Z,SEXOK        ;
  33.     JR    SEX1        ; Must be M or F
  34.  
  35. SEXOK:    LD    (SEX),A        ; Save sex code
  36.     CALL    CRLF        ;
  37.  
  38. FRAM1:    LD    HL,MESS5    ; frame size ?
  39.     LD    A,'.'        ; Terminating Character
  40.     CALL    OTL        ; Print question
  41.     CALL    MCHINW        ; Get single character reply
  42.     CP    'M'        ; MEDIUM is OK
  43.     JR    Z,FRAMOK    ;
  44.     CP    'L'        ; LARGE  is OK
  45.     JR    Z,FRAMOK    ;
  46.     JR    FRAM1        ; Must be M or L
  47.  
  48. FRAMOK:    LD    (FRAME),A   ; save frame
  49.     CALL    CRLF
  50.     CALL    CRLF
  51. ;+
  52. ; Make HIGH BYTES of data ZERO
  53. ;-
  54.     LD    HL,0        ; get a 16 bit ZERO
  55.     LD    (WH),HL        ; 2 HIGH BYTES OF WEIGHT
  56.     LD    (HH),HL        ; 2 HIGH  BYTES OF HEIGHT
  57.     LD    (H2H),HL    ; USED IN SQUARING HEIGHT
  58. ;+
  59. ; COMPUTE HEIGHT = (HEIGHT * HEIGHT)
  60. ;-
  61.     LD    HL,(HEIGHT) ;
  62.     LD    (HT),HL        ; make a copy of Height
  63.     LD    HL,HEIGHT   ; so we can square it
  64.     LD    DE,HT        ; 
  65.     LD    B,4        ; 32 BIT number (4 BYTES)
  66.     CALL    MPBMUL        ; Multiply height by height
  67. ;+
  68. ; COMPUTE WEIGHT = WEIGHT * 10000
  69. ;-
  70.     LD    HL,WEIGHT   ; WEIGHT *
  71.     LD    DE,FACT1    ; 10000
  72.     LD    B,4        ; 32 BIT (4 BYTE) number
  73.     CALL    MPBMUL        ; multiply weight by 10000
  74. ;+
  75. ; COMPUTE WEIGHT = HEIGHT * 10000 / (WEIGHT*WEIGHT)
  76. ;-
  77.     LD    HL,WEIGHT   ; CONTAINS WEIGHT * 1000
  78.     LD    DE,HEIGHT   ; CONTAINS HEIGHT SQUARED
  79.     LD    B,4        ; 32 BIT (4 BYTE) DIVIDE
  80.     CALL    MPBDIV        ; divide it
  81.  
  82.     LD    HL,(WEIGHT) ; answer to division
  83.     LD    (BMI),HL    ; Save BMI
  84.  
  85.         PUSH    HL        ; save it for printing
  86.  
  87.     LD    HL,MESS8    ; Print the BMI message
  88.     LD    A,'.'        ; terminating character
  89.     CALL    OTL        ;
  90.  
  91.     POP    HL        ; restore BMI
  92.     LD      H,0        ;
  93.     CALL    ODEC        ; print it
  94.     CALL    CRLF        ;
  95.         CALL    CRLF        ;
  96.  
  97.     SUB    A        ; CLEAR A
  98.     LD    (OBESE),A   ; CLEAR OBESE FLAG
  99.  
  100.     LD    A,(SEX)        ; WHITCH SEX
  101.     CP    'M'        ; MALE ?
  102.     JR    Z,MALE        ; yes
  103.  
  104.     LD    A,(FRAME)   ; Frame type ?
  105.     CP    'M'        ; MEDIUM ?
  106.     JR    NZ,FATFEM   ; NO
  107. ;+
  108. ; Medium frame female
  109. ;-
  110.     LD    A,(BMI)    ; Is BMI < 27?
  111.     CP    27       ;
  112.     JR    C,PRINT       ; yes not obese
  113.  
  114.     LD    (OBESE),A  ; Obese is true
  115.     JR    PRINT       ;
  116. ;+
  117. ; Large Frame Female
  118. ;-
  119. FATFEM:    LD    A,(BMI)     ; is BMI < 30 ?
  120.     CP    30        ;
  121.     JR    C,PRINT        ; yes not obese
  122.  
  123.     LD    (OBESE),A   ; Obese is true
  124.     JR    PRINT        ;
  125. ;+
  126. ; males
  127. ;-
  128. MALE:    LD    A,(FRAME)   ;
  129.     CP    'M'        ; medium frame ?
  130.     JR    NZ,FATMAN   ; NO
  131. ;+
  132. ; Medium frame male
  133. ;-
  134.     LD    A,(BMI)     ; is BMI < 28 ?
  135.     CP    28        ;
  136.     JR    C,PRINT        ; yes not obese
  137.  
  138.     LD    (OBESE),A   ; obese is true
  139.     JR    PRINT
  140. ;+
  141. ; Large frame male
  142. ;-
  143. FATMAN:    LD    A,(BMI)     ; is BMI < 30 ?
  144.     CP    30          ;
  145.     JR    C,PRINT        ; yes not obese
  146.  
  147.     LD    (OBESE),A   ; Obese is true
  148. ;+
  149. ; Print decision
  150. ;-
  151. PRINT:    LD    A,(OBESE)   ; Examine obese flag
  152.     OR    A        ;
  153.     JR    Z,SKINNY    ; Not obese if flag is ZERO
  154.  
  155.     LD    HL,MESS6    ; Tell the bad news
  156.     LD    A,'.'        ; terminating character
  157.     CALL    OTL        ;
  158.     CALL    CRLF        ;
  159.     JP    START        ; start again
  160.  
  161. SKINNY:    LD    HL,MESS7    ; Tell the good news
  162.     LD    A,'.'        ; terminating chatacter
  163.     CALL    OTL        ; print it
  164.     CALL    CRLF        ;
  165.     JP    START        ; start again
  166. ;+
  167. ; DATA
  168. ;-
  169. HEIGHT:    DW    0
  170. HH:    DW    0
  171. WEIGHT:    DW    0
  172. WH:    DW    0
  173. HT:    DW    0
  174. H2H:    DW    0
  175. SEX:    DB    0
  176. FRAME:    DB    0
  177. BMI:    DW    0
  178. OBESE:    DB    0
  179. FACT1:    DW    10000
  180.     DW    0
  181.  
  182. TITLE:    DEFB '    Program to determine obesity .'
  183. MESS2:    DEFB '    How many Kilograms do you Weigh : .'
  184. MESS3:    DEFB ' What is your Height in Centimeters : .'
  185. MESS4:    DEFB '       Are you Male or Female (M/F) : .'
  186. MESS5:    DEFB 'Are you Medium or Large Frame (M/L) : .'
  187. MESS6:    DEFB '     Sorry but you are OBESE !!! .'
  188. MESS7:    DEFB '   Good news, you are NOT OBESE !! .'
  189. MESS8:  DEFB '            Your Body Mass Index is : .'
  190. ;+
  191. ; Subroutines required
  192. ;-
  193.     EXT MCHINW, IDEC, CRLF, OTL, MPBMUL, MPBDIV, ODEC, VDU
  194.  
  195.     END
  196.  
  197. ur Body Mass Index is