The * directive is used to set the program counter. A program should always start with a * directive to tell the assembler where to put the output. Here are some examples of use:
*=$1000 "Program"
ldx #10
!loop: dex
bne !loop-
rts
*=$4000 "Data"
.byte 1,0,2,0,3,0,4,0
*=$5000 "More data"
.text "Hello"Note: The old notation ('.pc=$1000') from Kick Assembler 2.x and 3.x is still supported.
The last argument is optional and is used to name the memory block created by the directive. When using the ‘-showmem’ option when running the assembler a memory map will be generated that displays the memory usage and block names. The map of the above program looks like this:
Memory Map ---------- $1000-$1005 Program $4000-$4007 Data $5000-$5004 More data
By using the virtual option on the .pc directive you can declare a memory block that is not saved in the resulting file.
*=$0400 "Data Tables 1" virtual
table1: .fill $100,0
table2: .fill $100,0
*=$0400 "Data Tables 2" virtual
table3: .fill $150,0
table4: .fill $100,0
*=$1000 "Program"
ldx #0
lda table1,x
…
Note that virtual memory blocks can overlap other memory blocks. They are marked with an asterisk in the memory map.
Memory Map ---------- *$0400-$05ff Data Tables 1 *$0400-$064f Data Tables 2 $1000-$1005 Program
Since virtual memory blocks aren’t saved, the above example will only save the memory from $1000 to $1005.
With the .align directive, you can align the program counter to a given interval. This is useful for optimizing your code as crossing a memory page boundary yields a penalty of one cycle for memory referring commands. To avoid this, use the .align command to align your tables:
*=$1000 "Program"
ldx #1
lda data,x
rts
*=$10ff //Bad place for the data
.align $100 //Alignment to the nearest page boundary saves a cycle
data: .byte 1,2,3,4,5,6,7,8
In case you want your code placed at position $1000 in the memory but want it assembled like it was placed at $2000, you can use the .pseudopc directive:
*=$1000 "Program to be relocated at $2000"
.pseudopc $2000 {
loop: inc $d020
jmp loop // Will produce jmp $2000 instead of jmp $1000
}




