Defines a Union-TypeName that represents an aggregate data type containing one or more fields. All of the fields occupy the same physical position in storage.
Syntax
Union-Name UNION FieldDeclaration . . . Union-Name ENDS
Where FieldDeclaration has the following form:
[FieldName] Allocation-TypeName InitialValue [, InitialValue ...]Remarks
This directive is not available in M510 mode.
The syntax for the FieldDeclaration is that of a normal data allocation statement. See the section on Data Allocation for a full description of this syntax.
The various parts of the FieldDeclaration are described as follows:
FieldName
          .386
IS_sint32  equ -4
IS_sint16  equ -2
IS_sint8   equ -1
NO_TYPE    equ  0
IS_uint8   equ  1
IS_uint16  equ  2
IS_uint32  equ  4
TYPE_T     typedef SBYTE
DATA_T     union
  uint8    BYTE   ?
  sint8    SBYTE  ?
  uint16   WORD   ?
  sint16   SWORD  ?
  uint32   DWORD  ?
  sint32   SDWORD ?
DATA_T     ends
VALUE_T    struct
  DataType  TYPE_T NO_TYPE
  DataValue DATA_T {}
VALUE_T    ends
           .data
Value      VALUE_T { IS_uint8, { 1 } }           ; unsigned 8-bit value of 1
          .code
; Procedure:  IsNegative
; Returns  :  1 in EAX if Value.DataValue holds a negative number
;             0 in EAX if Value.DataValue holds a positive number
IsNegative proc
           cmp   Value.DataType, NO_TYPE         ; check sign of TYPE_T
           jns   short Positive                  ; if positive, so is value
; check for signed 8-bit integer
           cmp   Value.DataType, IS_sint8
           jne   short @F                        ; not 8, check for 16
           movsx EAX, Value.DataValue.sint8      ; convert 8 bits to 32
           jmp   short Check                     ; and check the value
; check for signed 16-bit integer
@@:        cmp   Value.DataType, IS_sint16
           jne   short @F                        ; not 16, check for 32
           movsx EAX, Value.DataValue.sint16     ; convert 16 bits to 32
           jmp   short Check                     ; and check the value
; check for signed 32-bit integer
@@:        cmp   Value.DataType, IS_sint32
           jne   short Positive                  ; unknown, assume positive
           mov   EAX, Value.DataValue.sint32     ; get full 32 bit number
Check:     or    EAX,EAX                         ; check for negative value
           jns   short Positive                  ; no sign bit, positive
           mov   EAX, 1                          ; indicate negative
           ret                                   ; and return
Positive:  mov   EAX, 0                          ; indicate positive
           ret                                   ; and return
IsNegative endp
end