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 / ZSYS / SIMTEL20 / SYSLIB / SLIB2.LBR / SEVAL.Z80 < prev    next >
Text File  |  2000-06-30  |  3KB  |  143 lines

  1. ;
  2. ; SYSLIB Module Name:  SEVAL
  3. ; Author:  Richard Conn
  4. ; SYSLIB Version Number:  3.6
  5. ; Module Version Number:  1.1
  6.  
  7.     public    eval
  8.  
  9. ;
  10. ;  EVAL --
  11. ;    On input, HL points to a string of ASCII binary, octal, decimal,
  12. ; or hexadecimal characters to convert to binary; this string may take
  13. ; any of the following forms --
  14. ;
  15. ;    bbbbbbbbbbbbbbbbB -- b=0 or b=1; binary string
  16. ;    ttttt or tttttD -- 0<= t <= 9; decimal string
  17. ;    hhhhH or hhhhX -- 0<= h <= F; hexadecimal string
  18. ;    oooooooO or oooooooQ -- 0<= o <=7; octal string
  19. ;
  20. ;    On return, DE = value, HL points to next byte after
  21. ; string, A=E; BC is not affected.
  22. ;    On return, CARRY Set means error, and HL pts to byte after error
  23. ;
  24.  
  25.     EXT    CAPS    ; CAPITALIZATION ROUTINE
  26.     EXT    EVAL16    ; CONVERT HEX STRING
  27.     EXT    EVAL10    ; CONVERT DEC STRING
  28.     EXT    EVAL8    ; CONVERT OCT STRING
  29.     EXT    EVAL2    ; CONVERT BIN STRING
  30.  
  31. EVAL:
  32.     PUSH    BC    ; SAVE BC
  33.     PUSH    HL    ; SAVE PTR TO 1ST CHAR
  34.     XOR    A    ; A=0
  35.     LD    (CFLAG),A    ; SET CHARACTER FOUND FLAG TO NULL
  36.  
  37. ;  Find end of string
  38. FEND:
  39.     LD    A,(HL)    ; GET BYTE
  40.     CALL    CAPS    ; CAPITALIZE
  41.     SUB    '0'    ; ASSUME HEX
  42.     JP    C,FEDONE    ; DONE
  43.     CP    10    ; 0-9?
  44.     JP    C,FECONT    ; CONTINUE
  45.     SUB    7
  46.     CP    16    ; A-F?
  47.     JP    NC,FEDONE
  48.  
  49. ;  Digit found -- set flag and point to next
  50. FECONT:
  51.     LD    A,1    ; GET A 1
  52.     LD    (CFLAG),A    ; SET FLAG
  53.     INC    HL    ; PT TO NEXT
  54.     JP    FEND
  55.  
  56. ;  Found end of string
  57. FEDONE:
  58.     LD    A,(HL)    ; GET OFFENDING CHAR
  59.     CALL    CAPS    ; CAPITALIZE
  60.     LD    C,A
  61.     DEC    HL    ; GET PREVIOUS CHAR (POSSIBLY BINARY OR DEC)
  62.     LD    A,(HL)    ; GET IT
  63.     CALL    CAPS    ; CAPITALIZE
  64.     LD    B,A
  65.     POP    HL    ; RESTORE POINTER TO 1ST CHAR IN STRING
  66.     LD    DE,0    ; SET ZERO VALUE (ERROR EXIT)
  67.     LD    A,(CFLAG)    ; ANY CHARS?
  68.     JP    Z,DONE    ; DONE IF NONE
  69.  
  70. ;  Determine type of string (H,X=hex; O,Q=oct; B=bin; D,other=dec)
  71.     LD    A,C    ; GET TERMINATING CHAR
  72.     CP    'H'    ; HEX
  73.     JP    Z,EHEX
  74.     CP    'X'
  75.     JP    Z,EHEX
  76.     CP    'O'    ; OCTAL
  77.     JP    Z,EOCT
  78.     CP    'Q'
  79.     JP    Z,EOCT
  80.     LD    A,B    ; GET PREVIOUS CHAR FOR BINARY CHECK
  81.     CP    'B'    ; BINARY?
  82.     JP    Z,EBIN
  83.  
  84. ;  Evaluate string as decimal
  85.     CALL    EVAL10    ; EVALUATE AS DECIMAL
  86.     LD    A,(HL)    ; MAY PT TO D
  87.     CALL    CAPS
  88.     CP    'D'    ; INCR HL IF SO
  89.     JP    NZ,DONE
  90.     INC    HL    ; PT TO NEXT
  91.     JP    DONE
  92.  
  93. ;  Evaluate string as hexadecimal
  94. EHEX:
  95.     CALL    EVAL16    ; EVAUATE AS HEXADECIMAL
  96.     LD    A,(HL)    ; MUST PT TO H OR X
  97.     CALL    CAPS
  98.     INC    HL    ; PT TO NEXT
  99.     CP    'H'
  100.     JP    Z,DONE
  101.     CP    'X'
  102.     JP    Z,DONE
  103.  
  104. ;  String Error -- set flag
  105. ERROR:
  106.     LD    A,E    ; LOW-ORDER IN A
  107.     SCF        ; SET CARRY FLAG FOR ERROR
  108.     POP    BC    ; RESTORE BC
  109.     RET
  110.  
  111. ;  Evaluate string as octal
  112. EOCT:
  113.     CALL    EVAL8    ; EVALUATE AS OCTAL
  114.     LD    A,(HL)    ; MUST PT TO O OR Q
  115.     CALL    CAPS
  116.     INC    HL    ; PT TO NEXT
  117.     CP    'O'
  118.     JP    Z,DONE
  119.     CP    'Q'
  120.     JP    Z,DONE
  121.     JP    ERROR    ; ERROR OTHERWISE
  122.  
  123. ;  Flag buffer
  124. CFLAG:    DS    1    ; 0 IF NO CHARS IN STRING, 1 OTHERWISE
  125.  
  126. ;  Evaluate string as binary
  127. EBIN:
  128.     CALL    EVAL2    ; EVALUATE AS BINARY
  129.     LD    A,(HL)    ; MUST PT TO B
  130.     CALL    CAPS
  131.     INC    HL    ; PT TO NEXT
  132.     CP    'B'
  133.     JP    NZ,ERROR
  134.  
  135. ;  Done with evaluation -- no error
  136. DONE:
  137.     LD    A,E    ; LOW-ORDER IN A
  138.     OR    A    ; CLEAR CARRY FLAG
  139.     POP    BC    ; RESTORE BC
  140.     RET
  141.  
  142.     END
  143.