mirror of
https://github.com/byteworksinc/Linker.git
synced 2024-11-22 20:32:39 +00:00
Treat ORG records as giving a signed offset from the current location.
This is the way they are defined in the GS/OS Reference, as well as the way they seem to be used by all assemblers and all other linkers that I could check (ORCA/M, MPW AsmIIGS, Apple LinkIIGS, old ORCA/APW LINKED, 8-bit ORCA linker). Previously, this linker treated ORG records as giving an absolute address to ORG to (but with a bug in the address computation). The OMF spec in appendix B of the ORCA/M manual defines them this way, but this is inconsistent with the spec in the GS/OS Reference and with the way ORG records are generated by ORCA/M itself (for an ORG *+expression directive). Therefore, I think this is just an error and the specification in the GS/OS Reference should be regarded as correct. We still do not support going backward (using a negative ORG operand). Trying to do so will just give an error.
This commit is contained in:
parent
9f232e883a
commit
850952d612
@ -13,6 +13,11 @@ Updated 2022
|
||||
3. Fixed bug that caused EQU or GEQU expressions with non-constant
|
||||
operands to be evaluated incorrectly.
|
||||
|
||||
4. The numeric value in an ORG record is now treated as a signed
|
||||
offset from the current location, consistent with its
|
||||
definition in the GS/OS Reference. However, negative offset
|
||||
values are not supported and will produce an error.
|
||||
|
||||
2.0.6 1. The linker could give a spurious error about the relative
|
||||
address calculation for a BRL instruction if it branched
|
||||
forward or backward more than 32 KB. Since the address
|
||||
@ -69,7 +74,9 @@ Updated 2022
|
||||
|
||||
-- Documentation Update -----------------------------------------------------
|
||||
|
||||
No changes.
|
||||
ORCA/M Manual, p. 492
|
||||
|
||||
The operand in an ORG record is a signed offset from the current location, not an absolute address. (This is consistent with the definition in the GS/OS Reference, and with the behavior of ORCA/M and other assemblers and linkers.)
|
||||
|
||||
-- Changes introduced in ORCA/Linker 2.1.0 ----------------------------------
|
||||
|
||||
|
@ -137,13 +137,12 @@ DoOrg private
|
||||
sta r0
|
||||
ldy #3
|
||||
lda [sp],Y
|
||||
sta r2+2
|
||||
sta r2
|
||||
add4 sp,#5
|
||||
|
||||
sub4 r0,loadOrg get the disp from the segment start
|
||||
cmpl pc,r0
|
||||
bge lb1 if the disp is greater than the pc then
|
||||
move4 r0,pc update the pc
|
||||
lda r2
|
||||
bmi lb1 if the disp is positive
|
||||
add4 pc,r0 update the pc
|
||||
lb1 anop
|
||||
rts
|
||||
end
|
||||
|
@ -643,13 +643,12 @@ DoOrg private
|
||||
|
||||
ldy #1 get the value
|
||||
lda [sp],Y
|
||||
sta r4
|
||||
sta r0
|
||||
ldy #3
|
||||
lda [sp],Y
|
||||
sta r6
|
||||
sta r2
|
||||
add4 sp,#5 skip the op code & operand
|
||||
sub4 pc,r4,r0 calculate the space to insert
|
||||
lda r2 if space < 0 then
|
||||
lda r2 if disp < 0 then
|
||||
bpl lb1
|
||||
ph4 #0 Error(NULL,3)
|
||||
ph2 #3
|
||||
|
Loading…
Reference in New Issue
Block a user