home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / ZCPR33 / A-R / MATH24.LBR / MEVAL24.ZZ0 / MEVAL24.Z8°
Text File  |  2000-06-30  |  4KB  |  181 lines

  1. ;
  2. ; Module Name:  MEVAL24
  3. ; Author:  STEVEN M. COHEN
  4. ; BASED ON RICHARD CONN'S SEVAL MODULE
  5. ; adapted for 24-bit structure
  6. ; March 10, 1987
  7. ;
  8.     public    N24EVAL, RADIX
  9.  
  10. ;
  11. ;  N24EVAL --
  12. ; On input, DE points to a 3-byte buffer into which the number will be stored
  13. ; HL points to a NULL-TERMINATED string of ASCII binary, 
  14. ; decimal, or hexadecimal characters to convert to binary; this string may 
  15. ; take any of the following forms --
  16.  
  17. ;    bbbbbbbbbbbbbbbbbbbbbbbb
  18. ;    OR bbbbbbbbbbbbbbbbbbbbbbbb%-- b=0 or b=1; binary string
  19. ;    ttttttttt or ttttttttt# -- 0<= t <= 9; decimal string
  20. ;    hhhhhh or hhhhhhH -- 0<= h <= F; hexadecimal string
  21. ;    
  22. ;    One radix, either binary, decimal, or hexadecimal is selected
  23. ;       as default.  For the selected radix the trailing identifier
  24. ;    (%,#, or H) is not necessary (but allowed).  For the non-default
  25. ;       radices, the trailing identifier is necessary.  
  26. ;
  27. ;    On return, DE = value, HL points to next byte after
  28. ;     string, A=E; BC is not affected.
  29. ;    On return, CARRY Set means error, and HL pts to byte after error
  30. ;
  31. ;  RADIX --    
  32. ;    The routine RADIX changes the default radix.  
  33. ;  On input the return address holds
  34. ;  the value 2,    10, or 16, which updates the internal byte DEFAULT
  35. ;  according to the selected Radix. If the return address holds 0
  36. ;  then RADIX supplies the default radix in A on output.
  37. ;  Any different value results in
  38. ;  the carry flag being set, and the byte DEFAULT is not affected.
  39. ;  The RADIX routine only need be listed as an external in the calling
  40. ;  program if the program allows for changing of the default RADIX.
  41. ;  If it is not touched the default radix itself defaults to decimal.
  42.  
  43.     EXT    CAPS    ; CAPITALIZATION ROUTINE
  44.     EXT    EVALH24    ; CONVERT HEX STRING
  45.     EXT    EVALD24    ; CONVERT DEC STRING
  46.     EXT    EVALB24    ; CONVERT BIN STRING
  47. ;
  48. ; Main routine
  49. ;    
  50. N24EVAL:
  51.     PUSH    BC    ; SAVE BC
  52.     PUSH    HL    ; SAVE PTR TO 1ST CHAR
  53. ;
  54. ;  Find end of string
  55. ;
  56. FEND:
  57.     XOR    A        ; null the accumulator
  58. FLOOP:
  59.     CPI            ; pointing to null terminator?
  60.     JR    NZ,FLOOP    ; no do next
  61.     DEC    HL        ; point to the null
  62.     DEC    HL        ; point to just before null
  63.     LD    A,(HL)        ; get this byte
  64.     POP    HL        ; put beginning of string back
  65.     CALL    CAPS        ; CAPITALIZE
  66.     CP    'H'        ; HEX
  67.     JR    Z,EHEX
  68. ;    CP    'X'
  69. ;    JP    Z,EHEX
  70. ;    CP    'O'        ; OCTAL
  71. ;    JP    Z,EOCT
  72. ;    CP    'Q'
  73. ;    JP    Z,EOCT
  74.     CP    '%'        ; BINARY?
  75.     JR    Z,EBIN
  76.     CP    '#'        ; DECIMAL?
  77.     JR    Z,EDEC        ; YES
  78.     LD    A,(DEFAULT)    ; NO, USE DEFAULT
  79.     CP    2        ;
  80.     JR    Z,EBIN
  81.     CP    10
  82.     JR    Z,EDEC
  83.     CP    16
  84.     JR    Z,EHEX
  85.     SCF            ; NONE of the above = trouble
  86.     RET            ; get out with carry flag set
  87. ;  Evaluate string as decimal
  88. EDEC:
  89.     CALL    EVALD24    ; EVALUATE AS DECIMAL
  90.     LD    A,(HL)    ; MAY PT TO # (DECIMAL CHAR)
  91.     CALL    CAPS
  92.     CP    '#'    ; INCR HL IF SO
  93.     JR    NZ,DONE
  94.     INC    HL    ; PT TO NEXT
  95.     JR    DONE
  96.  
  97. ;  Evaluate string as hexadecimal
  98. EHEX:
  99.     CALL    EVALH24    ; EVAUATE AS HEXADECIMAL
  100.     LD    A,(HL)    ; MUST PT TO H OR NULL
  101.     OR    A
  102.     JR    Z,DONE
  103.     CALL    CAPS
  104.     INC    HL    ; PT TO NEXT
  105.     CP    'H'
  106.     JR    Z,DONE
  107. ;    CP    'X'
  108. ;    JP    Z,DONE
  109.  
  110. ;  String Error -- set flag
  111. ERROR:
  112.     LD    A,E    ; LOW-ORDER IN A
  113.     SCF        ; SET CARRY FLAG FOR ERROR
  114.     POP    BC    ; RESTORE BC
  115.     RET
  116.  
  117. ;  Evaluate string as octal
  118. ;EOCT:
  119. ;    CALL    EVAL8    ; EVALUATE AS OCTAL
  120. ;    LD    A,(HL)    ; MUST PT TO O OR Q
  121. ;    CALL    CAPS
  122. ;    INC    HL    ; PT TO NEXT
  123. ;    CP    'O'
  124. ;    JP    Z,DONE
  125. ;    CP    'Q'
  126. ;    JP    Z,DONE
  127. ;    JP    ERROR    ; ERROR OTHERWISE
  128. ;
  129. ;  Evaluate string as binary
  130. EBIN:
  131.     CALL    EVALB24    ; EVALUATE AS BINARY
  132.     LD    A,(HL)    ; MUST PT TO % OR NULL
  133.     OR    A
  134.     JR    Z,DONE
  135.     CALL    CAPS
  136.     INC    HL    ; PT TO NEXT
  137.     CP    '%'
  138.     JR    NZ,ERROR
  139.  
  140. ;  Done with evaluation -- no error
  141. DONE:
  142.     LD    A,(DE)    ; LOW-ORDER IN A
  143.     OR    A    ; CLEAR CARRY FLAG
  144.     POP    BC    ; RESTORE BC
  145.     RET
  146. ;
  147. ; Radix routine - explanation above
  148. ;
  149. RADIX:
  150.     EX    (SP),HL
  151.     LD    A,(HL)
  152.     INC    HL
  153.     EX    (SP),HL
  154.     OR    A        ; request for Default radix?
  155.     JR    NZ,RADIX2    ; NO, try binary
  156.     LD    A,(DEFAULT)
  157.     RET
  158. RADIX2:
  159.     CP    2        ; change default to BINARY?
  160.     JR    NZ,RADIX10    ; NO, try decimal
  161.     JR    CHRADIX        ; make change
  162. RADIX10:
  163.     CP    10        ; change default to DECIMAL?
  164.     JR    NZ,RADIX16    ; NO, try HEX
  165.     JR    CHRADIX        ; make change        
  166. RADIX16:
  167.     CP    16        ; change default to HEX
  168.     JR    NZ,RADIXERR    ; NO, an error
  169. CHRADIX:
  170.     LD    (DEFAULT),A    ; install binary as default
  171.     RET
  172. RADIXERR:
  173.     SCF            ; carry flag indicates error
  174.     RET
  175. DEFAULT:
  176.     DB    10        ; storage for default radix
  177.     END
  178. y as default
  179.     RET
  180. RADIXERR:
  181.     SCF            ; carry flag