diff --git a/pdp7parse/src/main/antlr4/com/khubla/pdp7parse/antlr4/pdp7.g4 b/pdp7parse/src/main/antlr4/com/khubla/pdp7parse/antlr4/pdp7.g4
index 81c8713..ed5d7b4 100644
--- a/pdp7parse/src/main/antlr4/com/khubla/pdp7parse/antlr4/pdp7.g4
+++ b/pdp7parse/src/main/antlr4/com/khubla/pdp7parse/antlr4/pdp7.g4
@@ -33,13 +33,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
grammar pdp7;
prog
- : line +
+ : lineeol+ line? EOF
;
line
- : declarations? comment? eol
+ : declarations? comment?
;
+lineeol
+ : line eol
+ ;
+
declarations
: declaration (';' declaration)*
;
@@ -58,7 +62,7 @@ argument
;
assignment
- : (variable | LOC | RELOC) '=' expression
+ : (opcode | variable | LOC | RELOC) '=' expression
;
expression
@@ -77,7 +81,8 @@ atom
| DECIMAL
| DECIMAL_MINUS
| OCTAL
- | signednumber
+ | NUMERIC_LITERAL
+ | '-' atom
;
// string chars, then potentially more than 1 octal constant, then potentially '>'
@@ -85,10 +90,6 @@ string
: STRING NUMERIC_LITERAL* '>'?
;
-signednumber
- : '-'? NUMERIC_LITERAL
- ;
-
eol
: EOL
;
@@ -262,7 +263,7 @@ DECIMAL_MINUS
STRING
- : '<' [a-zA-Z0-9$*,%/]*
+ : '<' [a-zA-Z0-9$*,%/:?]*
;
diff --git a/pdp7parse/src/main/java/com/khubla/pdp7parse/antlr4/pdp7BaseListener.java b/pdp7parse/src/main/java/com/khubla/pdp7parse/antlr4/pdp7BaseListener.java
index 803d80f..05ba53a 100644
--- a/pdp7parse/src/main/java/com/khubla/pdp7parse/antlr4/pdp7BaseListener.java
+++ b/pdp7parse/src/main/java/com/khubla/pdp7parse/antlr4/pdp7BaseListener.java
@@ -36,6 +36,18 @@ public class pdp7BaseListener implements pdp7Listener {
*
The default implementation does nothing.
*/
@Override public void exitLine(pdp7Parser.LineContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterLineeol(pdp7Parser.LineeolContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitLineeol(pdp7Parser.LineeolContext ctx) { }
/**
* {@inheritDoc}
*
@@ -144,18 +156,6 @@ public class pdp7BaseListener implements pdp7Listener {
* The default implementation does nothing.
*/
@Override public void exitString(pdp7Parser.StringContext ctx) { }
- /**
- * {@inheritDoc}
- *
- * The default implementation does nothing.
- */
- @Override public void enterSignednumber(pdp7Parser.SignednumberContext ctx) { }
- /**
- * {@inheritDoc}
- *
- * The default implementation does nothing.
- */
- @Override public void exitSignednumber(pdp7Parser.SignednumberContext ctx) { }
/**
* {@inheritDoc}
*
diff --git a/pdp7parse/src/main/java/com/khubla/pdp7parse/antlr4/pdp7Lexer.java b/pdp7parse/src/main/java/com/khubla/pdp7parse/antlr4/pdp7Lexer.java
index 56725ff..1d27ce9 100644
--- a/pdp7parse/src/main/java/com/khubla/pdp7parse/antlr4/pdp7Lexer.java
+++ b/pdp7parse/src/main/java/com/khubla/pdp7parse/antlr4/pdp7Lexer.java
@@ -183,19 +183,19 @@ public class pdp7Lexer extends Lexer {
"V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd"+
"`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1"+
"j\u00d3k\u00d5l\u00d7m\u00d9n\u00dbo\u00ddp\3\2\n\6\2\60\60\62;C\\c|\4"+
- "\2C\\c|\3\2\62;\4\2\62;ch\3\2\629\b\2&\',,..\61;C\\c|\4\2\f\f\17\17\4"+
- "\2\13\13\"\"\u02bf\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13"+
- "\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2"+
- "\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2"+
- "!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3"+
- "\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2"+
- "\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E"+
- "\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2"+
- "\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2"+
- "\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k"+
- "\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2"+
- "\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2"+
- "\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b"+
+ "\2C\\c|\3\2\62;\4\2\62;ch\3\2\629\t\2&\',,..\61 line() {
- return getRuleContexts(LineContext.class);
+ public TerminalNode EOF() { return getToken(pdp7Parser.EOF, 0); }
+ public List lineeol() {
+ return getRuleContexts(LineeolContext.class);
}
- public LineContext line(int i) {
- return getRuleContext(LineContext.class,i);
+ public LineeolContext lineeol(int i) {
+ return getRuleContext(LineeolContext.class,i);
+ }
+ public LineContext line() {
+ return getRuleContext(LineContext.class,0);
}
public ProgContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
@@ -145,24 +149,41 @@ public class pdp7Parser extends Parser {
public final ProgContext prog() throws RecognitionException {
ProgContext _localctx = new ProgContext(_ctx, getState());
enterRule(_localctx, 0, RULE_prog);
- int _la;
try {
+ int _alt;
enterOuterAlt(_localctx, 1);
{
setState(35);
_errHandler.sync(this);
- _la = _input.LA(1);
+ _alt = 1;
do {
- {
- {
- setState(34);
- line();
- }
+ switch (_alt) {
+ case 1:
+ {
+ {
+ setState(34);
+ lineeol();
+ }
+ }
+ break;
+ default:
+ throw new NoViableAltException(this);
}
setState(37);
_errHandler.sync(this);
- _la = _input.LA(1);
- } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45) | (1L << T__46) | (1L << T__47) | (1L << T__48) | (1L << T__49) | (1L << T__50) | (1L << T__51) | (1L << T__52) | (1L << T__53) | (1L << T__54) | (1L << T__55) | (1L << T__56) | (1L << T__57) | (1L << T__58) | (1L << T__59) | (1L << T__60) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__64 - 64)) | (1L << (T__65 - 64)) | (1L << (T__66 - 64)) | (1L << (T__67 - 64)) | (1L << (T__68 - 64)) | (1L << (T__69 - 64)) | (1L << (T__70 - 64)) | (1L << (T__71 - 64)) | (1L << (T__72 - 64)) | (1L << (T__73 - 64)) | (1L << (T__74 - 64)) | (1L << (T__75 - 64)) | (1L << (T__76 - 64)) | (1L << (T__77 - 64)) | (1L << (T__78 - 64)) | (1L << (T__79 - 64)) | (1L << (T__80 - 64)) | (1L << (T__81 - 64)) | (1L << (T__82 - 64)) | (1L << (T__83 - 64)) | (1L << (T__84 - 64)) | (1L << (T__85 - 64)) | (1L << (T__86 - 64)) | (1L << (T__87 - 64)) | (1L << (T__88 - 64)) | (1L << (T__89 - 64)) | (1L << (T__90 - 64)) | (1L << (T__91 - 64)) | (1L << (T__92 - 64)) | (1L << (T__93 - 64)) | (1L << (LOC - 64)) | (1L << (RELOC - 64)) | (1L << (MINUS - 64)) | (1L << (LABEL - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (NUMERIC_LITERAL - 64)) | (1L << (DECIMAL - 64)) | (1L << (OCTAL - 64)) | (1L << (DECIMAL_MINUS - 64)) | (1L << (STRING - 64)) | (1L << (COMMENT - 64)) | (1L << (EOL - 64)))) != 0) );
+ _alt = getInterpreter().adaptivePredict(_input,0,_ctx);
+ } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
+ setState(40);
+ switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) {
+ case 1:
+ {
+ setState(39);
+ line();
+ }
+ break;
+ }
+ setState(42);
+ match(EOF);
}
}
catch (RecognitionException re) {
@@ -177,9 +198,6 @@ public class pdp7Parser extends Parser {
}
public static class LineContext extends ParserRuleContext {
- public EolContext eol() {
- return getRuleContext(EolContext.class,0);
- }
public DeclarationsContext declarations() {
return getRuleContext(DeclarationsContext.class,0);
}
@@ -207,25 +225,67 @@ public class pdp7Parser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(40);
- switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) {
+ setState(45);
+ switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) {
case 1:
{
- setState(39);
+ setState(44);
declarations();
}
break;
}
- setState(43);
+ setState(48);
_la = _input.LA(1);
if (_la==COMMENT) {
{
- setState(42);
+ setState(47);
comment();
}
}
- setState(45);
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
+ public static class LineeolContext extends ParserRuleContext {
+ public LineContext line() {
+ return getRuleContext(LineContext.class,0);
+ }
+ public EolContext eol() {
+ return getRuleContext(EolContext.class,0);
+ }
+ public LineeolContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_lineeol; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof pdp7Listener ) ((pdp7Listener)listener).enterLineeol(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof pdp7Listener ) ((pdp7Listener)listener).exitLineeol(this);
+ }
+ }
+
+ public final LineeolContext lineeol() throws RecognitionException {
+ LineeolContext _localctx = new LineeolContext(_ctx, getState());
+ enterRule(_localctx, 4, RULE_lineeol);
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(50);
+ line();
+ setState(51);
eol();
}
}
@@ -263,26 +323,26 @@ public class pdp7Parser extends Parser {
public final DeclarationsContext declarations() throws RecognitionException {
DeclarationsContext _localctx = new DeclarationsContext(_ctx, getState());
- enterRule(_localctx, 4, RULE_declarations);
+ enterRule(_localctx, 6, RULE_declarations);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(47);
+ setState(53);
declaration();
- setState(52);
+ setState(58);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__0) {
{
{
- setState(48);
+ setState(54);
match(T__0);
- setState(49);
+ setState(55);
declaration();
}
}
- setState(54);
+ setState(60);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -340,53 +400,53 @@ public class pdp7Parser extends Parser {
public final DeclarationContext declaration() throws RecognitionException {
DeclarationContext _localctx = new DeclarationContext(_ctx, getState());
- enterRule(_localctx, 6, RULE_declaration);
+ enterRule(_localctx, 8, RULE_declaration);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(58);
+ setState(64);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==LABEL) {
{
{
- setState(55);
+ setState(61);
label();
}
}
- setState(60);
+ setState(66);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(66);
+ setState(72);
_errHandler.sync(this);
_la = _input.LA(1);
while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45) | (1L << T__46) | (1L << T__47) | (1L << T__48) | (1L << T__49) | (1L << T__50) | (1L << T__51) | (1L << T__52) | (1L << T__53) | (1L << T__54) | (1L << T__55) | (1L << T__56) | (1L << T__57) | (1L << T__58) | (1L << T__59) | (1L << T__60) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__64 - 64)) | (1L << (T__65 - 64)) | (1L << (T__66 - 64)) | (1L << (T__67 - 64)) | (1L << (T__68 - 64)) | (1L << (T__69 - 64)) | (1L << (T__70 - 64)) | (1L << (T__71 - 64)) | (1L << (T__72 - 64)) | (1L << (T__73 - 64)) | (1L << (T__74 - 64)) | (1L << (T__75 - 64)) | (1L << (T__76 - 64)) | (1L << (T__77 - 64)) | (1L << (T__78 - 64)) | (1L << (T__79 - 64)) | (1L << (T__80 - 64)) | (1L << (T__81 - 64)) | (1L << (T__82 - 64)) | (1L << (T__83 - 64)) | (1L << (T__84 - 64)) | (1L << (T__85 - 64)) | (1L << (T__86 - 64)) | (1L << (T__87 - 64)) | (1L << (T__88 - 64)) | (1L << (T__89 - 64)) | (1L << (T__90 - 64)) | (1L << (T__91 - 64)) | (1L << (T__92 - 64)) | (1L << (T__93 - 64)) | (1L << (LOC - 64)) | (1L << (RELOC - 64)) | (1L << (MINUS - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (NUMERIC_LITERAL - 64)) | (1L << (DECIMAL - 64)) | (1L << (OCTAL - 64)) | (1L << (DECIMAL_MINUS - 64)) | (1L << (STRING - 64)))) != 0)) {
{
- setState(64);
- switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) {
+ setState(70);
+ switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) {
case 1:
{
- setState(61);
+ setState(67);
instruction();
}
break;
case 2:
{
- setState(62);
+ setState(68);
assignment();
}
break;
case 3:
{
- setState(63);
+ setState(69);
expression();
}
break;
}
}
- setState(68);
+ setState(74);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -429,28 +489,28 @@ public class pdp7Parser extends Parser {
public final InstructionContext instruction() throws RecognitionException {
InstructionContext _localctx = new InstructionContext(_ctx, getState());
- enterRule(_localctx, 8, RULE_instruction);
+ enterRule(_localctx, 10, RULE_instruction);
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(69);
+ setState(75);
opcode();
- setState(73);
+ setState(79);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,7,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,8,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(70);
+ setState(76);
argument();
}
}
}
- setState(75);
+ setState(81);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,7,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,8,_ctx);
}
}
}
@@ -485,11 +545,11 @@ public class pdp7Parser extends Parser {
public final ArgumentContext argument() throws RecognitionException {
ArgumentContext _localctx = new ArgumentContext(_ctx, getState());
- enterRule(_localctx, 10, RULE_argument);
+ enterRule(_localctx, 12, RULE_argument);
try {
enterOuterAlt(_localctx, 1);
{
- setState(76);
+ setState(82);
expression();
}
}
@@ -508,6 +568,9 @@ public class pdp7Parser extends Parser {
public ExpressionContext expression() {
return getRuleContext(ExpressionContext.class,0);
}
+ public OpcodeContext opcode() {
+ return getRuleContext(OpcodeContext.class,0);
+ }
public VariableContext variable() {
return getRuleContext(VariableContext.class,0);
}
@@ -529,36 +592,132 @@ public class pdp7Parser extends Parser {
public final AssignmentContext assignment() throws RecognitionException {
AssignmentContext _localctx = new AssignmentContext(_ctx, getState());
- enterRule(_localctx, 12, RULE_assignment);
+ enterRule(_localctx, 14, RULE_assignment);
try {
enterOuterAlt(_localctx, 1);
{
- setState(81);
+ setState(88);
switch (_input.LA(1)) {
+ case T__3:
+ case T__4:
+ case T__5:
+ case T__6:
+ case T__7:
+ case T__8:
+ case T__9:
+ case T__10:
+ case T__11:
+ case T__12:
+ case T__13:
+ case T__14:
+ case T__15:
+ case T__16:
+ case T__17:
+ case T__18:
+ case T__19:
+ case T__20:
+ case T__21:
+ case T__22:
+ case T__23:
+ case T__24:
+ case T__25:
+ case T__26:
+ case T__27:
+ case T__28:
+ case T__29:
+ case T__30:
+ case T__31:
+ case T__32:
+ case T__33:
+ case T__34:
+ case T__35:
+ case T__36:
+ case T__37:
+ case T__38:
+ case T__39:
+ case T__40:
+ case T__41:
+ case T__42:
+ case T__43:
+ case T__44:
+ case T__45:
+ case T__46:
+ case T__47:
+ case T__48:
+ case T__49:
+ case T__50:
+ case T__51:
+ case T__52:
+ case T__53:
+ case T__54:
+ case T__55:
+ case T__56:
+ case T__57:
+ case T__58:
+ case T__59:
+ case T__60:
+ case T__61:
+ case T__62:
+ case T__63:
+ case T__64:
+ case T__65:
+ case T__66:
+ case T__67:
+ case T__68:
+ case T__69:
+ case T__70:
+ case T__71:
+ case T__72:
+ case T__73:
+ case T__74:
+ case T__75:
+ case T__76:
+ case T__77:
+ case T__78:
+ case T__79:
+ case T__80:
+ case T__81:
+ case T__82:
+ case T__83:
+ case T__84:
+ case T__85:
+ case T__86:
+ case T__87:
+ case T__88:
+ case T__89:
+ case T__90:
+ case T__91:
+ case T__92:
+ case T__93:
+ {
+ setState(84);
+ opcode();
+ }
+ break;
case IDENTIFIER:
{
- setState(78);
+ setState(85);
variable();
}
break;
case LOC:
{
- setState(79);
+ setState(86);
match(LOC);
}
break;
case RELOC:
{
- setState(80);
+ setState(87);
match(RELOC);
}
break;
default:
throw new NoViableAltException(this);
}
- setState(83);
+ setState(90);
match(T__1);
- setState(84);
+ setState(91);
expression();
}
}
@@ -604,36 +763,36 @@ public class pdp7Parser extends Parser {
public final ExpressionContext expression() throws RecognitionException {
ExpressionContext _localctx = new ExpressionContext(_ctx, getState());
- enterRule(_localctx, 14, RULE_expression);
+ enterRule(_localctx, 16, RULE_expression);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(86);
+ setState(93);
multiplyingExpression();
- setState(91);
+ setState(98);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,9,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,10,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(87);
+ setState(94);
_la = _input.LA(1);
if ( !(_la==PLUS || _la==MINUS) ) {
_errHandler.recoverInline(this);
} else {
consume();
}
- setState(88);
+ setState(95);
multiplyingExpression();
}
}
}
- setState(93);
+ setState(100);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,9,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,10,_ctx);
}
}
}
@@ -679,31 +838,31 @@ public class pdp7Parser extends Parser {
public final MultiplyingExpressionContext multiplyingExpression() throws RecognitionException {
MultiplyingExpressionContext _localctx = new MultiplyingExpressionContext(_ctx, getState());
- enterRule(_localctx, 16, RULE_multiplyingExpression);
+ enterRule(_localctx, 18, RULE_multiplyingExpression);
int _la;
try {
enterOuterAlt(_localctx, 1);
{
- setState(94);
+ setState(101);
atom();
- setState(99);
+ setState(106);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==TIMES || _la==DIV) {
{
{
- setState(95);
+ setState(102);
_la = _input.LA(1);
if ( !(_la==TIMES || _la==DIV) ) {
_errHandler.recoverInline(this);
} else {
consume();
}
- setState(96);
+ setState(103);
atom();
}
}
- setState(101);
+ setState(108);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -732,8 +891,9 @@ public class pdp7Parser extends Parser {
public TerminalNode DECIMAL() { return getToken(pdp7Parser.DECIMAL, 0); }
public TerminalNode DECIMAL_MINUS() { return getToken(pdp7Parser.DECIMAL_MINUS, 0); }
public TerminalNode OCTAL() { return getToken(pdp7Parser.OCTAL, 0); }
- public SignednumberContext signednumber() {
- return getRuleContext(SignednumberContext.class,0);
+ public TerminalNode NUMERIC_LITERAL() { return getToken(pdp7Parser.NUMERIC_LITERAL, 0); }
+ public AtomContext atom() {
+ return getRuleContext(AtomContext.class,0);
}
public AtomContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
@@ -751,65 +911,73 @@ public class pdp7Parser extends Parser {
public final AtomContext atom() throws RecognitionException {
AtomContext _localctx = new AtomContext(_ctx, getState());
- enterRule(_localctx, 18, RULE_atom);
+ enterRule(_localctx, 20, RULE_atom);
try {
- setState(110);
+ setState(119);
switch (_input.LA(1)) {
case IDENTIFIER:
enterOuterAlt(_localctx, 1);
{
- setState(102);
+ setState(109);
variable();
}
break;
case LOC:
enterOuterAlt(_localctx, 2);
{
- setState(103);
+ setState(110);
match(LOC);
}
break;
case RELOC:
enterOuterAlt(_localctx, 3);
{
- setState(104);
+ setState(111);
match(RELOC);
}
break;
case STRING:
enterOuterAlt(_localctx, 4);
{
- setState(105);
+ setState(112);
string();
}
break;
case DECIMAL:
enterOuterAlt(_localctx, 5);
{
- setState(106);
+ setState(113);
match(DECIMAL);
}
break;
case DECIMAL_MINUS:
enterOuterAlt(_localctx, 6);
{
- setState(107);
+ setState(114);
match(DECIMAL_MINUS);
}
break;
case OCTAL:
enterOuterAlt(_localctx, 7);
{
- setState(108);
+ setState(115);
match(OCTAL);
}
break;
- case MINUS:
case NUMERIC_LITERAL:
enterOuterAlt(_localctx, 8);
{
- setState(109);
- signednumber();
+ setState(116);
+ match(NUMERIC_LITERAL);
+ }
+ break;
+ case MINUS:
+ enterOuterAlt(_localctx, 9);
+ {
+ setState(117);
+ match(MINUS);
+ setState(118);
+ atom();
}
break;
default:
@@ -849,35 +1017,35 @@ public class pdp7Parser extends Parser {
public final StringContext string() throws RecognitionException {
StringContext _localctx = new StringContext(_ctx, getState());
- enterRule(_localctx, 20, RULE_string);
+ enterRule(_localctx, 22, RULE_string);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(112);
+ setState(121);
match(STRING);
- setState(116);
+ setState(125);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,12,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,13,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(113);
+ setState(122);
match(NUMERIC_LITERAL);
}
}
}
- setState(118);
+ setState(127);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,12,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,13,_ctx);
}
- setState(120);
+ setState(129);
_la = _input.LA(1);
if (_la==T__2) {
{
- setState(119);
+ setState(128);
match(T__2);
}
}
@@ -895,53 +1063,6 @@ public class pdp7Parser extends Parser {
return _localctx;
}
- public static class SignednumberContext extends ParserRuleContext {
- public TerminalNode NUMERIC_LITERAL() { return getToken(pdp7Parser.NUMERIC_LITERAL, 0); }
- public SignednumberContext(ParserRuleContext parent, int invokingState) {
- super(parent, invokingState);
- }
- @Override public int getRuleIndex() { return RULE_signednumber; }
- @Override
- public void enterRule(ParseTreeListener listener) {
- if ( listener instanceof pdp7Listener ) ((pdp7Listener)listener).enterSignednumber(this);
- }
- @Override
- public void exitRule(ParseTreeListener listener) {
- if ( listener instanceof pdp7Listener ) ((pdp7Listener)listener).exitSignednumber(this);
- }
- }
-
- public final SignednumberContext signednumber() throws RecognitionException {
- SignednumberContext _localctx = new SignednumberContext(_ctx, getState());
- enterRule(_localctx, 22, RULE_signednumber);
- int _la;
- try {
- enterOuterAlt(_localctx, 1);
- {
- setState(123);
- _la = _input.LA(1);
- if (_la==MINUS) {
- {
- setState(122);
- match(MINUS);
- }
- }
-
- setState(125);
- match(NUMERIC_LITERAL);
- }
- }
- catch (RecognitionException re) {
- _localctx.exception = re;
- _errHandler.reportError(this, re);
- _errHandler.recover(this, re);
- }
- finally {
- exitRule();
- }
- return _localctx;
- }
-
public static class EolContext extends ParserRuleContext {
public TerminalNode EOL() { return getToken(pdp7Parser.EOL, 0); }
public EolContext(ParserRuleContext parent, int invokingState) {
@@ -964,7 +1085,7 @@ public class pdp7Parser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(127);
+ setState(131);
match(EOL);
}
}
@@ -1001,7 +1122,7 @@ public class pdp7Parser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(129);
+ setState(133);
match(COMMENT);
}
}
@@ -1038,7 +1159,7 @@ public class pdp7Parser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(131);
+ setState(135);
match(LABEL);
}
}
@@ -1075,7 +1196,7 @@ public class pdp7Parser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(133);
+ setState(137);
match(IDENTIFIER);
}
}
@@ -1112,7 +1233,7 @@ public class pdp7Parser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(135);
+ setState(139);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45) | (1L << T__46) | (1L << T__47) | (1L << T__48) | (1L << T__49) | (1L << T__50) | (1L << T__51) | (1L << T__52) | (1L << T__53) | (1L << T__54) | (1L << T__55) | (1L << T__56) | (1L << T__57) | (1L << T__58) | (1L << T__59) | (1L << T__60) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__64 - 64)) | (1L << (T__65 - 64)) | (1L << (T__66 - 64)) | (1L << (T__67 - 64)) | (1L << (T__68 - 64)) | (1L << (T__69 - 64)) | (1L << (T__70 - 64)) | (1L << (T__71 - 64)) | (1L << (T__72 - 64)) | (1L << (T__73 - 64)) | (1L << (T__74 - 64)) | (1L << (T__75 - 64)) | (1L << (T__76 - 64)) | (1L << (T__77 - 64)) | (1L << (T__78 - 64)) | (1L << (T__79 - 64)) | (1L << (T__80 - 64)) | (1L << (T__81 - 64)) | (1L << (T__82 - 64)) | (1L << (T__83 - 64)) | (1L << (T__84 - 64)) | (1L << (T__85 - 64)) | (1L << (T__86 - 64)) | (1L << (T__87 - 64)) | (1L << (T__88 - 64)) | (1L << (T__89 - 64)) | (1L << (T__90 - 64)) | (1L << (T__91 - 64)) | (1L << (T__92 - 64)) | (1L << (T__93 - 64)))) != 0)) ) {
_errHandler.recoverInline(this);
@@ -1133,41 +1254,43 @@ public class pdp7Parser extends Parser {
}
public static final String _serializedATN =
- "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3p\u008c\4\2\t\2\4"+
+ "\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3p\u0090\4\2\t\2\4"+
"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
- "\3\2\6\2&\n\2\r\2\16\2\'\3\3\5\3+\n\3\3\3\5\3.\n\3\3\3\3\3\3\4\3\4\3\4"+
- "\7\4\65\n\4\f\4\16\48\13\4\3\5\7\5;\n\5\f\5\16\5>\13\5\3\5\3\5\3\5\7\5"+
- "C\n\5\f\5\16\5F\13\5\3\6\3\6\7\6J\n\6\f\6\16\6M\13\6\3\7\3\7\3\b\3\b\3"+
- "\b\5\bT\n\b\3\b\3\b\3\b\3\t\3\t\3\t\7\t\\\n\t\f\t\16\t_\13\t\3\n\3\n\3"+
- "\n\7\nd\n\n\f\n\16\ng\13\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\5\13"+
- "q\n\13\3\f\3\f\7\fu\n\f\f\f\16\fx\13\f\3\f\5\f{\n\f\3\r\5\r~\n\r\3\r\3"+
- "\r\3\16\3\16\3\17\3\17\3\20\3\20\3\21\3\21\3\22\3\22\3\22\2\2\23\2\4\6"+
- "\b\n\f\16\20\22\24\26\30\32\34\36 \"\2\5\3\2cd\3\2ef\3\2\6`\u0091\2%\3"+
- "\2\2\2\4*\3\2\2\2\6\61\3\2\2\2\b<\3\2\2\2\nG\3\2\2\2\fN\3\2\2\2\16S\3"+
- "\2\2\2\20X\3\2\2\2\22`\3\2\2\2\24p\3\2\2\2\26r\3\2\2\2\30}\3\2\2\2\32"+
- "\u0081\3\2\2\2\34\u0083\3\2\2\2\36\u0085\3\2\2\2 \u0087\3\2\2\2\"\u0089"+
- "\3\2\2\2$&\5\4\3\2%$\3\2\2\2&\'\3\2\2\2\'%\3\2\2\2\'(\3\2\2\2(\3\3\2\2"+
- "\2)+\5\6\4\2*)\3\2\2\2*+\3\2\2\2+-\3\2\2\2,.\5\34\17\2-,\3\2\2\2-.\3\2"+
- "\2\2./\3\2\2\2/\60\5\32\16\2\60\5\3\2\2\2\61\66\5\b\5\2\62\63\7\3\2\2"+
- "\63\65\5\b\5\2\64\62\3\2\2\2\658\3\2\2\2\66\64\3\2\2\2\66\67\3\2\2\2\67"+
- "\7\3\2\2\28\66\3\2\2\29;\5\36\20\2:9\3\2\2\2;>\3\2\2\2<:\3\2\2\2<=\3\2"+
- "\2\2=D\3\2\2\2><\3\2\2\2?C\5\n\6\2@C\5\16\b\2AC\5\20\t\2B?\3\2\2\2B@\3"+
- "\2\2\2BA\3\2\2\2CF\3\2\2\2DB\3\2\2\2DE\3\2\2\2E\t\3\2\2\2FD\3\2\2\2GK"+
- "\5\"\22\2HJ\5\f\7\2IH\3\2\2\2JM\3\2\2\2KI\3\2\2\2KL\3\2\2\2L\13\3\2\2"+
- "\2MK\3\2\2\2NO\5\20\t\2O\r\3\2\2\2PT\5 \21\2QT\7a\2\2RT\7b\2\2SP\3\2\2"+
- "\2SQ\3\2\2\2SR\3\2\2\2TU\3\2\2\2UV\7\4\2\2VW\5\20\t\2W\17\3\2\2\2X]\5"+
- "\22\n\2YZ\t\2\2\2Z\\\5\22\n\2[Y\3\2\2\2\\_\3\2\2\2][\3\2\2\2]^\3\2\2\2"+
- "^\21\3\2\2\2_]\3\2\2\2`e\5\24\13\2ab\t\3\2\2bd\5\24\13\2ca\3\2\2\2dg\3"+
- "\2\2\2ec\3\2\2\2ef\3\2\2\2f\23\3\2\2\2ge\3\2\2\2hq\5 \21\2iq\7a\2\2jq"+
- "\7b\2\2kq\5\26\f\2lq\7j\2\2mq\7l\2\2nq\7k\2\2oq\5\30\r\2ph\3\2\2\2pi\3"+
- "\2\2\2pj\3\2\2\2pk\3\2\2\2pl\3\2\2\2pm\3\2\2\2pn\3\2\2\2po\3\2\2\2q\25"+
- "\3\2\2\2rv\7m\2\2su\7i\2\2ts\3\2\2\2ux\3\2\2\2vt\3\2\2\2vw\3\2\2\2wz\3"+
- "\2\2\2xv\3\2\2\2y{\7\5\2\2zy\3\2\2\2z{\3\2\2\2{\27\3\2\2\2|~\7d\2\2}|"+
- "\3\2\2\2}~\3\2\2\2~\177\3\2\2\2\177\u0080\7i\2\2\u0080\31\3\2\2\2\u0081"+
- "\u0082\7o\2\2\u0082\33\3\2\2\2\u0083\u0084\7n\2\2\u0084\35\3\2\2\2\u0085"+
- "\u0086\7g\2\2\u0086\37\3\2\2\2\u0087\u0088\7h\2\2\u0088!\3\2\2\2\u0089"+
- "\u008a\t\4\2\2\u008a#\3\2\2\2\21\'*-\66\13\5\3\6\7\6A\n\6\f\6"+
+ "\16\6D\13\6\3\6\3\6\3\6\7\6I\n\6\f\6\16\6L\13\6\3\7\3\7\7\7P\n\7\f\7\16"+
+ "\7S\13\7\3\b\3\b\3\t\3\t\3\t\3\t\5\t[\n\t\3\t\3\t\3\t\3\n\3\n\3\n\7\n"+
+ "c\n\n\f\n\16\nf\13\n\3\13\3\13\3\13\7\13k\n\13\f\13\16\13n\13\13\3\f\3"+
+ "\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\5\fz\n\f\3\r\3\r\7\r~\n\r\f\r\16\r"+
+ "\u0081\13\r\3\r\5\r\u0084\n\r\3\16\3\16\3\17\3\17\3\20\3\20\3\21\3\21"+
+ "\3\22\3\22\3\22\2\2\23\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"\2\5\3"+
+ "\2cd\3\2ef\3\2\6`\u0097\2%\3\2\2\2\4/\3\2\2\2\6\64\3\2\2\2\b\67\3\2\2"+
+ "\2\nB\3\2\2\2\fM\3\2\2\2\16T\3\2\2\2\20Z\3\2\2\2\22_\3\2\2\2\24g\3\2\2"+
+ "\2\26y\3\2\2\2\30{\3\2\2\2\32\u0085\3\2\2\2\34\u0087\3\2\2\2\36\u0089"+
+ "\3\2\2\2 \u008b\3\2\2\2\"\u008d\3\2\2\2$&\5\6\4\2%$\3\2\2\2&\'\3\2\2\2"+
+ "\'%\3\2\2\2\'(\3\2\2\2(*\3\2\2\2)+\5\4\3\2*)\3\2\2\2*+\3\2\2\2+,\3\2\2"+
+ "\2,-\7\2\2\3-\3\3\2\2\2.\60\5\b\5\2/.\3\2\2\2/\60\3\2\2\2\60\62\3\2\2"+
+ "\2\61\63\5\34\17\2\62\61\3\2\2\2\62\63\3\2\2\2\63\5\3\2\2\2\64\65\5\4"+
+ "\3\2\65\66\5\32\16\2\66\7\3\2\2\2\67<\5\n\6\289\7\3\2\29;\5\n\6\2:8\3"+
+ "\2\2\2;>\3\2\2\2<:\3\2\2\2<=\3\2\2\2=\t\3\2\2\2><\3\2\2\2?A\5\36\20\2"+
+ "@?\3\2\2\2AD\3\2\2\2B@\3\2\2\2BC\3\2\2\2CJ\3\2\2\2DB\3\2\2\2EI\5\f\7\2"+
+ "FI\5\20\t\2GI\5\22\n\2HE\3\2\2\2HF\3\2\2\2HG\3\2\2\2IL\3\2\2\2JH\3\2\2"+
+ "\2JK\3\2\2\2K\13\3\2\2\2LJ\3\2\2\2MQ\5\"\22\2NP\5\16\b\2ON\3\2\2\2PS\3"+
+ "\2\2\2QO\3\2\2\2QR\3\2\2\2R\r\3\2\2\2SQ\3\2\2\2TU\5\22\n\2U\17\3\2\2\2"+
+ "V[\5\"\22\2W[\5 \21\2X[\7a\2\2Y[\7b\2\2ZV\3\2\2\2ZW\3\2\2\2ZX\3\2\2\2"+
+ "ZY\3\2\2\2[\\\3\2\2\2\\]\7\4\2\2]^\5\22\n\2^\21\3\2\2\2_d\5\24\13\2`a"+
+ "\t\2\2\2ac\5\24\13\2b`\3\2\2\2cf\3\2\2\2db\3\2\2\2de\3\2\2\2e\23\3\2\2"+
+ "\2fd\3\2\2\2gl\5\26\f\2hi\t\3\2\2ik\5\26\f\2jh\3\2\2\2kn\3\2\2\2lj\3\2"+
+ "\2\2lm\3\2\2\2m\25\3\2\2\2nl\3\2\2\2oz\5 \21\2pz\7a\2\2qz\7b\2\2rz\5\30"+
+ "\r\2sz\7j\2\2tz\7l\2\2uz\7k\2\2vz\7i\2\2wx\7d\2\2xz\5\26\f\2yo\3\2\2\2"+
+ "yp\3\2\2\2yq\3\2\2\2yr\3\2\2\2ys\3\2\2\2yt\3\2\2\2yu\3\2\2\2yv\3\2\2\2"+
+ "yw\3\2\2\2z\27\3\2\2\2{\177\7m\2\2|~\7i\2\2}|\3\2\2\2~\u0081\3\2\2\2\177"+
+ "}\3\2\2\2\177\u0080\3\2\2\2\u0080\u0083\3\2\2\2\u0081\177\3\2\2\2\u0082"+
+ "\u0084\7\5\2\2\u0083\u0082\3\2\2\2\u0083\u0084\3\2\2\2\u0084\31\3\2\2"+
+ "\2\u0085\u0086\7o\2\2\u0086\33\3\2\2\2\u0087\u0088\7n\2\2\u0088\35\3\2"+
+ "\2\2\u0089\u008a\7g\2\2\u008a\37\3\2\2\2\u008b\u008c\7h\2\2\u008c!\3\2"+
+ "\2\2\u008d\u008e\t\4\2\2\u008e#\3\2\2\2\21\'*/\62;;;012
+m2s = .-m1
+m2:
+ ;;;;;;;;;;040;;040;;;;;;;;;;;;012
+m4s = .-m4
+
+stop:
+ dpof
+ las
+ and o400000
+ sna
+ sys save
+ sys exit
+
+carrier: 0100000
+ilock: 040000
+totime: 300
+disflg: 0
+
+flush: 0
+ lac noc
+ sna
+ jmp flush i
+ law 0104
+ jms message; tbuf
+ law tbuf
+ dac opt
+ dzm noc
+ jmp flush i
+
+gcard: 0
+ lac gcard i
+ isz gcard
+ sna
+ jmp 3f
+ lrss 9
+ sad o45
+ jmp 1f
+ jms putc
+ jmp gcard+1
+1:
+ -1
+ tad gcard i
+ cma
+ dac 2f
+ isz gcard
+1:
+ law 040
+ jms putc
+ isz 2f
+ jmp 1b
+ jmp gcard+1
+2: 0
+3:
+ lac noc
+ sna
+ jmp gcard i
+ sad d80
+ jmp gcard i
+ law 040
+ jms putc
+ jmp 3b
+
+done:
+ jms gcard; <$;<%;6;;;;012
+m1s = .-m1
+m2:
+ ;;;;;;;;;;040;;040;| ;;;;;;;;;;;012
+m4s = .-m4
+
+stop:
+ dpof
+ sys exit
+
+ipt: 0
+eipt: 0
+iipt: rbuf
+fi: 0
+opt: tbuf
+noc: 0
+carrier: 0100000
+ilock: 040000
+totime: 300
+disflg: 0
+
+casetab:
+ 2;2;2;2;2;2;2;2
+ 2;2;2;2;2;2;2;2
+ 2;2;2;2;2;2;2;2
+ 2;2;2;2;2;2;2;2
+ 2;1;2;2;2;0;0;2
+ 2;2;2;2;2;0;2;2
+ 2;2;2;2;2;2;2;2
+ 2;2;2;2;2;2;2;1
+ 0;0;0;0;0;0;0;0
+ 0;0;0;0;0;0;0;0
+ 0;0;0;0;0;0;0;0
+ 0;0;0;0;0;0;2;1
+ 2;1;1;1;1;1;1;1
+ 1;1;1;1;1;1;1;1
+ 1;1;1;1;1;1;1;1
+ 1;1;1;1;1;1;1;1
+
+gcard: 0
+ lac gcard i
+ isz gcard
+ sna
+ jmp gcard i
+ irss 9
+ sad o45
+ jmp 1f
+ jms putc
+ jmp gcard+1
+1:
+ -1
+ tad gcard i
+ cma
+ dac 2f
+ isz gcard
+1:
+ law 040
+ jms putc
+ isz 2f
+ jmp 1b
+ jmp gcard+1
+2: 0
+
+done:
+ lac noc
+ sna
+ jmp 1f
+ sad d72
+ jmp 1f
+ law 040
+ jms putc
+ jmp done
+1:
+ jms gcard; <$;<%;6;;;;040040
+o17: 017
+
+fi: 0
+fo: 0
+count: 0
+oldsum: 0
+newsum: 0
+daccmd: dac
+dactra: dac jmp
+initcmd: dac 0
+c1: 0
+buf:
+
+iot = 0700000
\ No newline at end of file
diff --git a/pdp7parse/src/test/resources/ed1.s b/pdp7parse/src/test/resources/ed1.s
new file mode 100644
index 0000000..63d15ca
--- /dev/null
+++ b/pdp7parse/src/test/resources/ed1.s
@@ -0,0 +1,771 @@
+"** 08-rest.pdf page 8
+"[handwritten page number top right of scan - 1]
+" ed1
+ lac d1
+ sys write; 1f; 3
+ lac o17
+ sys creat; tname
+ spa
+ sys save
+ dac sfo
+ sys open; tname; 0
+ spa
+ sys save
+ dac sfi
+ -1
+ tad lnodp
+ dac zermp
+ tad d1
+ dac zerop
+ dac dot
+ tad d1
+ dac eofp
+ dzm i eofp
+ dzm i zerop
+ dzm lastre
+ dzm fbuf
+ lac d1
+ dac dskadr
+ dac wrlfg
+ dzm diskin
+ "o------------> [scan markup]
+ jmp advanc
+1:
+ ; ; 012
+advanc:
+ jms rline
+ lac linep
+ dac tal
+ dzm adrflg
+ jms addres
+ jmp comand
+ -1
+ dac adrflg
+ lac addr
+ dac addr1
+ dac addr2
+1:
+ lac char
+ sad o54
+ jmp 2f
+ sad o73
+ skp
+ jmp chkwrp
+ lac addr
+ dac dot
+2:
+ jms addres
+ jmp error
+ lac addr2
+ dac addr1
+ lac addr
+ dac addr2
+ jmp 1b
+"** 08-rest.pdf page 9
+"[handwritten page number top right of scan - 2]
+chkwrp:
+ -1
+ tad addr1
+ jms betwen; d1; addr2
+ jmp error
+
+comand:
+ lac char
+ sad o141
+ jmp ca
+ sad o143
+ jmp cc
+ sad o144
+ jmp cd
+ sad o160
+ jmp cp
+ sad o161
+ jmp cq
+ sad o162
+ jmp cr
+ sad o163
+ jmp cs
+ sad o167
+ jmp cw
+ sad o12
+ jmp cnl
+ sad o75
+ jmp ceq
+ jmp error
+ca:
+ jms newline
+ jms setfl
+ lac addr2
+ dac dot
+ca1:
+ jms rline
+ lac line
+ sad o56012
+ jmp advanc
+ jms append
+ jmp ca1
+
+cc: cd:
+ jms newline
+ jms setdd
+ lac addr1
+ sad zerop
+ jmp error
+ dac dot
+ tad dm1
+ dac 9
+ lac addr2
+ dac 8
+2:
+ lac i 8
+ dac i 9
+ sza
+ jmp 2b
+"??? illegible line cut off - dac 0, lac 0, something else???
+"** 08-rest.pdf page 10
+"[handwritten page number top right of scan - 3]
+ dac eofp
+ lac char
+ sad o144
+ jmp advanc
+ -1
+ tad dot
+ dac dot
+ jmp ca1
+
+cp:
+ jms newline
+cp1:
+ jms setdd
+ lac addr1
+ sad zerop
+ jmp error
+1:
+ lac addr1
+ dac dot
+ lac i addr1
+ jms gline
+ dac 2f
+ lac d1
+ sys write; line; 2: 0
+ lac addr1
+ sad addr1
+ jmp advanc
+ tad d1
+ dac addr1
+ jmp 1b
+
+cq:
+ jms newline
+ lac adrflg
+ sza
+ jmp error
+ sys exit
+
+cr:
+ jms setfl
+ lac addr2
+ dac dot
+ jms rname
+ "------------> [scan markup]
+ sys open; fbuf; 0
+ spa
+ jmp error
+ dac tfi
+ lac linep
+ dac tal
+ dzm num
+1:
+ lac tfi
+ sys read; tbuf; 64
+ sza
+ jmp 2f
+ lac tfi
+ sys close
+ jms number
+ jmp advanc
+2:
+"??? illegible line cut off - cma, sma, something else?
+"** 08-rest.pdf page 11
+"[handwritten page number top right of scan - 4]
+ tad d1
+ rcl
+ dac c1
+ lac tbufp
+ dac tal1
+2:
+ jms getsc; tal1
+ sna
+ jmp 3f
+ jms putsc; tal
+ isz num
+ sad o12
+ skp
+ jmp 3f
+ lac tal
+ add o400000
+ and o17777
+ cma
+ tad linep
+ cma
+ dac linsiz
+ jms append
+ lac linep
+ dac tal
+3:
+ isz c1
+ jmp 2b
+ jmp 1b
+cw:
+ jms setfl
+ lac i addr1
+ sna
+ jmp error
+ jms rname
+ lac o17
+ sys creat; fbuf
+ spa
+ jmp error
+ dac tfi
+ -128
+ dac c2
+ lac tbufp
+ dac tal1
+ dzm num
+1:
+ lac i addr1
+ jms gline
+ rcl
+ cma
+ tad d1
+ dac c1
+ lac linep
+ dac tal
+2:
+ jms getsc; tal
+ sna
+ jmp 3f
+ isz num
+ jmp putsc; tal1
+ isz c2 "???
+"** 08-rest.pdf page 12
+"[handwritten page number top right of scan - 5]
+ jmp 3f
+ lac tfi
+ sys write; tbuf; 64
+ -128
+ dac c2
+ lac tbufp
+ dac tal1
+3:
+ isz c1
+ jmp 2b
+ lac addr1
+ sad addr2
+ jmp 1f
+ isz addr1
+ jmp 1b
+1:
+ lac tal1
+ sma cla
+ jmp 1f
+ jms putsc; tal1
+1:
+ -1
+ tad tufp
+ cma
+ tad tal1
+ dac 1f
+ lac tfi
+ sys write; tbuf; 1: 0
+ lac tfi
+ sys close
+ jms number
+ jmp advanc
+
+cn1:
+ lac adrflg
+ sna
+ jmp 1f
+ lac addr2
+ dac addr1
+ jmp cp1
+1:
+ lac dot
+ tad d1
+ sad eofp
+ jmp error
+ dac dot
+ jmp cp1
+
+ceq:
+ jms newline
+ jms setfl
+ lac addr2
+ dac dot
+ cma
+ tad zerop
+ cma
+ dac num
+ jms number
+ jmp advanc
+
+setdd: 0
+"** 08-rest.pdf page 13
+"[handwritten page number top right of scan - 6]
+ lac adrflg
+ sza
+ jmp i setdd
+ lac dot
+ dac addr1
+ dac addr2
+ jmp i setdd
+
+setfl: 0
+ lac adrflg
+ sza
+ jmp i setfl
+ lac zerop
+ tad d1
+ dac addr1
+ -1
+ tad eofp
+ dac addr2
+ jmp i setfl
+
+newline: 0
+ jms getsc; tal
+ sad o12
+ jmp i newline
+ jmp error
+
+addres: 0
+ dzm minflg "..) [stray scan mark?]
+ -1
+ dac addr
+ad1:
+ jms getsc; tal
+ad2:
+ jms betwen; d47; d56
+ skp
+ jmp numb
+ sad o40 "[o40 circled in scan]
+ jmp ad1 "[hand drawn check mark follows operand in scan]
+ sad o11
+ jmp ad1 "[hand drawn check mark follows operand in scan]
+ "[check mark underlined in scan]
+ sad o55
+ jmp amin "[hand drawn check mark follows operand in scan]
+ sad o56
+ jmp adot "[hand drawn check mark follows operand in scan]
+ sad o53
+ jmp ad1 "[hand drawn check mark follows operand in scan]
+ sad o44
+ jmp adol "[hand drawn check mark follows operand in scan]
+ sad o57
+ jmp fsrch "[hand drawn check mark follows operand in scan]
+ sad o77
+ jmp bsrch "[hand drawn check mark follows operand in scan]
+ dac char
+ lac minflg
+ sza
+ jmp error
+ lac addr
+ sma
+ isz addres
+ jmp i addres
+"** 08-rest.pdf page 14
+"[handwritten page number top right of scan - 7]
+adot:
+ lac minflg
+ sza
+ jmp error
+ lac addr
+ sma
+ jmp error
+ lac dot
+ dac addr
+ jmp ad1
+
+adol:
+ lac minflg
+ sza
+ jmp error
+ lac addr
+ sma
+ jmp error
+ -1
+ tad eofp
+ dac addr
+ jmp ad1
+
+amin:
+ -1
+ dac minflg
+ jmp ad1
+
+numb:
+ dac char
+ sad o60
+ jmp 1f
+ lac d10
+ jmp 2f
+1:
+ lac d8
+2:
+ dac 2f
+ dzm num
+1:
+ lac num
+ cll; mul; 2: 0
+ lacq
+ tad char
+ tad dm48
+ dac num
+ jms getsc; tal
+ dac char
+ jms betwen; d47; d58
+ skp
+ jmp 1b
+ lac minflg
+ sna
+ jmp 1f
+ -1
+ tad num
+ cma
+ dac num
+ dzm minflg
+1:
+ lac addr
+"** 08-rest.pdf page 15
+"[handwritten page number top right of scan - 8]
+ spa
+ lac zerop
+ tad num
+ dac addr
+ jms betwen; zermp; eofp
+ jmp error
+ lac char
+ jmp ad2
+
+number: 0
+ lac d100000
+ dac n1
+ law tbuf-1
+ dac 8
+n0:
+ lac num
+ cll; idiv; n1: 0
+ dac num
+ lacq
+ tad d48
+ dac i 8
+ lac n1
+ cll; idiv; 10
+ lacq
+ dac n1
+ sza
+ jmp n0
+ lac o12
+ dac i 8
+ law tbuf-1
+ dac 8
+ dac 9
+ -5
+ dac n1
+n2:
+ lac i 8
+ sad d48
+ skp
+ jmp n3
+ dzm i 9
+ isz n1
+ jmp n2
+n3:
+ lac d1
+ sys write; tbuf; 7
+ jmp i number
+
+rname: 0
+ lac fbufp
+ dac tal1
+ -8
+ dac c1
+1:
+ jms getsc; tal
+ sad o40
+ jmp 1b
+ sad o12
+ jmp 1f
+ jms putsc; tal1
+ isz c1
+ jmp 1b
+"** 08-rest.pdf page 16
+"[handwritten page number top right of scan - 9]
+ jmp i rname
+1:
+ lac tal1
+ sad fbufp
+ skp
+ jmp 1f
+ lac fbuf
+ sna
+ jmp error
+ jmp i rname
+1:
+ lac o40
+ jms putsc; tal1
+ isz c1
+ jmp 1b
+ jmp i rname
+
+gline: 0
+ dac glint1
+ jms getdsk
+ lac glint1 " [these 6 lines were surrounded by a box
+ adn o17777 " that was Xed out with an arrow pointing to it]:
+ tad dskbfp " --
+ dac ital "|\/|
+ lac linep "|/\|<---
+ dac otal " --
+1:
+ lac ital
+ sad edskbfp
+ skp
+ jmp 2f
+ lac diskin
+ tad d1024
+ jms getdsk
+ lac dskbfp
+ dac ital
+2:
+ jms getsc; ital
+ jms putsc; otal
+ sad o12
+ skp
+ jmp 1b
+ lac otal
+ sma
+ jmp 1f
+ cla
+ jms putsc; otal
+1:
+ lac linpm1
+ cma
+ tad otal
+ jmp i gline
+
+rline: 0
+ lac linep
+ dac tal
+
+1:
+ cla
+ sys read; char; 1
+ lac char
+"** 08-rest.pdf page 17
+"[handwritten page number top right of scan - 10]
+ lrss 9
+ jms esc
+ lac char
+ and o777
+ jms esc
+ jmp 1b
+
+esc: 0
+ sna
+ jmp i esc
+ jms putsc; tal
+ sad o12
+ jmp 2f
+ sad o100
+ jmp 1f
+ sad o43
+ skp
+ jmp i esc
+ -1
+ tad tal
+ dac tal
+ and o17777
+ sad linpm1
+ jmp 1f
+ jmp i esc
+
+1:
+ lac linep
+ dac tal
+ jmp i esc
+
+2:
+ lac tal
+ sma cla
+ jmp 1f
+ jms putsc; tal
+1:
+ -1
+ tad linep
+ cma
+ tad tal
+ dac linsiz
+ jmp i rline
+
+getsc: 0
+ lac i getsc
+ dac sctalp
+ isz getsc
+ lac i sctalp
+ dac sctal
+ add o400000
+ dac i sctal
+ ral
+ lac i sctal
+ szl
+ lrss 9
+ and o777
+ jmp i getsc
+
+putsc: 0
+ and o777
+"** 08-rest.pdf page 18
+"[handwritten page number top right of scan - 11]
+ lmq
+ lac i putsc
+ dac sctalp
+ isz putsc
+ lac i sctalp
+ dac sctal
+ add o400000
+ dac i sctalp
+ sma cla
+ jmp 1f
+ llss 27
+ dac i sctal
+ lrss 9
+ jmp i putsc
+
+1:
+ lac i sctal
+ and o777000
+ omq
+ dac i sctal
+ lacq
+ jmp i putsc
+
+append: 0
+ -1
+ tad eofp
+ dac 8
+ cma
+ tad dot
+ dac apt1
+1:
+ lac i 8
+ dac i 8
+ -3
+ tad 8
+ dac 8
+ isz apt1
+ jmp 1b
+ isz eofp
+ dzm i eofp
+ isz dot
+ jms addline
+ jmp i append
+
+addline: 0
+ lac dskadr
+ dac i dot
+ jms getdsk "[line crossed out - scan markup]
+ -1
+ tad linsiz
+ cma
+ dac apt1
+ law line-1
+ dac 8
+ lac dskadr "[line crossed out - scan markup]
+ and o1777 "[line crossed out - scan markup]
+ tad dskbfp "[line crossed out - scan markup]
+ dac otal "[line crossed out - scan markup]
+ lac dskadr "[line crossed out - scan markup]
+ tad linsiz "[line crossed out - scan markup]
+ dac dskadr "[line crossed out - scan markup]
+"** 08-rest.pdf page 19
+"[handwritten page number top right of scan - 12]
+1:
+ lac otal " [these 9 lines were surrounded by a box
+ sad edskbfp " that was Xed out]:
+ skp " --
+ jmp 2f "|\/|
+ lac diskin "|/\|
+ tad d1024 " --
+ jms getdsk "
+ lac dskbfp "
+ dac otal "
+2: "[line crossed out - scan markup]
+ lac i 8
+ dac i otal "[line crossed out and a note that looks like *jms prtwrd*]
+ isz otal
+ dzm wrflg "[line crossed out - scan markup]
+ isz apt1
+ jmp 1b
+ jmp i addline
+
+
+getdsk: 0 "[the entire getdsk procedure was surrounded
+ and o776000 " by a box that was Xed out]:
+ sad diskin " --
+ jmp i getdsk "|\/|
+ dac 2f "|/\|
+ lac wrflg " --
+ sza "
+ jmp 3f "
+ lac diskin "
+ dac 1f "
+ lac sfo "
+ sys seek; 1: 0; 0 "
+ lac sfo "
+ sys write; dskbuf; 1024 "
+ lac d1 "
+ dac wrflg "
+3: "
+ lac 2f "
+ dac diskin "
+ lac sfi "
+ sys seek; 2: 0; 0 "
+ spa "
+ jmp i getdsk "
+ lac sfi "
+ sys read; dskbuf; 1024 "
+ jmp i getdsk "
+
+betwen: 0
+ dac bett1
+ lac i betwen
+ dac bett2
+ isz betwen
+ lac i bett2
+ cma
+ tad bett1
+ spa
+ jmp 1f
+ lac i betwen
+ dac bett2
+ isz betwen
+ -1
+ tad i bett2
+"** 08-rest.pdf page 20
+"[handwritten page number top right of scan - 13]
+ cma
+ tad bett1
+ spa
+1:
+ isz betwen
+ lac bett1
+ jmp i betwen
+
+error:
+ lac d1
+ sys write; 1f; 1
+ jmp advanc
+1:
+ 077012
\ No newline at end of file
diff --git a/pdp7parse/src/test/resources/init.s b/pdp7parse/src/test/resources/init.s
new file mode 100644
index 0000000..69284d4
--- /dev/null
+++ b/pdp7parse/src/test/resources/init.s
@@ -0,0 +1,291 @@
+" init
+
+ -1
+ sys intrp
+ jms init1
+ jms init2
+1:
+ sys rmes
+ sad pid1
+ jmp 1f
+ sad pid2
+ jms init2
+ jmp 1
+1:
+ jms init1
+ jmp 1
+
+init1: 0
+ sys fork
+ jmp 1f
+ sys open; ttyin; 0
+ sys open; ttyout; 1
+ jmp login
+1:
+ dac pid1
+ jmp init1 i
+
+init2: 0
+ sys fork
+ jmp 1f
+ sys open; keybd; 0
+ sys open; displ; 1
+ jmp login
+1:
+ dac pid2
+ jmp init2 i
+
+login:
+ -1
+ sys intrp
+ sys open; password; 0
+ lac d1
+ sys write; m1; m1s
+ jms rline
+ lac ebufp
+ dac tal
+1:
+ jms gline
+ law ibuf-1
+ dac 8
+ law obuf-1
+ dac 9
+2:
+ lac 8 i
+ sac o12
+ lac o72
+ sad 9 i
+ skp
+ jmp 1b
+ sad o72
+ skp
+ jmp 2b
+ lac 9 i
+ sad o72
+ jmp 1f
+ -1
+ tad 9
+ dac 9
+ lac d1
+ sys write; m3; m3s
+ jms rline
+ law ibuf-1
+ dac 8
+2:
+ lac 8 i
+ sad o12
+ lac o72
+ sad 9 i
+ skp
+ jmp error
+ sad o72
+ skp
+ jmp 2b
+1:
+ dzm nchar
+ law dir-1
+ dac 8
+1:
+ lac 9 i
+ sad o72
+ jmp 1f
+ dac char
+ lac nchar
+ sza
+ jmp 2f
+ lac char
+ alss 9
+ xor o40
+ dac 8 i
+ dac nchar
+ jmp 1b
+2:
+ lac 8
+ dac nchar
+ lac nchar i
+ and o777000
+ xor char
+ dac nchar i
+ dzm nchar
+ jmp 1b
+1:
+ dzm nchar
+1:
+ lac 9 i
+ sad o12
+ jmp 2f
+ tad om60
+ lmq
+ lac nchar
+ cll; als 3
+ omq
+ dac nchar
+ jmp 1b
+2:
+ lac nchar
+ sys setuid
+ sys chdir; dd
+ sys chdir; dir
+
+ lac d2
+ sys close
+ sys open; sh; 0
+ sma
+ jmp 1f
+ sys link; system; sh; sh
+ spa
+ jmp error
+ sys open; sh; 0
+ spa
+ jmp error
+ sys unlink; sh
+1:
+ law 017700
+ dac 9
+ law boot-1
+ dac 8
+1:
+ lac 8 i
+ dac 9 i
+ sza
+ jmp 1b
+ jmp 017701
+
+boot:
+ lac d2
+ lmq
+ sys read; 4096; 07700
+ lacq
+ sys close
+ jmp 4096
+ 0
+
+rline: 0
+ law ibuf-1
+ dac 8
+1:
+ cla
+ sys read; char; 1
+ lac char
+ lrss 9
+ sad o100
+ jmp rline+1
+ sad o43
+ jmp 2f
+ dac 8 i
+ sad o12
+ jmp rline i
+ jmp 1b
+2:
+ law ibuf-1
+ sad 8
+ jmp 1b
+ -1
+ tad 8
+ dac 8
+ jmp 1b
+
+gline: 0
+ law obuf-1
+ dac 8
+1:
+ jms gchar
+ dac 8 i
+ sad o12
+ jmp gline i
+ jmp 1b
+
+gchar: 0
+ lac tal
+ sad ebufp
+ jmp 1f
+ ral
+ lac tal i
+ snl
+ lrss 9
+ and o777
+ lmq
+ lac tal
+ add o400000
+ dac tal
+ lacq
+ sna
+ jmp gchar+1
+ jmp gchar i
+1:
+ lac bufp
+ dac tal
+1:
+ dzm tal i
+ isz tal
+ lac tal
+ sad ebufp
+ skp
+ jmp 1b
+ lac bufp
+ dac tal
+ lac d2
+ sys tead; buf; 64
+ sna
+ jmp error
+ jmp gchar+1
+
+error:
+ lac d1
+ sys write; m2; m2s
+ lac d1
+ sys smes
+ sys exit
+
+m1:
+ 012; ;;;;;;<: 040
+m3s = .-m3
+dd:
+ ;040040;040040;040040
+dir:
+ 040040;040040;040040;040040
+
+ttyin:
+ ;;;;; 040040
+keybd:
+ ;;;
+displ:
+ ;;;; 040040;040040;040040
+system:
+ ;;; 040040
+password:
+ ;;;
+
+d1: 1
+o43: 043
+o100: 0100
+o400000; 0400000
+d2: 2
+o12: 012
+om60: -060
+d3: 3
+ebufp: buf+64
+bufp: buf
+o777: 0777
+o777000: 0777000
+o40: 040
+o72: 072
+
+ibuf: .=.+100
+obuf: .=.+100
+tal: .=.+1
+buf: .=.+64
+char: .=.+1
+nchar: .=.+1
+pid1: .=.+1
+pid2: .=.+1
diff --git a/pdp7parse/src/test/resources/s1.s b/pdp7parse/src/test/resources/s1.s
new file mode 100644
index 0000000..8dcf364
--- /dev/null
+++ b/pdp7parse/src/test/resources/s1.s
@@ -0,0 +1,195 @@
+" S1
+
+.. = 0
+t = 0
+orig:
+ hlt
+ jmp pibreak
+
+. = orig+7
+ -1
+
+. = orig+020
+ 1f
+ iof
+ dac u.ac
+ lac 020
+ dac 1f
+ lac 1f-1
+ dac 020
+ lac u.ac
+ jmp 1f+1
+ 1f
+1: 0
+ iof " interrupts off
+ dac u.ac " save user AC
+ lacq
+ dac u.mq " save user MQ
+ lac 8
+ dac u.rq " save user auto-index location 8
+ lac 9
+ dac u.rq+1 " save user auto-index location 9
+ jms copy; 10; u.rq+2; 6 " save user auto-index locations 10-15
+ lac 1b " load user PC after system call
+ dac u.rq+8 " save user PC
+ -1 " load -1
+ dac .savblk " set "save" flag (cleared by disk I/O?)
+ dac .insys " set "in system" flag
+ lac uquant " load user quantum count
+ jms betwen; d0; maxquant " check if between 0 & maxquant??
+ jms swap " no: swap processes
+ ion " interrupts on
+ -1
+ tad u.rq+8 " get address of system call
+ jms laci " load AC indirect??
+ jms betwen; o20001; swn " range check
+ jmp badcal " bad system call
+ tad swp " add system call table base
+ dac .+1 " save as next instruction
+ jmp .. i " dispatch system call
+
+. = orig+0100
+ jmp coldentry
+ jms halt
+
+okexit:
+ dzm u.ac " 'OK' system call exit: clear user AC
+sysexit: " common system call exit code
+ ion " enable interrupts
+ lac .savblk " load "save" flag
+ sza " is zero (cleared by disk I/O)?
+ jmp 1f " no: no disk I/O done?
+ jms copy; sysdata; dskbuf; 64 " copy system data to disk buffer
+ cla
+ jms dskio; 07000 " save to disk?
+1:
+ dzm .insys " clear "in system call" flag
+ jms chkint
+ skp
+ jmp .save " dump core??
+ jms copy; u.rq+2; 10; 6 " restore auto-index locations 10-15
+ lac u.rq+1 " restore auto-index location 9
+ dac 9
+ lac u.rq " restore auto-index location 8
+ dac 8
+ lac u.mq " restore MQ register
+ lmq
+ lac u.ac " restore AC register
+ jmp u.rq+8 i " return to user
+
+swap: 0
+ ion
+1:
+ jms lookfor; 3 " out/ready
+ jmp 1f
+ jms lookfor; 1 " in/ready
+ skp
+ jmp 1b
+ dzm maxquant
+ jmp 3f
+1:
+ dac 9f+t
+ jms lookfor; 2 " in/notready
+ jmp 1f
+ jms lookfor; 1 " in/ready
+ jmp 1f
+ jmp 2f
+1:
+ lac swap
+ dac u.swapret
+ iof
+ lac o200000
+ tad u.ulistp i
+ dac u.ulistp i
+ ion
+ jms dskswap; 07000
+ lac u.dspbuf
+ sna
+ jmp 2f
+ law dspbuf
+ jms movdsp
+2:
+ iof
+ lac o600000
+ tad 9f+t i
+ dac 9f+t i
+ ion
+ jms dskswap; 06000
+ lac u.swapret
+ dac swap
+ lac o20
+ dac maxquant
+ lac u.dspbuf
+ sza
+"** 01-s1.pdf page 4
+ jms movdsp
+3:
+ dzm uquant
+ iof
+ jmp swap i
+t = t+1
+
+swp: " system call dispatch table
+ jmp . " base instruction
+ .save; .getuid; .open; .read; .write; .creat; .seek; .tell
+ .close; .link; .unlink; .setuid; .rename; .exit; .time; .intrp
+ .chdir; .chmod; .chown; badcal; .sysloc; badcal; .capt; .rele
+ .status; badcal; .smes; .rmes; .fork
+swn:
+ .-swp-1 i " count of system calls, plus indirect!
+
+.intrp:
+ lac u.ac
+ dac u.intflg
+ jmp okexit
+
+.sysloc: " "sysloc": syscall to return system addresses
+ lac u.ac
+ and o17777
+ jms betwen; d1; locn
+ jms error
+ tad locsw
+ dac .+1
+ lac ..
+ dac u.ac
+ jmp sysexit
+
+locsw: " table of system data structures for "sysloc" call
+ lac .
+ iget; inode; userdata; sysdata; copy; copyz; betwen; dskrd
+ dskwr; dskbuf; dpdata; namei; pbsflgs; alloc; free; dspdata
+ crdata
+locn:
+ .-locsw-1
+
+chkint: 0
+ lac .insys
+ sza
+ jmp chkint i
+ lac .int1
+ sna
+ jmp 1f
+ sad u.ofiles+2
+ jmp 2f
+1:
+ lac .int2
+ sna
+ jmp chkint i
+ sad u.ofiles+2
+ skp
+ jmp chkint i
+ dzm .int2
+ jmp 1f
+2:
+ dzm .int1
+1:
+"** 01-s1.pdf page 5
+ lac u.intflg
+ sza
+ jmp chkint i
+ -1
+ dac .insys
+ ion
+ isz chkint
+ jmp chkint i
+
diff --git a/pdp7parse/src/test/resources/s2.s b/pdp7parse/src/test/resources/s2.s
new file mode 100644
index 0000000..3424c44
--- /dev/null
+++ b/pdp7parse/src/test/resources/s2.s
@@ -0,0 +1,337 @@
+"** 01-s1.pdf page 7
+" s2
+
+.status:
+ jms arg
+ dac .+5
+ jms arg
+ dac .+6
+ lac u.cdir
+ jms namei; ..
+ jms error
+ jms namei; ..
+ jms error
+ jms iget
+ lac u.ac
+ and o17777
+ jms betwen; o10000; o17762
+ jms error
+ dac .+3
+ jms copy; inode; ..; 12
+ lac d.i
+ dac 9 i
+ jmp okexit
+
+.capt:
+ lac u.ac
+ dac u.dspbuf
+ jms movdsp
+ jmp sysexit
+
+.rele:
+ dzm u.dspbuf
+ law dspbuf
+ jms movdsp
+ jmp sysexit
+
+.chmod:
+ jms isown
+ lac u.ac
+ and o17
+ lmq
+ lac i.flags
+ and o777760
+ omq
+ dac i.flags
+ jms iput
+ jmp okexit
+
+.chown:
+ jms isown
+ lac u.ac
+ dac i.uid
+ jms iput
+ jmp okexit
+
+.getuid: " getuid system call
+ lac u.uid
+ dac u.ac " return u.uid in user AC
+ jmp sysexit
+
+.seek:
+ jms seektell
+ tad u.base
+"** 01-s1.pdf page 8
+ spa
+ jms error
+ lmq
+ lac f.flags
+ and d1
+ sna
+ jms 1f
+ lacq
+ jms betwen; d0; i.size
+ jms dacisize
+ jmp 2f
+1:
+ lacq
+ jms betwen; d0; i.size
+ lac i.size
+2:
+ dac f.badd
+ dac u.ac
+ jms fput
+ jmp sysexit
+
+.tell:
+ jms seektell
+ cma
+ tad d1
+ tad u.base
+ dac u.ac
+ jmp sysexit
+
+.link:
+ jms arg
+ dac 0f
+ jms arg
+ dac 1f
+ jms arg
+ dac 2f
+ lac d4
+ jms namei; 0:0
+ jms error
+ jms namei; 1:0
+ jms error
+ dac u.base
+ jms copy; 2:0; name; 4
+ lac u.cdir
+ jms namei; name
+ skp
+ jms error
+ lac d1
+ dac mode
+ jms access
+ jms dslot
+ lac u.base
+ jms iget
+ lac ii
+ dzm d.i
+ jms copy; name; d.name; 4
+ lac i.uniq
+ dac d.uniq
+ -1
+ tad i.nlks
+ dac i.nlks
+"** 01-s1.pdf page 9
+ jms iput
+ jms dput
+ jmp okexit
+
+.unlink:
+ jms argname
+ dac u.base
+ lac d1
+ dac mode
+ jms access
+ dac d.i
+ jms dput
+ lac u.base
+ jms iget
+ isz i.nlks
+ jmp 1f
+ jms itrunc
+ dzm i.flags
+1:
+ jms iput
+ jmp sysexit
+
+.setuid: " setuid system call
+ lac u.uid " load current user id
+ sma " negative?
+ jms error " no: error!!
+ lac u.ac " load user AC
+ dac u.uid " save as new uid
+ jmp sysexit
+
+.rename:
+ jms arg
+ dac 0f
+ jms arg
+ dac 1f
+ lac u.cdir
+ jms namei; 0:0
+ jms error
+ lac d1
+ dac mode
+ jms access
+ jms copy; 1:0; d.name; 4
+ jmp okexit
+
+ " time system call returns line (mains) frequency ticks since boot?
+ " note: returns uptime!?
+ " at 60Hz, 36 bits would last 36+ years!
+.time:
+ lac s.tim " load high order bits
+ dac u.ac " return in AC
+ lac s.tim+1 " load low order bits
+ dac u.mq " return in MQ
+ jmp sysexit
+
+.chdir:
+ jms argname
+ jms iget
+ lac i.flags
+ and o20
+ sna
+ jms error
+ lac ii
+ dac u.cdir
+"** 01-s1.pdf page 10
+ jmp okexit
+
+.open:
+ jms arg
+ dac 0f
+ jms arg
+ sza
+ lac d1
+ sna
+ lac d2
+ dac mode
+ lac u.cdir
+ jms namei; 0:0
+ jms error
+ jms iget
+ jms access
+ lac i.flags
+ and o20
+ sna
+ jmp open1
+ lac mode
+ and d1
+ sna
+ jmp open1
+ lac u.uid
+ sma
+ jms error
+ jmp open1
+
+.creat:
+ lac d1
+ dac mode
+ jms arg
+ dac .+2
+ jms copy; ..; name; 4
+ lac u.cdir
+ jms namei; name
+ jmp 1f
+ jms iget
+ jms access
+ lac i.flags
+ and o20
+ sna
+ jmp .+4
+ lac u.uid
+ sma
+ jms error
+ jms itrunc
+ cla
+ jms dacisize
+ jmp open1
+1:
+ jms access
+ lac u.ac
+ and o17
+ jms icreat
+open1:
+ jms fassign
+ jms error
+ jmp sysexit
+
+"** 01-s1.pdf page 11
+.close:
+ jms finac
+ dzm f.flags
+ jms fput
+ jmp sysexit
+
+.read:
+ jms arg
+ and o17777
+ dac u.base
+ jms arg
+ dac u.count
+ lac u.base
+ jms betwen; o10000; o17777
+ jms error
+ tad u.count
+ jms betwen; u.base; o17777
+ jms error
+ dac u.limit
+1:
+ jms finac
+ lac f.flags
+ and d1
+ sza
+ jms error
+ lac i.flags
+ and o40
+ sna
+ jmp 1f
+ iof
+ lac ii
+ tad swr
+ dac .+1
+ jmp .. i
+1:
+ lac u.base
+ dac 1f+1
+ lac u.count
+ dac 1f+2
+ lac f.badd
+1:
+ jms iread; ..; ..
+ jmp exitrw
+
+.write:
+ jms arg
+ and o17777
+ dac u.base
+ jms arg
+ dac u.count
+ tad u.base
+ jms betwen; u.base; o17777
+ jms error
+ dac u.limit
+ jms finac
+ lac f.flags
+ and d1
+ sna
+ jms error
+ lac i.flags
+ and o40
+"** 01-s1.pdf page 12
+ sna
+ jmp 1f
+ iof
+ lac ii
+ tad sww
+ dac .+1
+ jmp .. i
+1:
+ lac u.base
+ dac 1f+1
+ lac u.count
+ dac 1f+2
+ lac f.badd
+1:
+ jms iwrite; ..; ..
+
+exitrw:
+ dac u.ac
+ tad f.badd
+ dac f.badd
+ jms iput
+ jms fput
+ jmp sysexit
diff --git a/pdp7parse/src/test/resources/s3.s b/pdp7parse/src/test/resources/s3.s
new file mode 100644
index 0000000..c0ca18d
--- /dev/null
+++ b/pdp7parse/src/test/resources/s3.s
@@ -0,0 +1,354 @@
+"** 01-s1.pdf page 14
+" s3
+
+searchu: 0
+ lac searchu i
+ dac 9f+t+1
+ -mnproc
+ dac 9f+t
+ law ulist-1
+ dac 8
+1:
+ lac 8 i
+ dac lu
+ lac 8 i
+ dac lu+1
+ lac 8 i
+ dac lu+2
+ lac 8 i
+ dac lu+3
+ jms 9f+t+1 i
+ isz 9f+t
+ jmp 1b
+ isz searchu
+ jmp searchu i
+t = t+2
+
+lookfor: 0
+ jms searchu; 1f
+ isz lookfor
+ isz lookfor
+ jmp lookfor i
+1: 0
+ lac lu
+ rtl; rtl; and o7
+ sad lookfor i
+ skp
+ jmp 1b i
+ -3
+ tad 8
+ and o17777
+ isz lookfor
+ jmp lookfor i
+
+.fork:
+ jms lookfor; 0 " not-used
+ skp
+ jms error
+ dac 9f+t
+ isz uniqpid
+ lac uniqpid
+ dac u.ac
+ law sysexit
+ dac u.swapret
+ lac o200000
+ tad u.ulistp i
+ dac u.ulistp i
+ jms dskswap; 07000
+ lac 9f+t
+ dac u.ulistp
+ lac o100000
+ xor u.ulistp i
+ dac u.ulistp i
+ lac u.pid
+"** 01-s1.pdf page 15
+ dac u.ac
+ lac uniqpid
+ dac u.pid
+ isz 9f+t
+ dac 9f+t i
+ isz u.rq+8
+ dzm u.intflg
+ jmp sysexit
+t= t+1
+
+badcal:
+ clon
+ -1
+ dac 7
+.save:
+ lac d1
+ jms iget
+ cla
+ jms iwrite; 4096; 4096
+ jms iwrite; userdata; 64
+ jms iput
+
+.exit:
+ lac u.dspbuf
+ sna
+ jmp .+3
+ law dspbuf
+ jms movdsp
+ jms awake
+ lac u.ulistp i
+ and o77777
+ dac u.ulistp i
+ isz u.ulistp
+ dzm u.ulistp i
+ jms swap
+
+.rmes:
+ jms awake
+ lac o100000
+ tad u.ulistp i
+ dac u.ulistp i
+ law 2
+ tad u.ulistp
+ dac 9f+t
+ -1
+ dac 9f+t i
+ jms swap
+ law 2
+ tad u.ulistp
+ dac 9f+t
+ lac 9f+t i
+ cma
+ dac u.ac
+ dzm 9f+t i
+ isz 9f+t
+ lac 9f+t i
+ dac u.mq
+ dzm 9f+t i
+ jmp sysexit
+t = t+1
+
+"** 01-s1.pdf page 16
+.smes:
+ lac u.ac
+ sna spa
+ jms error
+ jms searchu; 1f
+ law 2
+ tad u.ulistp
+ dac 9f+t
+ dzm 9f+t i
+ jms error
+1: 0
+ lac lu+1
+ sad u.ac
+ skp
+ jmp 1b i
+ lac lu+2
+ sad dm1
+ jmp 1f
+ lac o100000
+ tad u.ulistp i
+ dac u.ulistp i
+ law 2
+ tad u.ulistp
+ dac 9f+t
+ lac u.ac
+ dac 9f+t i
+ jms swap
+ law 2
+ tad u.ulistp
+ dac 9f+t
+ dzm 9f+t i
+ jmp .smes
+1:
+ -3
+ tad 8
+ dac 9f+t
+ lac o700000
+ tad 9f+t i
+ dac 9f+t i
+ isz 9f+t
+ isz 9f+t
+ lac u.pid
+ cma
+ dac 9f+t i
+ isz 9f+t
+ lac u.mq
+ dac 9f+t i
+ jmp okexit
+t = t+1
+
+awake: 0
+ jms searchu; 1f
+ jmp awake i
+1: 0
+ lac u.pid
+ sad lu+2
+ skp
+ jmp 1b i
+ -3
+ tad 8
+ dac 9f+t
+"** 01-s1.pdf page 17
+ lac o700000
+ tad 9f+t i
+ dac 9f+t i
+ jmp 1b i
+t = t+1
+
+swr:
+sww:
+ jmp .-4 i
+ .halt; rttyi; rkbdi; rppti; .halt
+ .halt; wttyo; wdspo; wppto
+
+.halt: jms halt
+
+rttyi:
+ jms chkint1
+ lac d1
+ jms getchar
+ jmp 1f
+ and o177
+ jms betwen; o101; o132
+ skp
+ tad o40
+ alss 9
+ jmp passone
+1:
+ jms sleep; sfiles+0
+ jms swap
+ jmp rttyi
+
+wttyo:
+ jms chkint1
+ jms forall
+ sna
+ jmp fallr
+ lmq
+ lac sfiles+1
+ spa
+ jmp 1f
+ xor o400000
+ dac sfiles+1
+ lacq
+ tls
+ sad o12
+ jms putcr
+ jmp fallr
+1:
+ lacq
+ dac char
+ lac d2 "** written: d6 ttyout
+ jms putchar
+ skp
+ jmp fallr
+ jms sleep; sfiles+1
+ jms swap
+ jmp wttyo
+
+rkbdi:
+ jms chkint1
+ lac d3
+ jms getchar
+"** 01-s1.pdf page 18
+ jmp 3f
+ lmq
+ and o155
+ sad o55
+ jmp 1f
+ lacq
+ and o137
+ sad o134
+ skp
+ jmp 2f
+1:
+ lacq
+ xor o20
+ lmq
+2:
+ lacq
+ dac u.limit
+1:
+ jms chkint1
+ lac u.limit
+ jms dspput
+ jmp 1f
+ jms sleep; sfiles+6
+ jms swap
+ jmp 1b
+1:
+ lac u.limit
+ alss 9
+ jmp passone
+3:
+ jms sleep; sfiles+2
+ jms swap
+ jmp rkbdi
+
+wdspo:
+ jms chkint1
+ jms forall
+ jms dspput
+ jmp fallr
+ jms sleep; sfiles+6
+ jms swap
+ jmp wdspo
+
+
+rppti:
+ lac d4
+ jms getchar
+ jmp .+3
+ alss 9
+ jmp passone
+ lac sfiles+3
+ sma
+ rsa
+1:
+ jms sleep; sfiles+3
+ jms swap
+ jmp rppti
+"** 01-s1.pdf page 19
+
+wppto:
+ jms forall
+ sna
+ jmp fallr
+ lmq
+ lac sfiles+4
+ spa
+ jmp 1f
+ xor o400000
+ dac sfiles+4
+ lacq
+ psa
+ jmp fallr
+1:
+ lacq
+ dac char
+ lac d5
+ jms putchar
+ skp
+ jmp fallr
+ jms sleep; sfiles+4
+ jms swap
+ jmp wppto
+
+passone:
+ sad o4000
+ jmp okexit
+ dac u.base i
+ lac d1
+ dac u.ac
+ jmp sysexit
+
+error: 0
+ -1
+ dac u.ac
+ jmp sysexit
+
+chkint1: 0
+ dzm .insys
+ jms chkint
+ skp
+ jmp .save
+ -1
+ dac .insys
+ jmp chkint1 i
diff --git a/pdp7parse/src/test/resources/s5.s b/pdp7parse/src/test/resources/s5.s
new file mode 100644
index 0000000..6c89ab9
--- /dev/null
+++ b/pdp7parse/src/test/resources/s5.s
@@ -0,0 +1,278 @@
+"** 01-s1.pdf page 28
+" s5
+
+dskswap: 0
+ cll; als 3
+ dac 9f+t
+ jms dsktrans; -64; userdata; 9f+t; dskswap
+ lac 9f+t
+ tad o20
+ dac 9f+t
+ jms dsktrans; -4096; 4096; 9f+t; dskswap
+ isz dskswap
+ jmp dskswap i
+t = t+1
+
+access: 0
+ lac i.flags
+ lmq
+ lac u.uid
+ spa
+ jmp access i
+ sad i.uid
+ lrs 2
+ lacq
+ and mode
+ sza
+ jmp access i
+ jms error
+
+fassign: 0
+ -10
+ dac 9f+t
+1:
+ lac 9f+t
+ tad d10
+ jms fget
+ jms halt " will not happen
+ lac f.flags
+ sma
+ jmp 1f
+ isz 9f+t
+ jmp 1b
+ jmp fassign i
+1:
+ lac mode
+ xor o400000
+ dac f.flags
+ lac ii
+ dac f.i
+ lac 9f+t
+ tad d10
+ dac u.ac
+ dzm f.badd
+ jms fput
+ isz fassign
+ jmp fassign i
+t = t+1
+
+fget: 0
+ jms betwen; d0; d9
+ jmp fget i
+ cll; mul; 3
+ lacq
+"** 01-s1.pdf page 29
+
+ tad ofilesp
+ dac 9f+t
+ dac .+2
+ jms copy; ..; fnode; 3
+ isz fget
+ jmp fget i
+
+fput: 0
+ lac 9f+t
+ dac .+3
+ jms copy; fnode; ..; 3
+ jmp fput i
+t = t+1
+
+forall: 0
+ lac u.base
+ sad u.limit
+ jmp 1f
+ lac u.base
+ ral
+ lac u.base i
+ snl
+ lrs 9
+ and o777
+ jmp forall i
+fallr:
+ lac u.base
+ add o400000
+ dac u.base
+ jmp forall+1
+1:
+ lac u.count
+ dac u.ac
+ jmp sysexit
+
+sleep: 0
+ law ulist-1
+ dac 8
+ lac o200000
+ lmq
+1:
+ lac u.ulistp i
+ sad 8 i
+ jmp 1f
+ isz 8
+ isz 8
+ isz 8
+ cla; lrs 1
+ jmp 1b
+1:
+ tad o100000
+ dac u.ulistp i
+ lac sleep i
+ dac 9f+t
+ lac 9f+t i
+ omq
+ dac 9f+t i
+ isz sleep
+ jmp sleep i
+t = t+1
+
+"** 01-s1.pdf page 30
+
+dslot: 0
+ dzm di
+ skp
+1:
+ isz di
+ lac di
+ jms dget
+ lac d.i
+ sza
+ jmp 1b
+ jmp dslot i
+
+icreat: 0
+ dac 9f+t
+ jms dslot
+ lac o20
+ dac ii
+1:
+ isz ii
+ lac ii
+ jms iget
+ lac i.flags
+ spa
+ jmp 1b
+ lac ii
+ dac d.i
+ jms copy; name; d.name; 4
+ isz s.uniq
+ lac s.uniq
+ dac d.uniq
+ dac i.uniq
+ lac 9f+t
+ xor o400000
+ dac i.flags
+ lac u.uid
+ dac i.uid
+ -1
+ dac i.nlks
+ dzm i.size
+ jms copyz; i.dskps; 7
+ jms iput
+ jms dput
+ jmp icreat i
+t = t+1
+
+dspput: 0
+ and o177
+ sna
+ jmp i dspput
+ sad o14
+ jmp 1f
+ lmq
+ sad o12
+ jms dspnl
+ lac dsploc i
+ sad o400000
+ jmp dspleft
+ omq
+ dac dsploc i
+ isz dsploc
+ jmp i dspput
+
+"** 01-s1.pdf page 31
+
+1:
+ jms dspinit
+ jmp dspput i
+
+dspleft:
+ lac dsploc
+ sad edspbuf
+ jmp 1f
+ dac 8
+ lac o400000
+ dac 8 i
+ cla; llss 18+7
+ dac dsploc i
+ jmp dspput i
+
+dspnl: 0
+ lac dsplno
+ sad d33
+ jmp 1f
+ isz dsplno
+ jmp dspnl i
+1:
+ lac o2000
+ wbl
+ isz dspput
+ jmp dspput i
+
+dspinit: 0
+ lac dspbufp3
+ dac dsploc
+ lac o400000
+ dac dspbuf+3
+ dzm dsplno
+ jmp dspinit i
+
+movdsp: 0
+ iof
+ cdf
+ dac dspbufp
+ -1
+ dac .dspb
+ ion
+ jmp movdsp i
+
+arg: 0
+ lac u.rq+8 i
+ isz u.rq+8
+ jmp arg i
+
+argname: 0
+ jms arg
+ dac .+2
+ jms copy; ..; name; 4
+ lac u.cdir
+ jms namei; name
+ jms error
+ jmp argname i
+
+seektell: 0
+ jms arg
+ dac u.base
+
+"** 01-s1.pdf page 32
+ jms arg
+ dac u.limit
+ jms finac
+ lac u.limit
+ sna
+ jmp seektell i
+ sad d1
+ jmp .+3
+ lac i.size
+ jmp seektell i
+ lac f.badd
+ jmp seektell i
+
+isown: 0
+ jms argname
+ jms iget
+ lac u.uid
+ sma
+ sad i.uid
+ skp
+ jms error
+ jmp isown i
+
diff --git a/pdp7parse/src/test/resources/s6.s b/pdp7parse/src/test/resources/s6.s
new file mode 100644
index 0000000..0072349
--- /dev/null
+++ b/pdp7parse/src/test/resources/s6.s
@@ -0,0 +1,350 @@
+"** 01-s1.pdf page 34
+" s6
+
+itrunc: 0
+ -7
+ dac 9f+t
+ lac idskpp
+ dac 9f+t+1
+1:
+ lac 9f+t+1 i
+ sna
+ jmp 4f
+ lac i.flags
+ and o200000
+ sna
+ jmp 3f
+ -64
+ dac 9f+t+2
+ lac dskbufp
+ dac 9f+t+3
+2:
+ lac 9f+t+1 i
+ jms dskrd
+ lac 9f+t+3 i
+ sza
+ jms free
+ isz 9f+t+3
+ isz 9f+t+2
+ jmp 2b
+3:
+ lac 9f+t+1 i
+ jms free
+ dzm 9f+t+1 i
+4:
+ isz 9f+t+1
+ isz 9f+t
+ jmp 1b
+ lac i.flags
+ and o577777
+ dac i.flags
+ jmp itrunc i
+t = t+4
+
+namei: 0
+ jms iget
+ -1
+ tad namei i
+ dac 9f+t+1
+ isz namei
+ lac i.flags
+ and o20
+ sna
+ jmp namei i
+ -8
+ tad i.size
+ cma
+ lrss 3
+ dac 9f+t
+ sna
+ jmp namei i
+ dzm di
+1:
+ lac di
+
+"** 01-s1.pdf page 35
+
+ jms dget
+ lac d.i
+ sna
+ jmp 2f
+ lac 9f+t+1
+ dac 8
+ lac d.name
+ sad 8 i
+ skp
+ jmp 2f
+ lac d.name+1
+ sad 8 i
+ skp
+ jmp 2f
+ lac d.name+2
+ sad 8 i
+ skp
+ jmp 2f
+ lac d.name+3
+ sad 8 i
+ skp
+ jmp 2f
+ lac d.i
+ isz namei
+ jmp namei i
+2:
+ isz di
+ isz 9f+t
+ jmp 1b
+ jmp namei i
+t = t+2
+
+iget: 0
+ dac ii
+ cll; idiv; 5
+ dac 9f+t
+ lacq
+ tad d2
+ dac 9f+t+1
+ jms dskrd
+ lac 9f+t
+ cll; mul; 12
+ lacq
+ tad dskbufp
+ dac 9f+t
+ dac .+2
+ jms copy; ..; inode; 12
+ jmp iget i
+
+iput: 0
+ lac 9f+t+1
+ jms dskrd
+ law inode-1
+ dac 8
+ -1
+ tad 9f+t
+ dac 9
+ -12
+ dac 9f+t+2
+1:
+ lac 8 i
+
+"** 01-s1.pdf page 36
+
+ sad 9 i
+ skp
+ jmp 2f
+ isz 9f+t+2
+ jmp 1b
+ jmp iput i
+2:
+ -1
+ tad 8
+ dac 8
+ -1
+ tad 9
+ dac 9
+1:
+ lac 8 i
+ dac 9 i
+ isz 9f+t+2
+ jmp 1b
+ lac 9f+t+1
+ jms dskwr
+ jmp iput i
+t = t+3
+
+dget: 0
+ dac di
+ alss 3
+ dac 9f+t
+ jms pget
+ dac 9f+t+1
+ jms dskrd
+ lac 9f+t
+ and o77
+ tad dskbufp
+ dac 9f+t+2
+ dac .+2
+ jms copy; ..; dnode; 8
+ lac 9f+t
+ tad d8
+ jms betwen; d0; i.size
+ skp
+ jmp dget i
+ jms dacisize
+ dzm d.i
+ jmp dget i
+
+dput: 0
+ lac 9f+t+1
+ jms dskrd
+ lac 9f+t+2
+ dac .+3
+ jms copy; dnode; ..; 8
+ lac 9f+t+1
+ jms dskwr
+ jmp dput i
+
+t = t+3
+
+pget: 0
+ lrss 6
+ dac 9f+t
+ lac i.flags
+
+"** 01-s1.pdf page 37
+
+ and o200000
+ sza
+ jmp 2f
+ lac 9f+t
+ jms betwen; d0; d6
+ jmp 1f
+ tad idskpp
+ dac 9f+t
+ lac 9f+t i
+ sna
+ jms alloc
+ dac 9f+t i
+ jmp pget i
+1:
+ jms alloc
+ dac 9f+t+1
+ jms copy; i.dskps; dskbuf; 7
+ jms copyz; dskbuf+7; 64-7
+ lac 9f+t+1
+ jms dskwr
+ lac 9f+t+1
+ dac i.dskps
+ jms copyz; i.dskps+1; 6
+ lac i.flags
+ xor o200000
+ dac i.flags
+2:
+ lac 9f+t
+ lrss 6
+ jms betwen; d0; d6
+ jms halt " file too big
+ tad idskpp
+ dac 9f+t+1
+ lac 9f+t+1 i
+ sna
+ jms alloc
+ dac 9f+t+1 i
+ dac 9f+t+2
+ jms dskrd
+ lac 9f+t
+ and o77
+ tad dskbufp
+ dac 9f+t+1
+ lac 9f+t+1 i
+ sza
+ jmp pget i
+ jms alloc
+ dac 9f+t
+ lac 9f+t+2
+ jms dskrd
+ lac 9f+t
+ dac 9f+t+1 i
+ lac 9f+t+2
+ jms dskwr
+ lac 9f+t
+ jmp pget i
+t = t+3
+
+iwrite: 0
+ dac 9f+t
+ lac iwrite
+
+"** 01-s1.pdf page 38
+
+ dac iread
+ lac cskp
+ dac iwrite
+ jmp 1f
+
+iread: 0
+ dac 9f+t
+ lac cnop
+ dac iwrite
+1:
+ -1
+ tad iread i
+ dac 10
+ dac 11
+ isz iread
+ lac iread i
+ dac 9f+t+1
+ isz iread
+ lac o70000
+ xct iwrite
+ lac i.size
+ cma
+ tad 9f+t
+ cma
+ jms betwen; d0; 9f+t+1
+ lac 9f+t+1
+ dac 9f+t+2
+ cma
+ tad d1
+ sna
+ jmp iread i
+ dac 9f+t+1
+1:
+ lac 9f+t
+ jms pget
+ dac 9f+t+3
+ jms dskrd
+ lac 9f+t
+ and o77
+ tad dskbufp
+ tad dm1
+ xct iwrite
+ jmp .+3
+ dac 10
+cskp:
+ skp
+ dac 11
+2:
+ lac 11 i
+ dac 10 i
+ isz 9f+t
+ isz 9f+t+1
+ jmp 3f
+ xct iwrite
+ jmp 4f
+ lac 9f+t
+ jms betwen; d0; i.size
+ dac i.size
+ lac 9f+t+3
+ jms dskwr
+ 4:
+"** 01-s1.pdf page 38
+ lac 9f+t+2
+ jmp iread i
+3:
+ lac 9f+t
+ and o77
+ sza
+ jmp 2b
+ xct iwrite
+ jmp 1b
+ lac 9f+t+3
+ jms dskwr
+ jmp 1b
+t = t+4
+
+finac: 0
+ lac u.ac
+ jms fget
+ jms error
+ lac f.flags
+ sma
+ jms error
+ lac f.i
+ jms iget
+ jmp finac i
+
+dacisize: 0
+ dac i.size
+ jms iput
+ lac i.size
+ jmp dacisize i
diff --git a/pdp7parse/src/test/resources/s8.s b/pdp7parse/src/test/resources/s8.s
new file mode 100644
index 0000000..7a60623
--- /dev/null
+++ b/pdp7parse/src/test/resources/s8.s
@@ -0,0 +1,214 @@
+"** 01-s1.pdf page 48
+
+" s8
+
+" manifests
+mnproc = 10
+dspbsz = 270
+ndskbs = 4
+
+" flags
+.insys: 0
+.int1: 0
+.int2: 0
+.ac: 0
+.savblk: 0
+.dsptm: 0
+.dskb: 0
+.dske: 0
+
+" pointers
+tadu: tad ulist
+dacu: dac ulist
+maxquant: 30
+ofilesp: u.ofiles
+idskpp: i.dskps
+dskbufp: dskbuf
+edspbuf: dspbuf+dspbsz
+dspbufp3: dspbuf+3
+fblksp: s.fblks
+dacq1: dac q1
+lacq1: lac q1
+q2p: q2
+
+" strings
+initf:
+ n;t;< > ;< > "
+
+" constants
+d0: 0
+d1: 1
+d2: 2
+d3: 3
+d4: 4
+d5: 5
+d6: 6
+d7: o7: 07
+d8: 8
+d9: 9
+o12: d10: 10
+o14: 014
+o15: 015
+o17: 017
+o20: 020
+o33: 033
+o40: 040
+o55: 055
+o77: 077
+d65:o101: 0101
+d33: 33
+o132: 0132
+o134: 0134
+o137: 0137
+o155: 0155
+o177: 0177
+"** 01-s1.pdf page 49
+o212: 0212
+o375: 0375
+o777: 0777
+o2000: 02000
+o4000: 04000
+d7999: 7999
+o10000: 010000
+o17762: 017762
+o17777: 017777
+o20001: 020001
+o40000: 040000
+o40001: 040001
+o70000: 070000
+o77777: 077777
+o100000: 0100000
+o140000: 0140000
+o200000: 0200000
+o200001: 0200001
+o300000: 0300000
+o400000: 0400000
+o500000: 0500000
+o577777: 0577777
+o600000: 0600000
+o640000: 0640000
+o700000: 0700000
+o777700: 0777700
+o777760: 0777760
+dm3: -3
+dm1: -1
+
+9: .=.+t
+c1: .=.+1
+q1: q2;q2+90 "** ?? 98 ??
+ .=.+14
+q2:
+ .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0
+ .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0
+ .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0
+ .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0
+ .+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;.+2;0;0;0
+dsploc: .=.+1
+dsplno: .=.+1
+dspbuf:
+ 0065057;0147740;0160000
+ .=.+30
+coldentry:
+ dzm 0100 " not re-entrant
+ caf
+ ion
+ clon
+ law 3072
+ wcga
+ jms dspinit
+ law dspbuf
+ jms movdsp
+ cla
+ jms dskio; 06000
+ jms copy; dskbuf; sysdata; ulist-sysdata
+ lac d3
+ jms namei; initf
+ jms halt
+"** 01-s1.pdf page 50
+ jms iget
+ cla
+ jms iread; 4096; 4096
+ jmp 4096
+ . = dspbuf+dspbsz+3
+dskbuf = 07700
+dskbs: .=.+65+65+65+65
+edskbsp: .
+uquant: .=.+1
+dspbufp: .=.+1
+pbsflgs: .=.+2
+mode: .=.+1
+nttychar: .=.+1
+npptchar: .=.+1
+ttydelay: .=.+1
+name: .=.+4
+lnkaddr: .=.+1
+char: .=.+1
+dskaddr: .=.+1
+uniqpid: 1
+lu: .=.+4
+sfiles: .=.+10
+dpdata:
+ dpstat: .=.+1
+ dpread: .=.+1
+ dpwrite: .=.+1
+ dpchar: .=.+1
+dspdata:
+ .dspb: .=.+1
+ .lpba: .=.+1 "** 4 written on listing
+crdata:
+ crread: .=.+1
+ crchar: .=.+1
+sysdata:
+ s.nxfblk: .=.+1
+ s.nfblks: .=.+1
+ s.fblks: .=.+10
+ s.uniq: .=.+1
+ s.tim: .=.+2
+ulist:
+ 0131000;1;0;0
+ 0031040;0;0;0
+ 0031100;0;0;0
+ 0031140;0;0;0
+ 0031200;0;0;0
+ 0031240;0;0;0
+ 0031300;0;0;0
+ 0031340;0;0;0
+ 0031400;0;0;0
+ 0031440;0;0;0
+userdata:
+ u.ac: 0
+ u.mq: 0
+ u.rq: .=.+9
+ u.uid: -1
+ u.pid: 1
+ u.cdir: 3
+ u.ulistp: ulist
+ u.swapret: 0
+ u.base: 0
+ u.count: 0
+"** 01-s1.pdf page 51
+ u.limit: 0
+ u.ofiles: .=.+30
+ u.dspbuf: 0
+ u.intflg: 1
+ .=userdata+64
+ii: .=.+1
+inode:
+ i.flags: .=.+1
+ i.dskps: .=.+7
+ i.uid: .=.+1
+ i.nlks: .=.+1
+ i.size: .=.+1
+ i.uniq: .=.+1
+ .= inode+12
+di: .=.+1
+dnode:
+ d.i: .=.+1
+ d.name: .=.+4
+ d.uniq: .=.+1
+ . = dnode+8
+fnode:
+ f.flags: .=.+1
+ f.badd: .=.+1
+ f.i: 0
+
diff --git a/pdp7parse/src/test/resources/s9.s b/pdp7parse/src/test/resources/s9.s
new file mode 100644
index 0000000..044350a
--- /dev/null
+++ b/pdp7parse/src/test/resources/s9.s
@@ -0,0 +1,115 @@
+"** 01-s1.pdf page 53
+" s9 -- cold boot
+
+. = coldentry+4
+
+" zero i-list
+
+ dzm ii
+ jms copyz; dskbuf; 64
+1:
+ lac ii
+ jms dskio; 07000
+ isz ii
+ -710
+ tad ii
+ sza
+ jmp 1b
+
+" free rest of disk
+
+1:
+ lac ii
+ jms free
+ isz ii
+ -6400
+ tad ii
+ sza
+ jmp 1b
+
+" read in tapes
+
+ dzm ii
+1:
+ dzm sum
+ jms getw " count
+ sza
+ jmp .+3
+ hlt
+ jmp 1b " 0 count means pause
+ dac xx
+ isz ii
+ lac ii
+ jms iget
+ jms copyz; inode; 12
+ jms getw " flags
+ dac i.flags
+ -1
+ dac i.uid
+ jms getw " number links
+ dac i.nlks
+ -2
+ tad xx
+ dac i.size
+ lac ii
+ dac i.uniq
+ law 4096-1
+ dac 8
+ -1
+ tad i.size
+ cma
+ sna
+ jmp 3f
+ dac xx
+
+"** 01-s1.pdf page 54
+2:
+ jms getw
+ dac 8 i
+ isz xx
+ jmp 2b
+3:
+ lac sum
+ dac xx
+ jms getw " checksum
+ sad xx
+ skp
+ jms halt
+ lac i.size
+ dac .+4
+ cla
+ jms iwrite; 4096; ..
+ jms iput
+ cla
+ jms dskio; 07000 "** writing on listing
+ jmp 1b
+
+getw: 0
+ jms getc
+ alss 12
+ lmq
+ jms getc
+ alss 6
+ omq
+ lmq
+ jms getc
+ omq
+ lmq
+ add sum
+ dac sum
+ lacq
+ jmp getw i
+
+getc: 0
+ iof
+ rsa
+ rsf
+ jmp .-1
+ rrb
+ sna
+ jmp getc+1
+ and o77
+ ion
+ jmp getc i
+xx: 0
+sum: 0
diff --git a/pdp7parse/src/test/resources/sop.s b/pdp7parse/src/test/resources/sop.s
new file mode 100644
index 0000000..047a1ba
--- /dev/null
+++ b/pdp7parse/src/test/resources/sop.s
@@ -0,0 +1,95 @@
+"** 01-s1.pdf page 62
+" sop
+
+dac = 0040000 " MEM: deposit AC
+jms = 0100000 " MEM: jump to subroutine
+dzm = 0140000 " MEM: deposit zero to memory
+lac = 0200000 " MEM: load AC
+xor = 0240000 " MEM: XOR with AC
+add = 0300000 " MEM: one's complement add
+tad = 0340000 " MEM: two's complement add
+xct = 0400000 " MEM: execute
+isz = 0440000 " MEM: increment and skip if zero
+and = 0500000 " MEM: AND
+sad = 0540000 " MEM: skip if AC different
+jmp = 0600000 " MEM: jump
+nop = 0740000 " OPR: no-op
+i = 020000 " indirect
+law = 0760000 " OPR: load accumulator with (instr)
+cma = 0740001 " OPR: complement AC
+las = 0750004 " OPR: load AC from switches
+ral = 0740010 " OPR: rotate AC left
+rar = 0740020 " OPR: rotate AC right
+hlt = 0740040 " OPR: halt
+sma = 0740100 " OPR: skip on minus AC
+sza = 0740200 " OPR: skip on zero AC
+snl = 0740400 " OPR: skip on non-zero link
+skp = 0741000 " OPR: skip unconditionally
+sna = 0741200 " OPR: skip on non-zero AC
+szl = 0741400 " OPR: skip on zero link
+rtl = 0742010 " OPR: rotate two left
+rtr = 0742020 " OPR: rotate two right
+cll = 0744000 " OPR: clear link
+rcl = 0744010 " OPR: clear link, rotate left
+rcr = 0744020 " OPR: clear link, rotate right
+cla = 0750000 " OPR: clear AC
+lrs = 0640500 " EAE: long right shift
+lrss = 0660500 " EAE: long right shift, signed
+lls = 0640600 " EAE: long left shift
+llss = 0660600 " EAE: long left shift, signed
+als = 0640700 " EAE: AC left shift
+alss = 0660700 " EAE: AC left shift, signed
+mul = 0653323 " EAE: multiply
+idiv = 0653323 " EAE: integer divide
+lacq = 0641002 " EAE: load AC with MQ
+clq = 0650000 " EAE: clear MQ
+omq = 0650002 " EAE: OR MQ into AC
+cmq = 0650004 " EAE: complement MQ
+lmq = 0652000 " EAE: load MQ from AC
+
+dscs = 0707141 " DSK: clear status register
+dslw = 0707124 " DSK: clear and load WC from AC
+dslm = 0707142 " DSK: clear and load MAC from AC
+dsld = 0707104 " DSK: clear and load TA and SA from AC
+dsls = 0707144 " DSK: load status
+dssf = 0707121 " DSK: skip on flags
+dsrs = 0707132 " DSK: read status register
+
+iof = 0700002 " PIC: interrupts off
+ion = 0700042 " PIC: interrupts on
+caf = 0703302 " CPU: clear all flags
+clon = 0700044 " CLK: clear flag, enable
+clsf = 0700001 " CLK: skip if overflow
+"** 01-s1.pdf page 63
+clof = 0700004 " CLK: clear flag, disable
+ksf = 0700301 " KBD: skip if flag set
+krb = 0700312 " KBD: read buffer
+tsf = 0700401 " TTY: skip if flag set
+tcf = 0700402 " TTY: clear flag
+tls = 0700406 " TTY: load buffer, select
+sck = 0704301 " S-2: skip on console keyboard
+cck = 0704304 " S-2: clear console keyboard
+lck = 0704312 " S-2: load console keyboard
+rsf = 0700101 " PTR: skip if flag set
+rsa = 0700104 " PTR: select alphanumeric mode
+rrb = 0700112 " PTR: clear flag, or read buffer
+psf = 0700201 " PTP: skip if flag set
+pcf = 0700202 " PTP: clear flag
+psa = 0700204 " PTP: alphanumeric mode
+cdf = 0700501 " ???
+lds = 0701052 " S-2: load display status
+lda = 0701012 " S-2: load display address
+wcga = 0704206 " S-2: ???
+raef = 0700742 " S-2: resume after edges flag
+rlpd = 0700723 " S-2: resume after light pen stop, disabled
+beg = 0700547 " S-2: begin
+spb = 0704401 " S-2: skip on push button flag
+cpb = 0704404 " S-2: clear push button flag
+lpb = 0704412 " S-2: load push buttons
+wbl = 0704424 " S-2: write button lights
+dprs = 0704752 " dataphone: read status
+dpsf = 0704741 " dataphone: skip on flag
+dpcf = 0704761 " dataphone: clear flag
+dprc = 0704712 " dataphone: read character
+crsf = 0706701 " CDR: skip if ready
+crrb = 0706712 " CDR: read buffer
diff --git a/pdp7parse/src/test/resources/sysmap b/pdp7parse/src/test/resources/sysmap
new file mode 100644
index 0000000..07bd2e5
--- /dev/null
+++ b/pdp7parse/src/test/resources/sysmap
@@ -0,0 +1,264 @@
+"** 01-s1.pdf page 57 -- system assembly map
+. 004671 r
+.ac 004012 r
+.chown 000426 r
+.capt 000404 r
+.creat 000665 r
+.chdir 000622 r
+.chmod 000414 r
+.dskb 004105 r
+.dspb 005547 r
+.dsptm 004104 r
+.dske 004106 r
+.exit 001170 r
+.fork 001116 r
+.getuid 000433 r
+.halt 001343 r
+.int1 004100 r
+.insys 004077 r
+.int2 004101 r
+.intrp 000257 r
+.link 000474 r
+.lpba 005550 r
+.open 000633 r
+.rmes 001204 r
+.rele 000410 r
+.rename 000547 r
+.read 000731 r
+.smes 001232 r
+.savblk 004103 r
+.sysloc 000262 r
+.setuid 000566 r
+.status 000352 r
+.save 001156 r
+.seek 000436 r
+.tell 000466 r
+.time 000615 r
+.unlink 000547 r
+.write 001000 r
+access 002323 r
+alloc 001556 r
+argname 002642 r
+arg 002636 r
+awake 001311 r
+badcal 001153 r
+betwen 001654 r
+c1 004270 r
+chkint 000320 r
+chkink1 001546 r
+char 005522 r
+cnop 003453 r
+coldentr 004520 r
+copyz 001723 r
+collapse 002066 r
+copy 001700 r
+crdata 005551 r
+crchar 005552 r
+crread 005551 r
+cskp 003346 r
+d.name 005761 r
+d.uniq 005765 r
+d.i 005760 r
+"** 01-s1.pdf page 58
+d0 004127 r
+d10 004141 r
+d1 004130 r
+d2 004131 r
+d33 004153 r
+d3 004132 r
+d4 004133 r
+d5 004134 r
+d6 004135 r
+d65 004155 r
+d7999 004166 r
+d7 004136 r
+d8 004137 r
+d9 004140 r
+dacq1 004120 r
+dacu 004110 r
+dacisize 003413 r
+dget 003115 r
+di 005757 r
+dm1 004215 r
+dm3 004214 r
+dnode 005760 r
+dpdata 005543 r
+dput 003147 r
+dpchar 005546 r
+dpwrite 005545 r
+dpstat 005543 r
+dpread 005544 r
+dskbufp 004114 r
+dskio 002173 r
+dspdata 005547 r
+dskrd 002127 r
+dsktrans 002231 r
+dsploc 004455 r
+dslot 002474 r
+dspino 004456 r
+dspbufp3 004116 r
+dspbufp 005506 r
+dspresta 003523 r
+dskaddr 005523 r
+dskbs 005100 r
+dskwr 002157 r
+dspput 002551 r
+dspleft 002573 r
+dspbuf 004457 r
+error 001542 r
+exitrw 001041 r
+f.badd 005771 r
+f.flags 005770 r
+fassign 002340 r
+fallr 002436 r
+fblksp 004117 r
+fget 002371 r
+finac 003401 r
+fnode 005770 r
+"** 01-s1.pdf page 59
+forall 002434 r
+fput 003413 r
+free 001615 r
+getchar 001756 r
+getw 004635 r
+getc 004654 r
+halt 002265 r
+i.flags 005743 r
+i.dskps 005744 r
+i.uniq 005756 r
+i.size 005755 r
+i.nlks 005754 r
+i.uid 005753 r
+icreat 002506 r
+idskpp 004113 r
+iget 003030 r
+ii 005742 r
+inode 005743 r
+intrp1 004032 r
+intrp2 004055 r
+initf 004123 r
+iput 003057 r
+iread 003277 r
+isown 002675 r
+itrunc 002706 r
+iwrite 003270 r
+laci 001646 r
+lacq1 004121 r
+lnkaddr 005521 r
+lookfor 001073 r
+locsw 000275 r
+locn 000317 r
+lu 005525 r
+maxquant 004111 r
+mode 005511 r
+movdsp 002626 r
+name 005515 r
+namei 002750 r
+npptchar 005513 r
+nttychar 005512 r
+o10000 004167 r
+o17 004144 r
+o177 004160 r
+o101 004152 r
+o17762 004170 r
+o17777 004171 r
+o12 004141 r
+o132 004154 r
+o134 004155 r
+o137 004156 r
+o100000 004177 r
+o140000 004200 r
+o14 004142 r
+o15 004143 r
+0155 004157 r
+o2000 004164 r
+o200001 004262 r
+o20001 004172 r
+020 004145 r
+o212 004161 r
+o200000 004201 r
+"** 01-s1.pdf page 60
+o375 004162 r
+o33 004146 r
+o300000 004203 r
+o4000 004165 r
+o40000 004173 r
+o40 004147 r
+o400000 004204 r
+o500000 004205 r
+o55 004150 r
+o577777 004206 r
+o600000 004207 r
+o640000 004210 r
+o777 004163 r
+o77 004157 r
+o70000 004175 r
+o77777 004176 r
+o777760 004213 r
+o7 004136 r
+o700000 004211 r
+o777700 004212 r
+ofilesp 004112 r
+okexit 000102 r
+open1 000722 r
+orig 000000 r
+passone 001534 r
+pbsflgs 005507 r
+pget 003163 r
+piret 003766 r
+pibreak 003420 r
+putchar 001741 r
+putq 002022 r
+putcr 004025 r
+q1 004271 r
+q2p 004122 r
+q2 004311 r
+rkbdi 001415 r
+rppti 001472 r
+rttyi 001344 r
+s.tim 005570 r
+s.nxfblk 005553 r
+s.uniq 005567 r
+s.nfblks 005554 r
+s.fblks 005555 r
+seektell 002656 r
+searchu 001047 r
+sfiles 005551 r
+sleep 002445 r
+srcdbs 002046 r
+sum 004670 r
+swr 001331 r
+swp 000220 r
+swn 000256 r
+sww 001331 r
+swap 000136 r
+sysdata 005553 r
+sysexit 000103 r
+takeq 001770 r
+tadu 004107 r
+ttydelay 005514 r
+ttyresta 003603 r
+"** 01-s1.pdf page 61
+u.dspbuf 005723 r
+u.intflg 005724 r
+u.ulistp 005660 r
+u.pid 005656 r
+u.ofiles 005665 r
+u.swapre 005661 r
+u.mq 005643 r
+u.uid 005655 r
+u.ac 005642 r
+u.limit 005664 r
+u.cdir 005657 r
+u.count 005663 r
+u.base 005662 r
+u.rq 005644 r
+ulsit 005562 r
+uniqpid 005524 r
+uquant 005505 r
+userdata 005642 r
+wakeup 003773 r
+wdspo 001462 r
+wppto 001506 r
+wttyo 001364 r
+xx 004667 r
| |