; Copyright 2019 faddenSoft. All Rights Reserved.
; See the LICENSE.txt file for distribution terms (Apache 2.0).

*SYNOPSIS Symbol set 1 for test 20170-external-symbols

; Platform symbols aren't applied to file data.
CodeWrap    @   $0f00  $1000    ;encases program

; SameName2 and SameName3 are replaced by later file
SameName1   @   $2000
SameName2   @   $2010
SameName3   @   $2020

; Symbols with the same values but different names are defined
; in later files.  Names are chosen to not provide a strict
; alphabetical progression.
;
; These do not have widths, so we can check N+1 to confirm that it does
; not resolve to a symbol.
SameValA_C  @   $2100
SameValB_B  @   $2110
SameValC_A  @   $2120

; Test overlap with project symbol.  Declare at $2202(4b), and $220a(1b).
ChkProj1    @   $2200   4
ChkProj2    @   $2204   4

; Overlapping regions, defined within a single platform file.  We
; should prefer matches by proximity and width.  When all else is
; equal, choose alphabetically.
Over1       @   $3000   16      ;$3000-300f, inclusive
Over2       @   $3002   8       ;$3002-3009
Over3       @   $3006   7       ;$3006-300c
Over2a      @   $3006   1       ;$3006

; Expected result:
;  $3000-3001: Over1
;  $3002-3005: Over2
;  $3006     : Over4
;  $3007-300c: Over3
;  $300d-300f: Over1

; Overlapping regions defined in multiple files.  The later definition
; takes priority.  So while SepOver1 would normally end at $3102,
; instead it steps on the first two bytes of SepOver2.
SepOver2    @   $3102   4       ;$3102-3105, inclusive

; Test overlap with local variable.  Declare at $41(2b).
OverVar     @   $40     4

; Test bank wrap.
BankWrap    @   $fff0   $20

; Width specifiers on constants should be ignored.
; Uses a leading '_' to test special 64tass handling.
_FatConst   =   $4000   8

; Overlapping multi-byte items with exact and inexact matches.
OverA_0     @   $6000   8       ;should win, alphabetically
OverB_0     @   $6000   8
OverB_1     @   $6100   8       ;(file order reversed)
OverA_1     @   $6100   8       ;should win, alphabetically
OverA_2     @   $6200   8
OverB_2     @   $6200           ;should win because narrower
OverA_3     @   $6300   8       ;(ref OverA_3+4)
OverB_3     @   $6300   7       ;should win because narrower
OverA_4     @   $6401   8       ;(ref OverA_4+2)
OverB_4     @   $6402   8       ;should win because closer
OverC_4     @   $6403   8


; I/O direction test
ReadOnly    <   $5000 2         ;R
WriteOnly   >   $5001 2         ;W


;
; MULTI_MASK tests.
;
; The behavior of overlapping masks is not currently defined, so we don't test
; that scenario.
;

; overlaps with multi range in second symbol file
AlsoMoreMultiZero @ $c110       ;winner

*MULTI_MASK $ff00 $c000 $000f   ;$c000-c00f, repeats $c010-c01f, etc. to $c0ff
MultiZero       @   $c000
AlsoMultiZero   @   $c010       ;wins (alphabetically)
MultiOne        @   $c021
; Test: C000, C010, C020, C0F0
; Test: C001, C011, C021
; Test: C002, C012, C022

MultiRead       <   $c004 3     ;$c004/5/6, read-only
MultiWrite      >   $c005 3     ;$c005/6/7, write-only
; Test: read C003 C004 C005 C006 C007
; Test: write C004 C005 C006 C007 C008

; try a non-matching constant; should be accepted without complaint
MultiConst      =   $4567


;
; Invalid values.  These cause a warning at load time, and the symbol will
; be ignored.
;

; Not in range.
MultiInvalid    @   $1234

; Not all covered addresses are inside the masked range.
TooLong         @   $c0f8   $a

;
; Badly-formed MULTI_MASK entries.  These cause a warning at load time, and
; the directive will be ignored.
;
*MULTI_MASK $fffff $ffff $ffff  ;range
*MULTI_MASK $ffff $fffff $ffff  ;range
*MULTI_MASK $ffff $ffff $fffff  ;range

*MULTI_MASK
