Updated PDP-10 diagnostic README
This commit is contained in:
parent
d2bb577bfd
commit
e1e11b3b2d
4 changed files with 213 additions and 8 deletions
|
|
@ -12,18 +12,216 @@ machines:
|
||||||
PDP-10 KA10 BASIC INSTRUCTION DIAGNOSTIC
|
PDP-10 KA10 BASIC INSTRUCTION DIAGNOSTIC
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
|
|
||||||
The **PDP-10 KA10 BASIC INSTRUCTION DIAGNOSTIC** ([DAKAD.MAC](DAKAD.MAC)), as extracted from the
|
The *PDP-10 KA10 BASIC INSTRUCTION DIAGNOSTIC* (MAINDEC-10-DAKAD-B-D) test code has been extracted from [DAKAD.MAC](DAKAD.MAC)
|
||||||
[original file](http://pdp-10.trailing-edge.com/klad_sources/01/klad.sources/dakaam.mac.html), is shown below,
|
[[original file](http://pdp-10.trailing-edge.com/klad_sources/01/klad.sources/dakaam.mac.html)] and is shown below,
|
||||||
along with a [PDP-10 Test Machine with Debugger](/devices/pdp10/machine/ka10/test/debugger/).
|
along with a [PDP-10 Test Machine with Debugger](/devices/pdp10/machine/ka10/test/debugger/).
|
||||||
|
|
||||||
The Debugger command `a 100 /apps/pdp10/tapes/diags/klad/dakad/TEST.MAC`
|
The Debugger command `a 100 /apps/pdp10/tapes/diags/klad/dakad/TEST.MAC`
|
||||||
can be used to test the new [MACRO-10](http://archive.pcjs.org/pubs/dec/pdp10/tops10/02_1973AsmRef_macro.pdf)
|
can be used to test the new [Mini MACRO-10](http://archive.pcjs.org/pubs/dec/pdp10/tops10/02_1973AsmRef_macro.pdf)
|
||||||
work-alike assembler being added to the PDP-10 Emulator.
|
assembler being added to the PDP-10 Emulator.
|
||||||
|
|
||||||
{% include machine.html id="testka10" %}
|
{% include machine.html id="testka10" %}
|
||||||
|
|
||||||
More information about MAINDEC-10-DAKAD-B-D:
|
---
|
||||||
|
|
||||||
|
DAKAD.TXT
|
||||||
|
---------
|
||||||
|
|
||||||
|
```
|
||||||
|
MAINDEC-10-DAKAD.TXT
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
IDENTIFICATION
|
||||||
|
--------------
|
||||||
|
|
||||||
|
PRODUCT CODE: MAINDEC-10-DAKAD-B-D
|
||||||
|
|
||||||
|
PRODUCT NAME: DECSYSTEM10 PDP-10 KA10 BASIC
|
||||||
|
INSTRUCTION DIAGNOSTIC (4)
|
||||||
|
|
||||||
|
FUNCTION: REGISTER ADDRESSING, PC CHANGE, XCT
|
||||||
|
|
||||||
|
VERSION: 0.2
|
||||||
|
|
||||||
|
DATE RELEASED: JANUARY 1977
|
||||||
|
|
||||||
|
MAINTAINED BY: DIAGNOSTIC ENGINEERING GROUP
|
||||||
|
|
||||||
|
AUTHOR: JOHN R. KIRCHOFF
|
||||||
|
|
||||||
|
COPYRIGHT(C) 1976,1977
|
||||||
|
DIGITAL EQUIPMENT CORPORATION
|
||||||
|
MARLBORO, MASS. 01752
|
||||||
|
|
||||||
|
THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY
|
||||||
|
ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH
|
||||||
|
THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE,
|
||||||
|
OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE
|
||||||
|
MADE AVAILABLE TO ANY OTHER PERSON EXECPT FOR USE ON SUCH SYSTEM
|
||||||
|
AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE TO AND
|
||||||
|
OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
|
||||||
|
|
||||||
|
THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT
|
||||||
|
NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL
|
||||||
|
EQUIPMENT CORPORATION.
|
||||||
|
|
||||||
|
DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
|
||||||
|
SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
|
||||||
|
MAINDEC-10-DAKAD.TXT
|
||||||
|
PAGE 2
|
||||||
|
|
||||||
|
|
||||||
|
TABLE OF CONTENTS
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
1.0 ABSTRACT
|
||||||
|
|
||||||
|
2.0 REQUIREMENTS
|
||||||
|
|
||||||
|
2.1 EQUIPMENT
|
||||||
|
|
||||||
|
2.2 STORAGE
|
||||||
|
|
||||||
|
2.3 PRELIMINARY PROGRAMS
|
||||||
|
|
||||||
|
3.0 PROGRAM PROCEDURES
|
||||||
|
|
||||||
|
3.1 LOADING PROCEDURE
|
||||||
|
|
||||||
|
3.2 STARTING PROCEDURE
|
||||||
|
|
||||||
|
3.3 OPERATING PROCEDURE
|
||||||
|
|
||||||
|
4.0 ERRORS
|
||||||
|
|
||||||
|
5.0 ITERATION COUNTER
|
||||||
|
|
||||||
|
6.0 CYCLE TIME
|
||||||
|
|
||||||
|
7.0 OPERATIONAL VARIATIONS
|
||||||
|
|
||||||
|
8.0 MISCELLANEOUS
|
||||||
|
|
||||||
|
9.0 LISTING
|
||||||
|
MAINDEC-10-DAKAD.TXT
|
||||||
|
PAGE 3
|
||||||
|
|
||||||
|
|
||||||
|
1.0 ABSTRACT
|
||||||
|
|
||||||
|
THIS PDP-10 KA10 BASIC INSTRUCTION DIAGNOSTIC IS THE
|
||||||
|
FOURTH IN A SERIES OF PDP-10 KA10 PROCESSOR DIAGNOSTICS.
|
||||||
|
THE DIAGNOSTIC TESTS REGISTER ADDRESSING, JFCL, AR FLAGS,
|
||||||
|
AOS, SOS, JRST, AOBJX, JSP, XCT, INDIRECT AND
|
||||||
|
INDEXED ADDRESSING.
|
||||||
|
|
||||||
|
2.0 REQUIREMENTS
|
||||||
|
|
||||||
|
2.1 EQUIPMENT
|
||||||
|
|
||||||
|
A PDP-10 KA10 WITH A MINIMUM OF 32K OF MEMORY
|
||||||
|
|
||||||
|
PAPER-TAPE READER
|
||||||
|
DECTAPE (OPTIONAL)
|
||||||
|
CONSOLE TELETYPE
|
||||||
|
|
||||||
|
2.2 STORAGE
|
||||||
|
|
||||||
|
THE PROGRAM RUNS WITHIN 32K OF MEMORY.
|
||||||
|
|
||||||
|
2.3 PRELIMINARY PROGRAMS
|
||||||
|
|
||||||
|
CONSOLE FUNCTIONS WORKING PROPERLY
|
||||||
|
PAPER-TAPE OR DECTAPE READ-IN WORKING PROPERLY
|
||||||
|
PREVIOUS PROCESSOR DIAGNOSTICS
|
||||||
|
MAINDEC-10-DAKAD.TXT
|
||||||
|
PAGE 4
|
||||||
|
|
||||||
|
|
||||||
|
3.0 PROGRAM PROCEDURES
|
||||||
|
|
||||||
|
3.1 LOADING PROCEDURE
|
||||||
|
|
||||||
|
PAPER TAPE - HARDWARE READ-IN (READER DEVICE CODE 104)
|
||||||
|
DECTAPE - LOAD WITH DIAMON (DECTAPE DEVICE CODE 320)
|
||||||
|
|
||||||
|
3.2 STARTING PROCEDURE
|
||||||
|
|
||||||
|
STAND-ALONE STARTING ADDRESS IS 30000.
|
||||||
|
|
||||||
|
IF THE DIAGNOSTIC FAILS TO START CORRECTLY TRY STARTING AT THE
|
||||||
|
FIRST TEST INSTEAD OF AT THE BEGINNING OF THE CONTROL SEQUENCE.
|
||||||
|
(SEE LISTING).
|
||||||
|
|
||||||
|
3.3 OPERATING PROCEDURE
|
||||||
|
|
||||||
|
ONCE STARTED THE PROGRAM WILL CYCLE CONTINUALLY UNTIL STOPPED
|
||||||
|
OR AN ERROR OCCURS.
|
||||||
|
|
||||||
|
4.0 ERRORS
|
||||||
|
|
||||||
|
ERRORS ARE IN THE FORM OF HALT INSTRUCTIONS. THE LISTING
|
||||||
|
SHOULD BE CONSULTED TO DETERMINE THE CAUSE OF THE ERROR. A
|
||||||
|
NO OPERATION (JUMP) INSTRUCTION FOLLOWS EACH HALT. THIS
|
||||||
|
MAY BE USEFUL IN CONSTRUCTING A SCOPE LOOP TO CYCLE ON THE
|
||||||
|
FAILING INSTRUCTION.
|
||||||
|
|
||||||
|
5.0 ITERATION COUNTER
|
||||||
|
|
||||||
|
THE ITERATION COUNT OF THE PROGRAM IS DISPLAYED IN THE MEM-
|
||||||
|
ORY INDICATORS (MI). THIS COUNT IS A DECREMENTING COUNT AND
|
||||||
|
INITIALLY STARTS AT -1 IN STAND-ALONE OPERATION.
|
||||||
|
|
||||||
|
6.0 CYCLE TIME
|
||||||
|
|
||||||
|
THE CYCLE TIME OF THE PROGRAM IS IN THE MILLISECOND RANGE AND
|
||||||
|
IS THEREFORE SUITABLE FOR TAKING MARGINS, VIBRATION TESTS, ETC.
|
||||||
|
|
||||||
|
MAINDEC-10-DAKAD.TXT
|
||||||
|
PAGE 5
|
||||||
|
|
||||||
|
|
||||||
|
7.0 OPERATIONAL VARIATIONS
|
||||||
|
|
||||||
|
A. DIAGNOSTIC MONITOR
|
||||||
|
|
||||||
|
THE PROGRAM IS USABLE WITH THE DIAGNOSTIC MONITOR TO PRO-
|
||||||
|
VIDE RELIABILITY TESTS, ACCEPTANCE TESTS, AND/OR TO PRO-
|
||||||
|
VIDE A QUICK METHOD OF ISOLATION OF A FAULT TO A PARTICULAR
|
||||||
|
AREA OF THE PROCESSOR. CERTAIN PROCEDURES ARE USED WHEN
|
||||||
|
THE PROGRAM IS USED IN THIS MANNER. THEY ARE:
|
||||||
|
|
||||||
|
1. THE DIAGNOSTIC MONITOR TRANSFERS CONTROL TO THE PRO-
|
||||||
|
GRAM AND STARTS IT AT LOCATION 30002.
|
||||||
|
|
||||||
|
2. MONCTL - LOCATION 30043 IS USED AS THE DIAGNOSTIC MON-
|
||||||
|
ITOR CONTROL FLAG WORD.
|
||||||
|
|
||||||
|
B. USER MODE
|
||||||
|
|
||||||
|
THE PROGRAM WILL OPERATE IN USER MODE AND AS SUCH PROVIDES
|
||||||
|
ASSURANCE THAT THE PROCESSOR IS PERFORMING ALL FUNCTIONS
|
||||||
|
CORRECTLY. USER MODE STARTING ADDRESS IS 30000.
|
||||||
|
|
||||||
|
C. SYSTEM EXERCISER
|
||||||
|
|
||||||
|
STARTING ADDRESS IS 30003. NO DATA SWITCHES ARE USED BY
|
||||||
|
THIS PROGRAM.
|
||||||
|
|
||||||
|
8.0 MISCELLANEOUS
|
||||||
|
|
||||||
|
NONE
|
||||||
|
|
||||||
|
9.0 LISTING
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
DAKAD.MAC
|
||||||
|
---------
|
||||||
|
|
||||||
```
|
```
|
||||||
SUBTTL DIAGNOSTIC PARAMETERS
|
SUBTTL DIAGNOSTIC PARAMETERS
|
||||||
|
|
|
||||||
|
|
@ -2479,7 +2479,11 @@ class DebuggerPDP10 extends Debugger {
|
||||||
bus.setWordDirect(addr, w);
|
bus.setWordDirect(addr, w);
|
||||||
nWords++;
|
nWords++;
|
||||||
});
|
});
|
||||||
this.println(nWords + " words loaded at " + this.toStrBase(addrLoad) + '-' + this.toStrBase(addrLoad + nWords - (nWords?1:0)));
|
if (!nWords) {
|
||||||
|
this.println("no data");
|
||||||
|
} else {
|
||||||
|
this.println(nWords + " words loaded at " + this.toStrBase(addrLoad) + '-' + this.toStrBase(addrLoad + nWords - 1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -2578,7 +2582,7 @@ class DebuggerPDP10 extends Debugger {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var addrLoad = dbgAddr.addr;
|
var addrLoad = dbgAddr.addr;
|
||||||
var sOptions = ""; // "p";
|
var sOptions = ""; // add "p" for preprocessing only
|
||||||
this.macro10 = new Macro10(match[2], addrLoad, sOptions, dbg, function doneMacro10(nErrorCode, sURL) {
|
this.macro10 = new Macro10(match[2], addrLoad, sOptions, dbg, function doneMacro10(nErrorCode, sURL) {
|
||||||
if (!nErrorCode) {
|
if (!nErrorCode) {
|
||||||
dbg.loadBin(dbg.macro10.getBin(), addrLoad);
|
dbg.loadBin(dbg.macro10.getBin(), addrLoad);
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,9 @@ class Macro10 {
|
||||||
/**
|
/**
|
||||||
* Macro10(sURL, nAddr, sOptions, dbg, done)
|
* Macro10(sURL, nAddr, sOptions, dbg, done)
|
||||||
*
|
*
|
||||||
|
* A "mini" version of DEC's MACRO-10 assembler, with just enough features to support the handful
|
||||||
|
* of DEC diagnostic source code files that we choose to throw at it.
|
||||||
|
*
|
||||||
* Requests the resource(s) specified by sURL; multiple resources can be requested by separating
|
* Requests the resource(s) specified by sURL; multiple resources can be requested by separating
|
||||||
* them with semicolons.
|
* them with semicolons.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -200,7 +200,7 @@ function hg(a,b){for(var c=1;c<b.length;c++)gg(a,b,c);return b.length-1}function
|
||||||
function Vc(a,b,c,d,e){var f=!1;if(!a.sa++)for(var g=1;!f&&g<d.length;g++){var h=d[g];if(!e||h.ja)for(var k=Ve(h)&(d==a.b?65535:-1),n=0;n<c;n++)if(b+n==k){var p,f=!0;h.ja&&(eg(a,d,h,!0),e=!0);if(p=h.tb){for(var f=!1,t=0;t<p.length;t++)if(!ig(a,p[t],!0)){if(p[t].indexOf("if")){f=!0;break}for(var D=t+1;D<p.length&&p[D].indexOf("else");D++)t++;if(D==p.length){f=!0;break}}a.v.A.N||(f=!0)}if(f){e||gg(a,d,g,"hit");break}}}a.sa--;return f}
|
function Vc(a,b,c,d,e){var f=!1;if(!a.sa++)for(var g=1;!f&&g<d.length;g++){var h=d[g];if(!e||h.ja)for(var k=Ve(h)&(d==a.b?65535:-1),n=0;n<c;n++)if(b+n==k){var p,f=!0;h.ja&&(eg(a,d,h,!0),e=!0);if(p=h.tb){for(var f=!1,t=0;t<p.length;t++)if(!ig(a,p[t],!0)){if(p[t].indexOf("if")){f=!0;break}for(var D=t+1;D<p.length&&p[D].indexOf("else");D++)t++;if(D==p.length){f=!0;break}}a.v.A.N||(f=!0)}if(f){e||gg(a,d,g,"hit");break}}}a.sa--;return f}
|
||||||
function jg(a,b){b=void 0===b?!0:b;for(var c="",d=0;16>d;d++){!d||d&3||(c+="\n");var e=a,f=m(d,2);We(e.Ba,d);f+="="+J(e,e.Ha(e.Ba),36)+" ";c+=f}if(b){b="";for(d=0;d<df.length;d++)(e=df[d]||"")&&(e+="="+J(a,a.lb(d),d>=hf?1:d==ff?23:18)+" "),b+=e;c+="\n"+b}return c}l.zb=function(a,b){return a[0]>b[0]?1:a[0]<b[0]?-1:0};
|
function jg(a,b){b=void 0===b?!0:b;for(var c="",d=0;16>d;d++){!d||d&3||(c+="\n");var e=a,f=m(d,2);We(e.Ba,d);f+="="+J(e,e.Ha(e.Ba),36)+" ";c+=f}if(b){b="";for(d=0;d<df.length;d++)(e=df[d]||"")&&(e+="="+J(a,a.lb(d),d>=hf?1:d==ff?23:18)+" "),b+=e;c+="\n"+b}return c}l.zb=function(a,b){return a[0]>b[0]?1:a[0]<b[0]?-1:0};
|
||||||
function Ae(a,b,c,d,e){var f=[],g;for(g in e){var h=e[g];"number"==typeof h&&(e[g]=h={o:h});var k=h.o,n=h.a;if(void 0!==k){var p=f,k=[k>>>0,g],t=Ea(p,k,a.zb);0>t&&p.splice(-(t+1),0,k)}n&&(h.a=n.replace(/''/g,'"'))}a.F.push({sd:b,B:c,Ob:d,U:e,ub:f})}function kg(a,b,c){var d=[],e=Ve(b)>>>0;for(b=0;b<a.F.length;b++){var f=a.F[b],g=f.B>>>0,h=f.Ob;if(e>=g&&e<g+h){e=Ea(f.ub,[e-g],a.zb);0<=e?lg(a,b,e,d):c&&(e=~e,lg(a,b,e-1,d),lg(a,b,e,d));break}}return d}
|
function Ae(a,b,c,d,e){var f=[],g;for(g in e){var h=e[g];"number"==typeof h&&(e[g]=h={o:h});var k=h.o,n=h.a;if(void 0!==k){var p=f,k=[k>>>0,g],t=Ea(p,k,a.zb);0>t&&p.splice(-(t+1),0,k)}n&&(h.a=n.replace(/''/g,'"'))}a.F.push({sd:b,B:c,Ob:d,U:e,ub:f})}function kg(a,b,c){var d=[],e=Ve(b)>>>0;for(b=0;b<a.F.length;b++){var f=a.F[b],g=f.B>>>0,h=f.Ob;if(e>=g&&e<g+h){e=Ea(f.ub,[e-g],a.zb);0<=e?lg(a,b,e,d):c&&(e=~e,lg(a,b,e-1,d),lg(a,b,e,d));break}}return d}
|
||||||
function mg(a,b,c){var d=0,e=a.G;b.forEach(function(a,b){vc(e,b,a);d++});a.j(d+" words loaded at "+J(a,c)+"-"+J(a,c+d-(d?1:0)))}function lg(a,b,c,d){var e={},f=a.F[b].ub,g=0,h=null;0<=c&&c<f.length&&(g=f[c][0],h=f[c][1]);h&&(e=a.F[b].U[h],h="."==h.charAt(0)?null:e.l||h);d.push(h);d.push(g);d.push(e.a);d.push(e.c)}
|
function mg(a,b,c){var d=0,e=a.G;b.forEach(function(a,b){vc(e,b,a);d++});d?a.j(d+" words loaded at "+J(a,c)+"-"+J(a,c+d-1)):a.j("no data")}function lg(a,b,c,d){var e={},f=a.F[b].ub,g=0,h=null;0<=c&&c<f.length&&(g=f[c][0],h=f[c][1]);h&&(e=a.F[b].U[h],h="."==h.charAt(0)?null:e.l||h);d.push(h);d.push(g);d.push(e.a);d.push(e.c)}
|
||||||
function ng(a,b){var c=$e(a,b[1],a.ba);if(c){var d=b[2];if(void 0==d)a.j("begin assemble at "+J(a,c.B)),a.R=!0,I(a.H);else{var e=d.match(/^(['"]?)((\/|http:).*)\1$/);if(e)if(a.pa)a.j("assembly already in progress");else{var f=c.B;a.pa=new og(e[2],f,"",a,function(b,c){b?a.j("error ("+b+") processing "+c):mg(a,a.pa.w,f);a.pa=null})}else b.shift(),b.shift(),b.shift(),b=Cf(a,d,b.join(""),c.B||0),0<=b&&(a.rb(c,b),a.j(uf(a,c)))}}}
|
function ng(a,b){var c=$e(a,b[1],a.ba);if(c){var d=b[2];if(void 0==d)a.j("begin assemble at "+J(a,c.B)),a.R=!0,I(a.H);else{var e=d.match(/^(['"]?)((\/|http:).*)\1$/);if(e)if(a.pa)a.j("assembly already in progress");else{var f=c.B;a.pa=new og(e[2],f,"",a,function(b,c){b?a.j("error ("+b+") processing "+c):mg(a,a.pa.w,f);a.pa=null})}else b.shift(),b.shift(),b.shift(),b=Cf(a,d,b.join(""),c.B||0),0<=b&&(a.rb(c,b),a.j(uf(a,c)))}}}
|
||||||
function pg(a,b){var c=b.match(/^\s*([A-Z_]?[A-Z0-9_]*)\s*(=?)\s*(.*)$/i);if(c){if(!c[1])return Qe(a)||a.j("no variables"),!0;if(!c[2])return Qe(a,c[1]);if(!c[3])return delete a.K[c[1]],!0;b=X(a,c[3]);return void 0!==b?(a.K[c[1]]=b,!0):!1}a.j("invalid assignment:"+b);return!1}
|
function pg(a,b){var c=b.match(/^\s*([A-Z_]?[A-Z0-9_]*)\s*(=?)\s*(.*)$/i);if(c){if(!c[1])return Qe(a)||a.j("no variables"),!0;if(!c[2])return Qe(a,c[1]);if(!c[3])return delete a.K[c[1]],!0;b=X(a,c[3]);return void 0!==b?(a.K[c[1]]=b,!0):!1}a.j("invalid assignment:"+b);return!1}
|
||||||
function qg(a,b,c){var d=null;if(b=$e(a,b)){var e=kg(a,b,!0);if(e.length){var f,g;e[0]&&(g="",(f=b.B-e[1])&&(g=" + "+q(f,4,!0)),f=e[0]+" ("+J(a,e[1])+")"+g,c&&a.j(f),d=f);4<e.length&&e[4]&&(g="",(f=e[5]-b.B)&&(g=" - "+q(f,4,!0)),f=e[4]+" ("+J(a,e[5])+")"+g,c&&a.j(f),d||(d=f))}else c&&a.j("no symbols")}return d}
|
function qg(a,b,c){var d=null;if(b=$e(a,b)){var e=kg(a,b,!0);if(e.length){var f,g;e[0]&&(g="",(f=b.B-e[1])&&(g=" + "+q(f,4,!0)),f=e[0]+" ("+J(a,e[1])+")"+g,c&&a.j(f),d=f);4<e.length&&e[4]&&(g="",(f=e[5]-b.B)&&(g=" - "+q(f,4,!0)),f=e[4]+" ("+J(a,e[5])+")"+g,c&&a.j(f),d||(d=f))}else c&&a.j("no symbols")}return d}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue