;Copyright 2000 - Mark McDonald All rights reserved
; DECLARE: FUNCTION ucaseint(BYVAL integer) AS INTEGER
; DESC:    Convert a character byte from lower case to upper case.  Works
;          with international characters as well.
; EXAMP:   NewChar = ucaseint(OldChar)

MCODE Segment Byte
        Assume  CS: MCODE

; Table of international characters
Intrnl  DB      'š', '�', 'A', 'Ž', 'A', '�', '€', 'E', 'E', 'E'
        DB      'I', 'I', 'I', 'Ž', '�', '�', '’', '’', 'O', '™'
        DB      'O', 'U', 'U', 'Y', '™', 'š', '›', 'œ', '�', 'ž'
        DB      'Ÿ', 'A', 'I', 'O', 'U', '¥', '¥', 'A', 'O'

        Public  ucaseint

ucaseint Proc Far

arg     Char:   WORD = Retbytes

        push    BP                      ;
        mov     BP, SP                  ;
        push    BX                      ;

        mov     AX, Char                ; put charactor in AX
        or      AH, AH                  ; is AH clear?
        jnz     Exit                    ; no, exit
        cmp     AL,'a'                  ; is char less than "a"?
        jb      Exit                    ; yes, exit
        cmp     AL,167                  ; is char greater than 167?
        JA      Exit                    ; yes, exit
        cmp     AL,'z'                  ; is it greater than "z"?
        ja      International           ; yes, check international chars
        sub     AL,32                   ; Convert to uppercase
        jmp     Short Exit              ;
International:
        cmp     AL,129                  ; is it less than 129?
        jb      Exit                    ; yes, exit
        sub     AL,129                  ; make it base 0
        mov     BX,OFFSET Intrnl        ; put offset of table into BX
        xlat    CS: [BX]                ; get proper upper case char
Exit:
        pop     BX                      ;
        pop     BP                      ;
        retf    Retbytes                ;
ucaseint EndP
MCODE EndS
        End