Next Previous Contents

## 13. Macro packages

Using the `.MACPACK` directive, predefined macro packages may be included with just one command. Available macro packages are:

## 13.1 `.MACPACK generic`

This macro package defines macros that are useful in almost any program. Currently, two macros are defined:

> `

>             .macro  add     Arg
>                     clc
>                     adc     Arg
>             .endmacro

>             .macro  sub     Arg
>                     sec
>                     sbc     Arg
>             .endmacro

> `

## 13.2 `.MACPACK longbranch`

This macro package defines long conditional jumps. They are named like the short counterpart but with the 'b' replaced by a 'j'. Here is a sample definition for the "`jeq`" macro, the other macros are built using the same scheme:

> `

>             .macro  jeq     Target
>                     .if     .def(Target) .and ((*+2)-(Target) <= 127)
>                     beq     Target
>                     .else
>                     bne     *+5
>                     jmp     Target
>                     .endif
>             .endmacro

> `

All macros expand to a short branch, if the label is already defined (back jump) and is reachable with a short jump. Otherwise the macro expands to a conditional branch with the branch condition inverted, followed by an absolute jump to the actual branch target.

The package defines the following macros:

> `

>             jeq, jne, jmi, jpl, jcs, jcc, jvs, jvc

> `

## 13.3 `.MACPACK cbm`

The cbm macro package will define a macro named `scrcode`. It takes a string as argument and places this string into memory translated into screen codes.

## 13.4 `.MACPACK cpu`

This macro package does not define any macros but constants used to examine the value read from the `.CPU` pseudo variable. For each supported CPU a constant similar to

> `

>         CPU_6502
>         CPU_65SC02
>         CPU_65C02
>         CPU_65816
>         CPU_SUNPLUS
>         CPU_SWEET16
>         CPU_HUC6280

> `

is defined. These constants may be used to determine the exact type of the currently enabled CPU. In addition to that, for each CPU instruction set, another constant is defined:

> `

>         CPU_ISET_6502
>         CPU_ISET_65SC02
>         CPU_ISET_65C02
>         CPU_ISET_65816
>         CPU_ISET_SUNPLUS
>         CPU_ISET_SWEET16
>         CPU_ISET_HUC6280

> `

The value read from the `.CPU` pseudo variable may be checked with `.BITAND` to determine if the currently enabled CPU supports a specific instruction set. For example the 65C02 supports all instructions of the 65SC02 CPU, so it has the `CPU_ISET_65SC02` bit set in addition to its native `CPU_ISET_65C02` bit. Using

> `

>             .if (.cpu .bitand CPU_ISET_65SC02)
>                     lda     (sp)
>             .else
>                     ldy     #$00
>                     lda     (sp),y
>             .endif

> `

it is possible to determine if the

> `

>                     lda     (sp)

> `

instruction is supported, which is the case for the 65SC02, 65C02 and 65816 CPUs (the latter two are upwards compatible to the 65SC02).

Next Previous Contents