|
|
DataMuseum.dkPresents historical artifacts from the history of: CR80 Hard and Floppy Disks |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CR80 Hard and Floppy Disks Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 20320 (0x4f60)
Types: TextFile
Names: »SEMANTICS.S«
└─⟦f81e11cf7⟧ Bits:30005196 8" CR80 Floppy CR80FD_0194 ( CR/D/2497 TEST-TDX VS0102 Source moduler Att. Holger Bay 820208/AEK )
└─⟦d066df9e9⟧
└─⟦this⟧ »SEMANTICS.S«
«ff»
"SEMANTICS.S "
"----------------"
PROCEDURE SEMANTICS(ACTION, ATTRIBUTE, STACK_INDEX : INTEGER);
"**********************************************************************
AUTHOR: TLM
DATE: 810316
***********************************************************************
COMMENTS:
***********************************************************************
CHANGE RECORD:
VERSION AUTHOR/DATE DESCRIPTION OF CHANGE
------- ----------- ---------------------
**********************************************************************"
VAR I : INTEGER;
PARAMNAME : NAME_TYPE;
BEGIN
IF (NOT IGNORE_REST_OF_LINE) OR
(IGNORE_REST_OF_LINE AND (ACTION IN [19, 20] "STATEMENT"))
THEN
CASE ACTION OF
1: "IDENTIFIER"
BEGIN
IDENTIFIER.LENGTH := ATTRIBUTE;
IDENTIFIER.STRING := SYMBOLBUF;
END;
2: "CONSTANT"
BEGIN
CONSTANT := ATTRIBUTE;
END;
3: "STRING"
BEGIN
STRING.LENGTH := ATTRIBUTE;
STRING.STRING := SYMBOLBUF;
END;
4: "ERROR"
BEGIN
NO_OF_INTEGERS := 0;
WRITETEXT('?(:7:)(:0:)');
WRITENL;
END;
5: "<GOAL-SYMBOL> --> <commandfile> "
BEGIN
TERMINATE(0);
END;
6:;"<commandfile> --> <procdecls> <body> <nl> "
7:;" --> <body> <nl> "
8:;" --> END <nl> "
9:;"<procdecls> --> <procdecls> <procdecl> "
10:;" --> <procdecl> "
11, "<procdecl> --> <proresword> <procname> <paramlist> <nl> <body> <nl> "
12: " --> <proresword> <procname> <nl> <body> <nl> "
BEGIN
PROCEDURES[PROCEDURECOUNT].NO_OF_PARAMS := PARAMETERCOUNT;
PARAMETERCOUNT := 0;
PROC_DECLARING := FALSE;
"--- GENERATE PROCEDURE RETURN CODE ---"
CODE[CCP] := PROCRETURN_CMD;
CODE[CCP + XVARMASK] := 0;
CODE[CCP + XPARAMS ] := 0;
CCP := CCP + 3;
END;
13: "<proresword> --> PROCEDURE "
BEGIN
PROC_DECLARING := TRUE;
PROC_CODE_PTR := CCP;
PARAMETERCOUNT := 0;
INSTALL_PROCNAME := TRUE;
END;
14: "<procname> --> <identifier> "
BEGIN
PROCNAME := ' ';
I := 0;
REPEAT
I := SUCC(I);
PROCNAME[I] := IDENTIFIER.STRING[I - 1];
UNTIL (I = IDENTIFIER.LENGTH) OR (I = 16);
IF INSTALL_PROCNAME THEN
BEGIN
PROCEDURECOUNT := SUCC(PROCEDURECOUNT);
WITH PROCEDURES[PROCEDURECOUNT] DO
BEGIN
NAME := PROCNAME;
CODE_ADR := PROC_CODE_PTR;
END;
INSTALL_PROCNAME := FALSE;
END;
ACTPARAMETERCOUNT := 0;
PARAMETERS.VARIABLE_MASK := 0;
PARAMETERS.NO_OF_PARAMS := 0;
END;
15:;"<paramlist> --> ( <parameters> ) "
16, "<parameters> --> <parameters> ; <identifier> "
17: " --> <identifier> "
BEGIN
PARAMETERCOUNT := SUCC(PARAMETERCOUNT);
IF PARAMETERCOUNT <= MAX_PARAMETER THEN
BEGIN
FORM_PARAMS[PARAMETERCOUNT].NAME := ' ';
I := 0;
REPEAT
I := SUCC(I);
FORM_PARAMS[PARAMETERCOUNT].NAME[I] :=
IDENTIFIER.STRING[I - 1];
UNTIL (I = IDENTIFIER.LENGTH) OR (I = 16);
END
ELSE
BEGIN
WRITETEXT('*** TOO MANY PARAMETERS ***(:0:)');
WRITENL;
IGNORE_REST_OF_LINE := TRUE;
END;
END;
18:;"<body> --> BEGIN <nl> <statements> END "
19, "<statements> --> <statements> <statement> "
20: " --> <statement> "
BEGIN
IGNORE_REST_OF_LINE := FALSE;
PARAMETERS.VARIABLE_MASK := 0;
PARAMETERS.NO_OF_PARAMS := 0;
END;
21: "<statement> --> <procedurecall> "
BEGIN
CODE[CCP] := PROCCALL_CMD;
CODE[CCP + XVARMASK] :=
LEFTSHIFT(PARAMETERS.VARIABLE_MASK, 1);
CODE[CCP + XPARAMS ] := PARAMETERS.NO_OF_PARAMS + 1;
I := GET_PROCEDURE_ADR(PROCNAME);
IF I <> UNDECLARED THEN
BEGIN
CODE[CCP + XPARAMS + 1] := I;
I := GET_PARAMETER_COUNT(PROCNAME);
IF I = PARAMETERS.NO_OF_PARAMS THEN
BEGIN
FOR I := 1 TO PARAMETERS.NO_OF_PARAMS DO
CODE[CCP + XPARAMS + 1 + I] :=
PARAMETERS.ACT_PARAMS[I];
IF REPEAT_DECLARING OR PROC_DECLARING THEN
BEGIN
CCP := CCP + CODE[CCP + XPARAMS] + 3;
END
ELSE
INTERPRET(CCP, CURR_SP);
END
ELSE
BEGIN
WRITETEXT('*** PARAMETER MISMATCH ***(:0:)');
WRITENL;
IGNORE_REST_OF_LINE := TRUE;
END;
END
ELSE
BEGIN
WRITETEXT('*** UNDECLARED PROCEDURE ***(:0:)');
WRITENL;
IGNORE_REST_OF_LINE := TRUE;
END;
END;
22: " --> <repeatstatement "
BEGIN
CODE[CCP] := ENDREPEAT_CMD;
CODE[CCP + XVARMASK] := 0;
CODE[CCP + XPARAMS ] := 1;
CODE[CCP + XPARAMS + 1] := REPEAT_CODE_PTR;
IF PROC_DECLARING THEN
CCP := CCP + CODE[CCP + XPARAMS] + 3
ELSE
BEGIN
INTERPRET(REPEAT_CODE_PTR, CURR_SP);
CCP := REPEAT_CODE_PTR;
END;
REPEAT_DECLARING := FALSE;
END;
23: " --> <simplecommand> "
BEGIN
IF PROC_DECLARING OR REPEAT_DECLARING THEN
CCP := CCP + CODE[CCP + XPARAMS] + 3
ELSE
INTERPRET(CCP, CURR_SP);
END;
24:;" --> <error> "
25:;"<procedurecall> --> <procname> ( <actualparams> ) <nl> "
26:;" --> <procname> <nl> "
27, "<actualparams> --> <actualparams> , <const_or_var> "
28: " --> <const_or_var> "
BEGIN
ACTPARAMETERCOUNT := SUCC(ACTPARAMETERCOUNT);
IF ANY.VARIABLE THEN
BEGIN
SETBIT(PARAMETERS.VARIABLE_MASK, ACTPARAMETERCOUNT);
END;
PARAMETERS.NO_OF_PARAMS := ACTPARAMETERCOUNT;
PARAMETERS.ACT_PARAMS[ACTPARAMETERCOUNT] := ANY.PARAMETER;
END;
29:;"<repeatstatement --> <repeatresword> <repeats> <nl> <body> <nl> "
30:;" --> <repeatresword> <repeats> <statement> "
31: "<repeatresword> --> REPEAT "
BEGIN
REPEAT_CODE_PTR := CCP;
REPEAT_DECLARING := TRUE;
END;
32: "<repeats> --> <const_or_var> "
BEGIN
REPEATS := ANY;
CODE[CCP] := REPEAT_CMD;
XVM := CCP + XVARMASK;
CODE[XVM] := 0;
IF REPEATS.VARIABLE THEN SETBIT(CODE[XVM], 1);
CODE[CCP + XPARAMS] := 1;
CODE[CCP + XPARAMS + 1] := REPEATS.PARAMETER;
CCP := CCP + CODE[CCP + XPARAMS] + 3;
END;
33: "<simplecommand> --> <driverdefinecom "
BEGIN
CODE[ CCP ] := DRIVERDEFINE_CMD;
CODE[ CCP + XVARMASK ] := 0;
CODE[ CCP + XPARAMS ] := 6;
PACK(STRING.STRING[0], CODE[CCP + XPARAMS + 1], 6);
PACK(STRING.STRING[7], CODE[CCP + XPARAMS + 5], 4);
CODE[CCP + XPARAMS + 4] := 0;
END;
34: "<simplecommand> --> <assigncommand> "
BEGIN
CODE[CCP] := ASSIGN_CMD;
XVM := CCP + XVARMASK;
CODE[XVM] := 0;
IF CR80ADR.VARIABLE THEN SETBIT(CODE[XVM], 1);
IF HOSTNO.VARIABLE THEN SETBIT(CODE[XVM], 2);
CODE[CCP + XPARAMS] := 2;
CODE[CCP + XPARAMS + 1] := CR80ADR.PARAMETER;
CODE[CCP + XPARAMS + 2] := HOSTNO.PARAMETER;
END;
35: "<simplecommand> --> <deassigncommand "
BEGIN
CODE[CCP] := DEASSIGN_CMD;
CODE[CCP + XVARMASK] := 0;
CODE[CCP + XPARAMS ] := 0;
END;
36: "<simplecommand> --> <createcommand> "
BEGIN
CODE[CCP] := CREATE_CMD;
XVM := CCP + XVARMASK;
CODE[XVM] := 0;
IF PROTOCOL.VARIABLE THEN SETBIT(CODE[XVM], 1);
IF CRID.VARIABLE THEN SETBIT(CODE[XVM], 2);
IF SPEED.VARIABLE THEN SETBIT(CODE[XVM], 3);
IF MAXPACKET.VARIABLE THEN SETBIT(CODE[XVM], 4);
CODE[CCP + XPARAMS] := 4;
CODE[CCP + XPARAMS + 1] := PROTOCOL.PARAMETER;
CODE[CCP + XPARAMS + 2] := CRID.PARAMETER;
CODE[CCP + XPARAMS + 3] := SPEED.PARAMETER;
CODE[CCP + XPARAMS + 4] := MAXPACKET.PARAMETER;
END;
37: "<simplecommand> --> <dismantlecomman "
BEGIN
CODE[CCP] := DISMANTLE_CMD;
XVM := CCP + XVARMASK;
CODE[XVM] := 0;
IF CRID.VARIABLE THEN SETBIT(CODE[XVM], 1);
CODE[CCP + XPARAMS] := 1;
CODE[CCP + XPARAMS + 1] := CRID.PARAMETER;
END;
38, "<simplecommand> --> <readcommand> "
39: "<simplecommand> --> <initreadcommand "
BEGIN
IF ACTION = 38 THEN CODE[CCP] := READ_CMD
ELSE CODE[CCP] := INITREAD_CMD;
XVM := CCP + XVARMASK;
CODE[XVM] := 0;
IF CRID.VARIABLE THEN SETBIT(CODE[XVM], 1);
IF NOOFBYTES.VARIABLE THEN SETBIT(CODE[XVM], 2);
CODE[CCP + XPARAMS] := 5;
CODE[CCP + XPARAMS + 1] := CRID.PARAMETER;
CODE[CCP + XPARAMS + 2] := NOOFBYTES.PARAMETER;
IF ACTION = 38 THEN CODE[CCP + XPARAMS + 3] := 1
ELSE CODE[CCP + XPARAMS + 3] := 3;
IF DATA_EXPECTED THEN
BEGIN
IF PATTERNNO.VARIABLE THEN SETBIT(CODE[XVM], 4);
CODE[CCP + XPARAMS + 4] := PATTERNNO.PARAMETER;
END
ELSE CODE[CCP + XPARAMS + 4] := 0;
IF DUMP_AT_COMPLETION THEN CODE[CCP + XPARAMS + 5] := 1
ELSE CODE[CCP + XPARAMS + 5] := 0;
END;
40, "<simplecommand> --> <appendcommand> "
41: "<simplecommand> --> <initappendcomma "
BEGIN
IF ACTION = 40 THEN CODE[CCP] := APPEND_CMD
ELSE CODE[CCP] := INITAPPEND_CMD;
XVM := CCP + XVARMASK;
CODE[XVM] := 0;
IF CRID.VARIABLE THEN SETBIT(CODE[XVM], 1);
IF NOOFBYTES.VARIABLE THEN SETBIT(CODE[XVM], 2);
IF PATTERNNO.VARIABLE THEN SETBIT(CODE[XVM], 4);
CODE[CCP + XPARAMS + 1] := CRID.PARAMETER;
CODE[CCP + XPARAMS + 2] := NOOFBYTES.PARAMETER;
IF ACTION = 40 THEN "APPEND"
CODE[CCP + XPARAMS + 3] := 2 "BUFFER NO"
ELSE "INITAPPEND"
CODE[CCP + XPARAMS + 3] := 4;
CODE[CCP + XPARAMS + 4] := PATTERNNO.PARAMETER;
IF PATTERNNO.PARAMETER = 0 THEN
BEGIN
FOR I := 1 TO NO_OF_INTEGERS DO
CODE[CCP + XPARAMS + 4 + I] := INTEGERS[I];
CODE[CCP + XPARAMS] := NO_OF_INTEGERS + 4;
END
ELSE CODE[CCP + XPARAMS] := 4;
NO_OF_INTEGERS := 0;
END;
42: "<simplecommand> --> <consolecommand> "
BEGIN
"CODE GENERATED IN 62,63"
END;
43: "<simplecommand> --> <definecommand> "
BEGIN
CODE[CCP] := PATTERN_DEFINE_CMD;
XVM := CCP + XVARMASK;
CODE[XVM] := 0;
IF PATTERNNO.VARIABLE THEN SETBIT(CODE[XVM], 1);
CODE[CCP + XPARAMS] := NO_OF_INTEGERS + 1;
CODE[CCP + XPARAMS + 1] := PATTERNNO.PARAMETER;
FOR I := 1 TO NO_OF_INTEGERS DO
CODE[CCP + XPARAMS + 1 + I] := INTEGERS[I];
NO_OF_INTEGERS := 0;
END;
44: "<simplecommand> --> <dumpcommand> "
BEGIN
CODE[CCP] := DUMP_CMD;
XVM := CCP + XVARMASK;
CODE[XVM] := 0;
IF BUFFERNO.VARIABLE THEN SETBIT(CODE[XVM], 1);
IF STARTADDR.VARIABLE THEN SETBIT(CODE[XVM], 2);
IF ENDADDR.VARIABLE THEN SETBIT(CODE[XVM], 3);
IF PATTERNNO.VARIABLE THEN SETBIT(CODE[XVM], 4);
CODE[CCP + XPARAMS] := 4;
CODE[CCP + XPARAMS + 1] := BUFFERNO.PARAMETER;
CODE[CCP + XPARAMS + 2] := STARTADDR.PARAMETER;
CODE[CCP + XPARAMS + 3] := ENDADDR.PARAMETER;
CODE[CCP + XPARAMS + 4] := PATTERNNO.PARAMETER;
END;
45: "<simplecommand> --> <delaycommand> "
BEGIN
CODE[CCP] := DELAY_CMD;
XVM := CCP + XVARMASK;
CODE[XVM] := 0;
IF TIME.VARIABLE THEN SETBIT(CODE[XVM], 1);
CODE[CCP + XPARAMS] := 1;
CODE[CCP + XPARAMS + 1] := TIME.PARAMETER;
END;
46: "<simplecommand> --> <cancelcommand> "
BEGIN
CODE[CCP] := CANCEL_CMD;
XVM := CCP + XVARMASK;
CODE[XVM] := 0;
IF CRID.VARIABLE THEN SETBIT(CODE[XVM], 1);
IF OPREF.VARIABLE THEN SETBIT(CODE[XVM], 2);
CODE[CCP + XPARAMS] := 2;
CODE[CCP + XPARAMS + 1] := CRID.PARAMETER;
CODE[CCP + XPARAMS + 2] := OPREF.PARAMETER;
END;
47: "<simplecommand> --> <listcommand> "
BEGIN
CODE[CCP] := LIST_CMD;
CODE[CCP + XVARMASK] := 0;
CODE[CCP + XPARAMS ] := 0;
END;
48: "<simplecommand> --> <waitinitcommand> "
BEGIN
CODE[CCP] := WAITINIT_CMD;
CODE[CCP + XVARMASK] := 0;
IF TIME.VARIABLE THEN SETBIT(CODE[CCP + XVARMASK], 1);
CODE[CCP + XPARAMS] := 1;
CODE[CCP + XPARAMS + 1] := TIME.PARAMETER;
END;
49:;"<driverdefinecom --> DRIVER = <string> <nl> "
50:;"<assigncommand> --> ASSIGN <cr80adr> <hostno> <nl> "
51:;"<deassigncommand --> DEASSIGN <nl> "
52:;"<createcommand> --> CREATE <protocol> <crid> <speed> <maxpacket> <nl> "
53:;"<dismantlecomman --> DISMANTLE <crid> <nl> "
54:;"<readcommand> --> READ <readparams> <nl> "
55:;"<initreadcommand --> INITREAD <readparams> <nl> "
56: "<readparams> --> <crid> <noofbytes> EXPECT PATTERN <patternno> "
BEGIN
DATA_EXPECTED := TRUE;
END;
57: " --> <crid> <noofbytes> "
BEGIN
DATA_EXPECTED := FALSE;
END;
58:;"<appendcommand> --> APPEND <appendparams> <nl> "
59:;"<initappendcomma --> INITAPPEND <appendparams> <nl> "
60:;"<appendparams> --> <crid> <noofbytes> PATTERN <patternno> "
61: " --> <crid> <noofbytes> ( <integers> ) "
BEGIN
PATTERNNO.VARIABLE := FALSE;
PATTERNNO.PARAMETER := 0;
END;
62, "<integers> --> <integers> <integer> "
63: " --> <integer> "
BEGIN
NO_OF_INTEGERS := SUCC(NO_OF_INTEGERS);
INTEGERS[NO_OF_INTEGERS] := CONSTANT;
END;
64:;"<integer> --> <constant> "
65: "<consolecommand> --> CONSOLE IN <nl> "
BEGIN
CODE[CCP] := CONSOLE_IN_CMD;
CODE[CCP + XVARMASK] := 0;
CODE[CCP + XPARAMS ] := 0;
END;
66: " --> CONSOLE OUT <nl> "
BEGIN
CODE[CCP] := CONSOLE_OUT_CMD;
CODE[CCP + XVARMASK] := 0;
CODE[CCP + XPARAMS ] := 0;
END;
67:;"<definecommand> --> DEFINE PATTERN <patternno> = <pattern> <nl> "
68: "<dumpcommand> --> DUMP BUFFER <bufferno> FROM <startaddr> <nl> "
BEGIN
ENDADDR.VARIABLE := FALSE;
ENDADDR.PARAMETER := MAX_BUFFER_SIZE + 1;
PATTERNNO.VARIABLE := FALSE;
PATTERNNO.PARAMETER := 0;
END;
69: "<dumpcommand> --> DUMP BUFFER <bufferno> FROM <startaddr> TO <endaddr> <nl> "
BEGIN
PATTERNNO.VARIABLE := FALSE;
PATTERNNO.PARAMETER := 0;
END;
70: "<dumpcommand> --> DUMP PATTERN <patternno> <nl> "
BEGIN
STARTADDR.VARIABLE := FALSE;
STARTADDR.PARAMETER := 0;
ENDADDR := STARTADDR;
END;
71:;"<delaycommand> --> DELAY <time> <nl> "
72:;"<listcommand> --> LIST OPERATIONS <nl> "
73: "<cancelcommand> --> CANCEL CRID <crid> <nl> "
BEGIN
OPREF.VARIABLE := FALSE;
OPREF.PARAMETER := 0;
END;
74: "<cancelcommand> --> CANCEL OPERATION <opref> <nl> "
BEGIN
CRID.VARIABLE := FALSE;
CRID.PARAMETER := 0;
END;
75:;"<waitinitcommand> --> WAITINIT <time> <nl> "
76: "<cr80adr> --> <const_or_var> "
CR80ADR := ANY;
77: "<hostno> --> <const_or_var> "
HOSTNO := ANY;
78: "<protocol> --> <const_or_var> "
PROTOCOL := ANY;
79: "<crid> --> <const_or_var> "
CRID := ANY;
80: "<noofbytes> --> <const_or_var> "
NOOFBYTES := ANY;
81: "<speed> --> <const_or_var> "
SPEED := ANY;
82: "<maxpacket> --> <const_or_var> "
MAXPACKET := ANY;
83: "<patternno> --> <const_or_var> "
PATTERNNO := ANY;
84: "<bufferno> --> <const_or_var> "
BUFFERNO := ANY;
85: "<startaddr> --> <const_or_var> "
STARTADDR := ANY;
86: "<endaddr> --> <const_or_var> "
ENDADDR := ANY;
87: "<opref> --> <const_or_var> "
OPREF := ANY;
88: "<time> --> <const_or_var> "
TIME := ANY;
89: "<const_or_var> --> <identifier> "
BEGIN
ANY.VARIABLE := TRUE;
PARAMNAME := ' ';
I := 0;
REPEAT
I := SUCC(I);
PARAMNAME[I] := IDENTIFIER.STRING[I - 1];
UNTIL (I = IDENTIFIER.LENGTH) OR (I = 16);
I := GET_PARAM_INDEX(PARAMNAME);
IF I <> UNDECLARED THEN
BEGIN
ANY.PARAMETER := I;
END
ELSE
BEGIN
WRITETEXT('*** UNDECLARED PARAMETER ***(:0:)');
WRITENL;
IGNORE_REST_OF_LINE := TRUE;
END;
END;
90: " --> <constant> "
BEGIN
ANY.VARIABLE := FALSE;
ANY.PARAMETER := CONSTANT;
END;
91: "<nl> --> (:10:) "
BEGIN
ACTPARAMETERCOUNT := 0;
IGNORE_REST_OF_LINE := FALSE;
END;
92: "<pattern> --> <integers> "
; "DO NOTHING, PATTERN ALREADY IN 'INTEGERS'"
93: " --> <string> "
BEGIN
I := STRING.LENGTH + STRING.LENGTH MOD 2;
PACK(STRING.STRING[0], INTEGERS[1], I);
NO_OF_INTEGERS := I DIV 2;
END;
94: "<dump_at_completion> --> DUMP "
BEGIN
DUMP_AT_COMPLETION := TRUE;
END;
95: "<dump_at_completion> --> " "empty"
BEGIN
DUMP_AT_COMPLETION := FALSE;
END
END; " CASE "
END; " SEMANTICS " «a5»