home *** CD-ROM | disk | FTP | other *** search
- .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
-