   .if .not .def _16BIT_
_16BIT_ = 1

   .if .not .def _STDDEF_
      .include #stddef
   .endif

; usage: inc.w <address> increments 16 bit word
   .macro inc.w
      .if .def @__0
         .undef @__0
      .endif
      inc   %1
      bne   @__0
      inc   %1+1
@__0
   .endm

; usage: dec.w <address> decrements 16 bit word
; destroys A
   .macro dec.w
      .if .def @__0
         .undef @__0
      .endif
      lda   %1
      bne   @__0
      dec   %1+1
@__0   dec   %1
   .endm

; usage: lsr.w <address>  shifts 16 bit word right
; LSBit in carry
   .macro lsr.w
      lsr   %1+1
      ror   %1
   .endm

; usage: asl.w <address>  shifts 16 bit word left
; MSBit in carry
   .macro asl.w
      asl   %1
      rol   %1+1
   .endm

; usage: rol.w <address>  rotates 16 bit word left
; destroys A
; MSBit in carry
   .macro rol.w
      .warning "untested macro"
      lda   %1
      asl   a
      rol   %1+1
      rol   %1
   .endm

; usage: ror.w <address>  rotates 16 bit word right
; destroys A
; LSBit in carry
   .macro ror.w
      .warning "untested macro"
      lda   %1+1
      lsr   a
      ror   %1
      ror   %1+1
   .endm

; usage: adc.w <value or address>,<address>[,select]
;        Adds two 16 bit words together, like 68000 ADD.W src,dst
; destroys A
; Carry as usual

   .macro adc.w
@0    .= @p1
      .if %0=3
@0       .=  %3
      .endif
      .if .not [@0 & @special]
         clc
      .endif
      lda   %2
      .if @0 & @p1
         adc   #<%1
         sta   %2
         lda   %2+1
         adc   #>%1
      .else
         adc   %1
         sta   %2
         lda   %2+1
         adc   %1+1
      .endif
      sta   %2+1
   .endm

; usage: adc8.w <src: value or address>,<dst: address> [,select]
;        Adds 8 bit byte two 16 bit word.
;
; destroys A
; NO carry

   .macro adc8.w
@0    .= @p1
      .if %0=3
@0       .=  %3
      .endif
      .if .def @__0
         .undef @__0
      .endif
      .if .not [@0 & @special]
         clc
      .endif
      lda   %2
      .if @0 & @p1
         adc   #<%1
      .else
         adc   %1
      .endif
      sta   %2
      bcc   @__0
      inc   %2+1
@__0
   .endm

; usage: cmp.w <value or address>,<address>[,select]
;        Compares two 16 bit words.
;        like  lda   <address>
;              cmp   <value or address>
; destroys A
; NO carry

   .macro cmp.w
@0    .= @p1
      .if   %0=3
@0       .= %3
      .endif
      .if .def @__0
         .undef @__0
      .endif
      lda   %2+1
      .if @0 & @p1
         cmp   #>%1
         bne   @__0
         lda   %2
         cmp   #<%1
      .else
         cmp   %1+1
         bne   @__0
         lda   %2
         cmp   %1
      .endif
@__0
   .endm

; usage: sbc.w <value or address>,<address>[,select]
;        Subtracts two 16 bit words from another
;        like  SUB.W 16,value,@p1
;        subtracts #16 from value
; destroys A
; Carry as usual

   .macro sbc.w
@0    .= @p1
      .if %0=3
@0       .=  %3
      .endif
      .if .not [@0 & @special]
         sec
      .endif
      lda   %2
      .if @0 & @p1
         sbc   #<%1
         sta   %2
         lda   %2+1
         sbc   #>%1
      .else
         sbc   %1
         sta   %2
         lda   %2+1
         sbc   %1+1
      .endif
      sta   %2+1
   .endm

; usage: eor.w <value or address>,<address>[,select]
;        Exclusiv ors two 16 bit words together
; destroys A

   .macro eor.w
@0    .= @p1
      .if %0=3
@0       .=  %3
      .endif
      .if @0 & @p1
         lda   %2
         eor   #<%1
         sta   %2
         lda   %2+1
         eor   #>%1
         sta   %2+1
      .else
         lda   %2
         eor   %1+1
         sta   %2
         lda   %2+1
         eor   %1+1
         sta   %2+1
      .endif
   .endm
; usage: and.w <value or address>,<address>[,select]
;        Bitwise ANDs two 16 bit words together
; destroys A

   .macro and.w
@0    .= @p1
      .if %0=3
@0       .=  %3
      .endif
      .if @0 & @p1
         lda   %2
         and   #<%1
         sta   %2
         lda   %2+1
         and   #>%1
         sta   %2+1
      .else
         lda   %2
         and   %1+1
         sta   %2
         lda   %2+1
         and   %1+1
         sta   %2+1
      .endif
   .endm

; usage: ora.w <value or address>,<address>[,select]
;        Bitwise ORs two 16 bit words together
; destroys A

   .macro ora.w
@0    .= @p1
      .if %0=3
@0       .=  %3
      .endif
      .if @0 & @p1
         lda   %2
         ora   #<%1
         sta   %2
         lda   %2+1
         ora   #>%1
         sta   %2+1
      .else
         lda   %2
         ora   %1+1
         sta   %2
         lda   %2+1
         ora   %1+1
         sta   %2+1
      .endif         
   .endm

   .macro   neg.w
      eor.w $FFFF,%1
      inc.w %1
   .endm
      
   .endif
