|
|
1.1 root 1: #define disp_error error
2:
3: /* constants definition for SBWC instruction */
4: /* */
5: /* */
6:
7: #define SBWC 0x9d /*opcode */
8:
9: asm(".set PSWMASK,0xf");
10:
11: #define MAX_PATTERNS 10
12:
13: extern long scoplp;
14: extern long force_lp;
15:
16: #define DIF1 0x7fffffff /*initial value of dif */
17: #define DIF2 0x7fffffff
18: #define DIF3 0x80000000
19: #define DIF4 0x80000000
20: #define DIF5 0
21: #define DIF6 0
22: #define DIF7 -1
23: #define DIF8 0x80000000
24: #define DIF9 0
25: #define DIF10 0x7fffffff
26:
27: #define SUB1 0x80000002 /*initial values for sub*/
28: #define SUB2 0x80000001
29: #define SUB3 -1
30: #define SUB4 -1
31: #define SUB5 1
32: #define SUB6 -1
33: #define SUB7 1
34: #define SUB8 1
35: #define SUB9 0x80000000
36: #define SUB10 -1
37:
38:
39: #define EXP1 0xfffffffd /*expected result */
40: #define EXP2 0xfffffffd
41: #define EXP3 0x80000000
42: #define EXP4 0x80000001
43: #define EXP5 0xfffffffe
44: #define EXP6 1
45: #define EXP7 0xfffffffe
46: #define EXP8 0x7ffffffe
47: #define EXP9 0x80000000
48: #define EXP10 0x7fffffff
49:
50: #define IPSW1 5 /*initial psw */
51: #define IPSW2 4
52: #define IPSW3 6
53: #define IPSW4 7
54: #define IPSW5 6
55: #define IPSW6 11
56: #define IPSW7 11
57: #define IPSW8 12
58: #define IPSW9 13
59: #define IPSW10 4
60:
61: /* EXPECTED PSW */
62:
63: #define EPSW1 2
64: #define EPSW2 2
65: #define EPSW3 8
66: #define EPSW4 8
67: #define EPSW5 8
68: #define EPSW6 0
69: #define EPSW7 9
70: #define EPSW8 11
71: #define EPSW9 2
72: #define EPSW10 0
73:
74: #define ERROR1 1 /*error definitions */
75: #define ERROR2 2
76: #define ERROR3 3
77:
78:
79: #define EM1 "difference not equal to expected \n"
80: #define EM2 "subtrahend operand altered \n"
81: #define EM3 "psw not equal to expected \n"
82:
83:
84: /* standard definition file */
85: /* for 'C' diagnostic porgrams. */
86: /* */
87: /* */
88: #define HIGH 31
89: #define IPL 8
90: #define PSWMASK 0xf
91: #define T 16
92: #define IV 32
93: #define FU 64
94: #define DV 128
95: #define FLAGS 0x0000000f
96:
97:
98:
99:
100:
101:
102:
103: /* Global variables for subtract with carry test */
104: /* */
105: /* */
106:
107: static short index = 0;
108: static long dif = 0; /* destination location */
109: static long sub = 0; /*subtrahend location */
110: static long psw; /*processor status word */
111: static long error_count = 0;
112:
113: /*initial flag values */
114: static long i_psw[MAX_PATTERNS] = {IPSW1,IPSW2,IPSW3,IPSW4,IPSW5,IPSW6,
115: IPSW7,IPSW8,IPSW9,IPSW10};
116: /*expected flag values */
117: static long exp_psw[MAX_PATTERNS] = {EPSW1,EPSW2,EPSW3,EPSW4,EPSW5,EPSW6,
118: EPSW7,EPSW8,EPSW9,EPSW10};
119: /* expected destination */
120: static long exp[MAX_PATTERNS] = {EXP1,EXP2,EXP3,EXP4,EXP5,EXP6,EXP7,
121: EXP8,EXP9,EXP10};
122: /*dif values */
123: static long d[MAX_PATTERNS] = {DIF1,DIF2,DIF3,DIF4,DIF5,DIF6,DIF7,
124: DIF8,DIF9,DIF10};
125: /*sub values */
126: static long s[MAX_PATTERNS] = {SUB1,SUB2,SUB3,SUB4,SUB5,SUB6,SUB7,
127: SUB8,SUB9,SUB10};
128: static long savvec4;
129: static long old_psw;
130:
131: sbwc()
132: {
133: asm("movl $2,_no_opr");
134: for (index = 0; index < MAX_PATTERNS; index++) t_sbwc();
135: asm("jmp *return");
136: }
137:
138: static t_sbwc()
139: {
140:
141: long ix;
142: for (ix=1;ix<5;ix++)
143:
144: if (ix==1){
145: setjmp();
146: asm("s1: movab s1,_stpc");
147: asm("movl $1,_subtst");
148: dif = d[index]; /*initialize dif, subtrahend, & psw */
149: sub = s[index];
150: asm("movw _index,r11");
151: asm("shll $16,_i_psw[r11],_savvec4");
152: asm("bicpsw $PSWMASK");
153: asm("bispsw _savvec4");
154: asm("movpsl _old_psw");
155: /*execute sbwc instruction */
156: asm("sbwc _sub,_dif"); /* mem to mem */
157: asm("movpsl _psw"); /*save psw */
158: psw &= FLAGS; /*mask out all bits except flag bits */
159: }
160: if (ix==2){
161: setjmp();
162: asm("s2: movab s2,_stpc");
163: asm("movl $2,_subtst");
164: dif = d[index]; /*initialize dif, subtrahend, & psw */
165: sub = s[index];
166: asm("movw _index,r11");
167: asm("shll $16,_i_psw[r11],_savvec4");
168: asm("movl _sub,r6"); /* load source reg */
169: asm("movl _dif,r7"); /* load dest reg */
170: asm("bicpsw $PSWMASK");
171: asm("bispsw _savvec4");
172: asm("movpsl _old_psw");
173: /*execute sbwc instruction */
174: asm("sbwc r6,r7"); /* reg to reg */
175: asm("movpsl _psw"); /*save psw */
176: asm("movl r7,_dif"); /* load dest reg */
177: psw &= FLAGS; /*mask out all bits except flag bits */
178: }
179: if (ix==3){
180: setjmp();
181: asm("s3: movab s3,_stpc");
182: asm("movl $3,_subtst");
183: dif = d[index]; /*initialize dif, subtrahend, & psw */
184: sub = s[index];
185: asm("movw _index,r11");
186: asm("movl _sub,r6"); /* load source reg */
187: asm("shll $16,_i_psw[r11],_savvec4");
188: asm("bicpsw $PSWMASK");
189: asm("bispsw _savvec4");
190: asm("movpsl _old_psw");
191: /*execute sbwc instruction */
192: asm("sbwc r6,_dif"); /* reg to memory */
193: asm("movpsl _psw"); /*save psw */
194: psw &= FLAGS; /*mask out all bits except flag bits */
195: }
196: if (ix==4){
197: setjmp();
198: asm("s4: movab s4,_stpc");
199: asm("movl $4,_subtst");
200: dif = d[index]; /*initialize dif, subtrahend, & psw */
201: sub = s[index];
202: asm("movw _index,r11");
203: asm("movl _dif,r7"); /* load dest reg */
204: asm("shll $16,_i_psw[r11],_savvec4");
205: asm("bicpsw $PSWMASK");
206: asm("bispsw _savvec4");
207: asm("movpsl _old_psw");
208: /*execute sbwc instruction */
209: asm("sbwc _sub,r7");/* mem to reg */
210: asm("movpsl _psw"); /*save psw */
211: asm("movl r7,_dif"); /* load dest reg */
212: psw &= FLAGS; /*mask out all bits except flag bits */
213: }
214: if (dif != exp[index])
215: {
216: asm("movl $1,_ercode");
217: if (scoplp) longjmp();
218: disp_error(dif,exp[index],s[index],d[index]);
219: }
220: if (sub != s[index])
221: {
222: asm("movl $3,_ercode");
223: if (scoplp) longjmp();
224: disp_error(sub,s[index],s[index],d[index]);
225: }
226: if (psw != exp_psw[index])
227: {
228: asm("movl $2,_ercode");
229: if (scoplp) longjmp();
230: disp_error(psw,exp_psw[index],s[index],d[index]);
231: }
232: else
233: if (force_lp) longjmp();
234: return(0); /*no error exit*/
235: }
236:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.