It is possible to set a minimum and maximum address of the segment using the 'min' and 'max' parameters. If a block gets outside the given boundaries, it will give an error:
.segment Data [start=$c000, min=$c000, max=$cfff]
.fill $1800, 0 // Error since range is $c000-$d7ffIn some cases it is useful to ensure a segment have a specific site. By setting the 'fill' parameter to true all non used values in the min-max range is set to the fill byte:
// This will generate $1000: 0,0,1,2,3,0,0,0
.segment Data [min=$1000, max=$1008, fill]
*=$1002
.byte 1,2,3 In the above example the fill byte is zero, but it can be specified with the 'fillByte' parameter.
Restricting size can be used to avoid using the ROM area or simply enforcing the rules of a maximum size of 256 or 128 bytes.
The following entry was submitted to the 128 byte font competition on CSDb by Jesper Balman Gravgaard (Rex). It rotates the ROM font 90 degrees. The max size of 128 bytes includes the two address bytes of the prg file.
// 90 degree rotated ROM font in 69 bytes of code
.segment Main [min=$0801, max=$0880-2, outPrg="out.prg"]
.label SCREEN = $400
.label CHARGEN = $d000
.label CHARSET = $3000
*=$0801 "Basic"
BasicUpstart(ch2)
*=$080d "Program"
ch4: dey // Wait for 8 char lines
bne ch
lda pix+1 // Next char
clc
adc #8
sta pix+1
ch2: sei // Start char
lda #$32
sta $1
ldy #8
ch: lda CHARGEN // Start char line
ldx #7
npi: asl // Start pixel
pix: rol CHARSET,x
dex
bpl npi
inc ch+1 // Next char line
bne ch4
inc pix+2 // Inc both high bytes
inc ch+2
bne ch4 // Run until CHARGEN is $0000
ee:
lda #$37
sta $1
cli
lda #SCREEN/$40|CHARSET/$400
sta $d018
rts





