mirror of
https://github.com/pfusik/xasm.git
synced 2024-09-24 22:54:29 +00:00
Support a:/f: modifiers on run/ini.
This commit is contained in:
parent
5680efc7f5
commit
b42f9dc2bf
75
xasm.d
75
xasm.d
@ -121,6 +121,13 @@ enum AddrMode {
|
|||||||
|
|
||||||
AddrMode addrMode;
|
AddrMode addrMode;
|
||||||
|
|
||||||
|
enum OrgModifier {
|
||||||
|
NONE,
|
||||||
|
FORCE_HEADER,
|
||||||
|
FORCE_FFFF,
|
||||||
|
RELOCATE
|
||||||
|
}
|
||||||
|
|
||||||
int origin = -1;
|
int origin = -1;
|
||||||
int loadOrigin;
|
int loadOrigin;
|
||||||
int loadingOrigin;
|
int loadingOrigin;
|
||||||
@ -2178,8 +2185,34 @@ void originWord(ushort value, char listingChar) {
|
|||||||
listingLine[listingColumn++] = listingChar;
|
listingLine[listingColumn++] = listingChar;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setOrigin(int addr, bool requestedHeader, bool requestedFFFF) {
|
OrgModifier readOrgModifier() {
|
||||||
|
readSpaces();
|
||||||
|
if (column + 2 < line.length && line[column + 1] == ':') {
|
||||||
|
switch (line[column]) {
|
||||||
|
case 'F':
|
||||||
|
case 'f':
|
||||||
|
checkHeadersOn();
|
||||||
|
column += 2;
|
||||||
|
return OrgModifier.FORCE_FFFF;
|
||||||
|
case 'A':
|
||||||
|
case 'a':
|
||||||
|
checkHeadersOn();
|
||||||
|
column += 2;
|
||||||
|
return OrgModifier.FORCE_HEADER;
|
||||||
|
case 'R':
|
||||||
|
case 'r':
|
||||||
|
column += 2;
|
||||||
|
return OrgModifier.RELOCATE;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return OrgModifier.NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setOrigin(int addr, OrgModifier modifier) {
|
||||||
origin = loadOrigin = addr;
|
origin = loadOrigin = addr;
|
||||||
|
bool requestedHeader = modifier != OrgModifier.NONE;
|
||||||
if (requestedHeader || loadingOrigin < 0 || (addr != loadingOrigin && !optionFill)) {
|
if (requestedHeader || loadingOrigin < 0 || (addr != loadingOrigin && !optionFill)) {
|
||||||
blockIndex++;
|
blockIndex++;
|
||||||
if (!pass2) {
|
if (!pass2) {
|
||||||
@ -2192,7 +2225,7 @@ void setOrigin(int addr, bool requestedHeader, bool requestedFFFF) {
|
|||||||
throw new AssemblyError("Cannot generate an empty block");
|
throw new AssemblyError("Cannot generate an empty block");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (requestedFFFF || objectBytes == 0) {
|
if (modifier == OrgModifier.FORCE_FFFF || objectBytes == 0) {
|
||||||
assert(requestedHeader || addr != loadingOrigin);
|
assert(requestedHeader || addr != loadingOrigin);
|
||||||
originWord(0xffff, '>');
|
originWord(0xffff, '>');
|
||||||
listingLine[listingColumn++] = ' ';
|
listingLine[listingColumn++] = ' ';
|
||||||
@ -2214,44 +2247,26 @@ void checkHeadersOn() {
|
|||||||
|
|
||||||
void assemblyOrg() {
|
void assemblyOrg() {
|
||||||
noRepeatSkipDirective();
|
noRepeatSkipDirective();
|
||||||
readSpaces();
|
OrgModifier modifier = readOrgModifier();
|
||||||
bool requestedFFFF = false;
|
readUnsignedWord();
|
||||||
bool requestedHeader = false;
|
mustBeKnownInPass1();
|
||||||
if (column + 2 < line.length && line[column + 1] == ':') {
|
if (modifier == OrgModifier.RELOCATE) {
|
||||||
switch (line[column]) {
|
|
||||||
case 'F':
|
|
||||||
case 'f':
|
|
||||||
requestedFFFF = true;
|
|
||||||
goto case 'A';
|
|
||||||
case 'A':
|
|
||||||
case 'a':
|
|
||||||
checkHeadersOn();
|
|
||||||
column += 2;
|
|
||||||
requestedHeader = true;
|
|
||||||
break;
|
|
||||||
case 'R':
|
|
||||||
case 'r':
|
|
||||||
column += 2;
|
|
||||||
checkOriginDefined();
|
checkOriginDefined();
|
||||||
readUnsignedWord();
|
|
||||||
mustBeKnownInPass1();
|
|
||||||
origin = value;
|
origin = value;
|
||||||
return;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
setOrigin(value, modifier);
|
||||||
}
|
}
|
||||||
readUnsignedWord();
|
|
||||||
mustBeKnownInPass1();
|
|
||||||
setOrigin(value, requestedHeader, requestedFFFF);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void assemblyRunIni(ushort addr) {
|
void assemblyRunIni(ushort addr) {
|
||||||
noRepeatSkipDirective();
|
noRepeatSkipDirective();
|
||||||
checkHeadersOn();
|
checkHeadersOn();
|
||||||
loadingOrigin = -1; // don't fill
|
loadingOrigin = -1; // don't fill
|
||||||
setOrigin(addr, false, false);
|
OrgModifier modifier = readOrgModifier();
|
||||||
readSpaces();
|
if (modifier == OrgModifier.RELOCATE)
|
||||||
|
throw new AssemblyError("r: invalid here");
|
||||||
|
setOrigin(addr, modifier);
|
||||||
readUnsignedWord();
|
readUnsignedWord();
|
||||||
putWord(cast(ushort) (value));
|
putWord(cast(ushort) (value));
|
||||||
loadingOrigin = -1; // don't fill
|
loadingOrigin = -1; // don't fill
|
||||||
|
Loading…
Reference in New Issue
Block a user