; Copyright 2021 faddenSoft. All Rights Reserved.
; See the LICENSE.txt file for distribution terms (Apache 2.0).
;
; Test nested address regions.
;
; Assembler: 64tass
; % tass64 --ascii --case-sensitive --nostart 20250-nested-regions.S

        .cpu    "6502"
*       =       $1000
START
        .word   $3000

; NOTE: leave PRG header as a 2-byte hole with no explicit region

; Start with 3 nested regions that share a starting address.

; EDIT: create region starting at $1000, ending at REGION_END
; EDIT: make all 3 of these relative (especially the first one, which follows non-addr)


; EDIT: create these as fixed-end regions; first one spans full file
        .logical $1000
        .logical $2000
        .logical $3000

part3k  bit     part3k
early   lda     early
        and     late
        jmp     part2k

        .here               ;$3000; now $20xx

part2k  bit     part2k
        jmp     part1k

        .here               ;$2000; now $10xx

part1k  bit     part1k
        jsr     overhole    ;let execution try to fall into non-addr

REGION1_END

; EDIT: next chunk is a *floating* non-addr region

        brk
        .null   "Null-term PETSCII string"
        .byte   $80
        .word   early
        .word   late
        .byte   $80

; 4000-40xx, with two overlapping regions in the $5000 area.  Tests order
; of resolution and descent into children.  (This is mostly tested internally
; by the AddressMap unit tests, so we don't need to go crazy here.)

        .logical $4000
overhole
a4000   bit     a4000
        bit     b5000
        bit     b500f       ;CHECK: resolves to b500f
        bit     c500f       ;CHECK: also resolves to b500f
        nop
        jmp     a4020

; EDIT: set region, add code start tag
        .logical $5000
b5000   bit     b5000
b5003   bit     a4000
        nop
        nop
b5008   bit     b5008       ;CHECK: resolves locally
        bit     c5017       ;CHECK: resolves to other segment
        nop
b500f   rts
        .here               ;$5000, now at $4010

a4020   bit     a4020
        bit     c500f
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        jmp     a4040

; EDIT: set region, add code start tag
        .logical $5008
c5008   bit     c5008       ;CHECK: resolves locally
        bit     b5000       ;CHECK: resolves to other segment
        nop
c500f   bit     c500f
        nop
        nop
        nop
        nop
        nop
c5017   rts
        .here               ;$5008

a4040   bit     a4040
        bit     c5017
        nop
        jmp     tailend
        .here               ;$4000


; EDIT: create region starting at $e000, ending at REGION2_END; relative
        .logical $e000
tailend
partek  bit     part2k
late    nop
        jmp     partdk

; EDIT: create region starting at $d000, ending at REGION2_END; relative
        .logical $d000

partdk  bit     partdk
        jmp     partfk

; EDIT: create, make it floating
        .logical $f000

partfk  bit     partfk
        lda     early
        and     late

end
        nop
        rts
REGION2_END
        .here               ;$f000
        .here               ;$e000
        .here               ;$d000
        .here               ;$1000
