In Kick Assembler, a segment is a list of memory blocks, so let's look at these first.
A memory block is generated each time you use the *= directive. It has a start, an optional name and might be marked as virtual. If you add code without defining a memory block first, a default block is created for you. Here are examples of memory blocks.
inc $d020 // This create a default memory block
jmp *-3
*=$1000 // Start of memoryblock 2 (unnamed)
lda #1
sta $d020
rts
*=$4000 "block3" // Start of memoryblock 3
lda #2
sta $d021
rts
A segment is a list of memory blocks. Since you haven't selected any segment in the above code, they are all placed on the 'Default' segment.
A segment is defined by the .segmentdef directive and you use the .segment directive to decide which segment to add code to:
// Define two segments
.segmentdef MySegment1
.segmentdef MySegment2 [start=$1000]
// Add code to segment1
.segment MySegment1
*=$4000
ldx #30
l1: inc $d021
dex
bne l1
// Add code to segment2 (Using default block starting in $1000)
.segment MySegment2
inc $d021
jmp *-3
// Switch back to segment1 and add more code.
.segment MySegment1
inc $d020
jmp *-3
In the above code MySegment1 is defined used the default parameters for a segment. While MySegment2 is defined setting the start address for the default memory block to $1000. A complete list of parameters is given in the end of this chapter.
Notice that you can switch back to a segment at any time and continue adding code to its current memory block.
Sometimes, it's convenient to define a memory block and switch to it with the same command. This is done by adding a parameters block ([...]) to the segment directive.
// This:
.segment MySegment [start=$1000]
// Is a shorthand notations for this:
.segmentdef MySegment [start=$1000]
.segment MySegment
A segment can only by be defined once so the above will give produce an error saying that 'MySegment' is double defined.





