Labels and aliases Labels are an important part of your code. However, since each label must normally be unique, this can lead to namespace pollution, and you'll find yourself going through ever more contorted constructions to generate unique label names. Ophis offers two solutions to this: anonymous labels and temporary labels. This tutorial will cover both of these facilities, and also introduce the aliasing mechanism.
Temporary labels Temporary labels are the easiest to use. If a label begins with an underscore, it will only be reachable from inside the innermost enclosing scope. Scopes begin when a .scope statement is encountered. This produces a new, inner scope if there is another scope in use. The .scend command ends the innermost currently active scope. We can thus rewrite our header data using temporary labels, thus allowing the main program to have a label named next if it wants. .word $0801 .org $0801 .scope .word _next, 10 ; Next line and current line number .byte $9e," 2064",0 ; SYS 2064 _next: .word 0 ; End of program .scend .advance 2064
Anonymous labels Anonymous labels are a way to handle short-ranged branches without having to come up with names for the then and else branches, for brief loops, and other such purposes. To define an anonymous label, use an asterisk. To refer to an anonymous label, use a series of + or - signs. + refers to the next anonymous label, ++ the label after that, etc. Likewise, - is the most recently defined label, -- the one before that, and so on. The main body of the Hello World program with anonymous labels would be: ldx #0 * lda hello, x beq + jsr $ffd2 inx bne - * rts It is worth noting that anonymous labels are globally available. They are not temporary labels, and they ignore scoping restrictions.
Aliasing Rather the reverse of anonymous labels, aliases are names given to specific memory locations. These make it easier to keep track of important constants or locations. The KERNAL routines are a good example of constants that deserve names. To assign the traditional name chrout to the routine at $FFD2, simply give the directive: .alias chrout $ffd2 And change the jsr command to: jsr chrout The final version of the code is in . It should assemble to exactly the same program as .