that sounds like a crazy system, if ORG sets the address of assembly, what set the PC address?
you have
Code:
*=$8000 ; this set the assembly address to 8000
to change the final target of the assembly, so code that you copy and execute somewhere else you change the assembly PC but not the current PC
.logical $200
start
lda Start+5
sta $d020
rts
.byte 00
.here
so Start+5 = $205 however the code will be stored at $8000 in the output file.
To make a standard NES ROM starting at $8000 bin file you would do
Code:
*=$0000 ; assembly set to output $0
.logical $8000 ; assemble as if the code is at $8000
..your code here
.here
if you have multiple banks at $8000 and a fixed bank at $c000 store in ram as 16K 8K 8K 8K overlay
Code:
*=$0000
.logical $8000
16K of code here
.here
;Bank1 ; $4000 @$8000
.logical $8000
upto 8K here
.align $c000
.here
;Bank 2 ; $6000 @$8000
.logical $8000
upto 8K here
.align $c000
.here
;Bank 3 ; $8000 @$8000
.logical $8000
upto 8K here
.align $c000
.here
However I would recommend using sections and collecting them to form your actual code.
You then have the .virtual case which lets you put a struct or anything else that doesn't actually modify memory at a fixed location. For example you might want to map PPU registers this way.
Code:
.virtual $2000
.block PPU
CTRL .byte ?
MASK .byte ?
STATUS .byte ?
OAMADDR .byte ?
OAMDATA .byte ?
PPUSCROLL .byte ?
PPUADDR .byte ?
PPUDATA .byte ?
OAMDMA .byte ?
.bend
.endv
this way you don't have to actually move the assemble address or logical address and can just place a virtual move so it won't appear in the output memory map. However you can do
STA PPU.MASK and it will put $2001 for you.
The true power of Virtual is it will take an expression so
Code:
.virtual #1,s
p1 .addr ?
tmp .byte ?
.endv
lda (p1),y will assemble to lda ($01,s),y
lda (tmp) will assemble to lda $03,s