home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol090 / seval.mac < prev    next >
Encoding:
Text File  |  1984-04-29  |  2.9 KB  |  147 lines

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