Implement [[ fragment literals ]] (#1614)

This feature is referred to as "code/data literals" in ASMotor,
and simply as "literals" in some older assemblers like MIDAS
for the PDP-10. RGBASM already had the "section fragments"
feature for keeping disparate contents together when linked,
so these worked naturally as "fragment literals".
This commit is contained in:
Rangi
2025-07-09 12:13:01 -04:00
committed by GitHub
parent 5e43ece578
commit 41ab5dff5a
19 changed files with 343 additions and 13 deletions

View File

@@ -1,15 +1,15 @@
error: code-after-endm-endr-endc.asm(6):
syntax error, unexpected PRINTLN, expecting end of line or end of buffer
syntax error, unexpected PRINTLN, expecting end of line or end of buffer or end of fragment literal
error: code-after-endm-endr-endc.asm(7):
Macro "mac" not defined
error: code-after-endm-endr-endc.asm(12):
syntax error, unexpected PRINTLN, expecting end of line or end of buffer
syntax error, unexpected PRINTLN, expecting end of line or end of buffer or end of fragment literal
error: code-after-endm-endr-endc.asm(17):
syntax error, unexpected PRINTLN, expecting end of line
error: code-after-endm-endr-endc.asm(19):
syntax error, unexpected PRINTLN, expecting end of line or end of buffer
syntax error, unexpected PRINTLN, expecting end of line or end of buffer or end of fragment literal
error: code-after-endm-endr-endc.asm(23):
syntax error, unexpected PRINTLN, expecting end of line
error: code-after-endm-endr-endc.asm(25):
syntax error, unexpected PRINTLN, expecting end of line or end of buffer
syntax error, unexpected PRINTLN, expecting end of line or end of buffer or end of fragment literal
Assembly aborted with 7 errors!

View File

@@ -0,0 +1,14 @@
SECTION "OAMDMACode", ROM0
OAMDMACode:
LOAD "hOAMDMA", HRAM
hOAMDMA::
ldh [$ff46], a
ld a, 40
jp [[
: dec a
jr nz, :-
ret
]]
.end
ENDL
OAMDMACodeEnd:

View File

@@ -0,0 +1,2 @@
FATAL: fragment-literal-in-load.asm(7):
`LOAD` blocks cannot contain fragment literals

View File

@@ -0,0 +1,9 @@
SECTION "RAM", WRAM0
wFoo:: db
wBar:: ds 3
println "ok"
wQux:: dw [[
ds 4
println "inline"
]]

View File

@@ -0,0 +1,2 @@
FATAL: fragment-literal-in-ram.asm(6):
Section 'RAM' cannot contain fragment literals (not ROM0 or ROMX)

View File

@@ -0,0 +1 @@
ok

View File

@@ -0,0 +1,5 @@
SECTION UNION "U", ROM0
db $11
dw [[ db $22 ]]
SECTION UNION "U", ROM0
db $33

View File

@@ -0,0 +1,2 @@
FATAL: fragment-literal-in-union.asm(3):
`SECTION UNION` cannot contain fragment literals

View File

@@ -0,0 +1,62 @@
SECTION "1", ROM0[0]
DEF VERSION EQU $11
GetVersion::
ld a, [ [[db VERSION]] ]
ret
SECTION "2", ROM0, ALIGN[4]
MACRO text
db \1, 0
ENDM
MACRO text_pointer
dw [[
text \1
]]
ENDM
GetText::
ld hl, [[
dw [[ db "Alpha", 0 ]]
dw [[
text "Beta"
]]
text_pointer "Gamma"
dw 0
]]
ld c, a
ld b, 0
add hl, bc
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
ret
SECTION "C", ROM0
Foo::
call [[ jp [[ jp [[ ret ]] ]] ]]
call [[
Label::
call GetVersion
DEF MYTEXT EQU 3
ld a, MYTEXT
call GetText
ld b, h
ld c, l
ret
]]
jp [[
Bar:
inc hl
.loop
nop
: dec l
jr nz, :-
dec h
jr nz, .loop
ret
]]

Binary file not shown.

View File

@@ -7,5 +7,5 @@ error: syntax-error-after-syntax-error.asm(6):
error: syntax-error-after-syntax-error.asm(9):
syntax error, unexpected :
error: syntax-error-after-syntax-error.asm(10):
syntax error, unexpected stop, expecting end of line or end of buffer or ::
syntax error, unexpected stop, expecting end of line or end of buffer or end of fragment literal or ::
Assembly aborted with 5 errors!