|
|
1.1 ! root 1: #define error_hdl1 error ! 2: #define error_str error ! 3: ! 4: #define C 0x1 ! 5: #define V 0x2 ! 6: #define Z 0x4 ! 7: #define N 0x8 ! 8: ! 9: extern long scoplp; ! 10: extern long force_lp; ! 11: ! 12: /* MOVS2, MOVS3 instruction */ ! 13: ! 14: #define MAXLINE 500 ! 15: #define MAXBYTE 95 ! 16: #define NULL (char)0 ! 17: ! 18: /* Some global variables */ ! 19: static long flag_msk, psl, len, r2; ! 20: static char *s_str, srcstr[MAXLINE], d_str[MAXLINE], *r0, *r1; ! 21: ! 22: movstr() ! 23: { ! 24: asm("movl $3,_no_opr"); ! 25: movs2(); ! 26: movs3(); ! 27: asm("jmp *return"); ! 28: } ! 29: ! 30: ! 31: static movs2() ! 32: { ! 33: long no_op, exp_psw, ix, dummy; ! 34: char *exp_r0, *exp_r1, *cptr; ! 35: ! 36: no_op = 2; ! 37: len = 0; ! 38: dummy = 0; ! 39: ! 40: setjmp(); ! 41: asm("m1: movab m1,_stpc"); ! 42: asm("movl $1,_subtst"); ! 43: flag_msk = exp_psw = 0; ! 44: flag_msk = exp_psw = N|V|C; ! 45: s_str = "** this is a test of string copy **"; ! 46: exp_r0 = s_str + 35; ! 47: exp_r1 = d_str + 35; ! 48: movs(no_op,exp_r0,exp_r1,dummy,exp_psw); ! 49: ! 50: setjmp(); ! 51: asm("m2: movab m2,_stpc"); ! 52: asm("movl $2,_subtst"); ! 53: cptr = srcstr; ! 54: for(ix=0;ix<95;ix++) ! 55: *cptr++ = ' ' + ix; /* make a long string */ ! 56: *cptr = '\0'; ! 57: s_str = srcstr; ! 58: flag_msk = exp_psw = 0; ! 59: flag_msk = exp_psw = N|Z|V|C; ! 60: exp_r0 = s_str + 95; ! 61: exp_r1 = d_str + 95; ! 62: movs(no_op,exp_r0,exp_r1,dummy,exp_psw); ! 63: ! 64: setjmp(); ! 65: asm("m3: movab m3,_stpc"); ! 66: asm("movl $3,_subtst"); ! 67: flag_msk = exp_psw = 0; ! 68: flag_msk = exp_psw = Z; ! 69: s_str = "\0"; ! 70: exp_r0 = s_str; ! 71: exp_r1 = d_str; ! 72: movs(no_op,exp_r0,exp_r1,dummy,exp_psw); ! 73: } ! 74: ! 75: static movs3() ! 76: { ! 77: long no_op, exp_r2, ix, exp_psw; ! 78: char *exp_r0, *exp_r1, *cptr; ! 79: ! 80: no_op = 3; ! 81: ! 82: setjmp(); ! 83: asm("m4: movab m4,_stpc"); ! 84: asm("movl $4,_subtst"); ! 85: len = MAXBYTE; ! 86: cptr = srcstr; ! 87: for(ix=0;ix<len;ix++) ! 88: *cptr++ = ' ' + ix; /* make a long string */ ! 89: *cptr = '\0'; ! 90: s_str = srcstr; ! 91: flag_msk = exp_psw = 0; ! 92: flag_msk = exp_psw = N|V|C; ! 93: len = 35; ! 94: exp_r0 = s_str + len; ! 95: exp_r1 = d_str + len; ! 96: exp_r2 = 0; ! 97: movs(no_op,exp_r0,exp_r1,exp_r2,exp_psw); ! 98: ! 99: setjmp(); ! 100: asm("m5: movab m5,_stpc"); ! 101: asm("movl $5,_subtst"); ! 102: flag_msk = exp_psw = 0; ! 103: flag_msk = exp_psw = Z; ! 104: len = 0; ! 105: exp_r0 = s_str + len; ! 106: exp_r1 = d_str + len; ! 107: exp_r2 = 0; ! 108: movs(no_op,exp_r0,exp_r1,exp_r2,exp_psw); ! 109: ! 110: setjmp(); ! 111: asm("m6: movab m6,_stpc"); ! 112: asm("movl $6,_subtst"); ! 113: flag_msk = exp_psw = 0; ! 114: flag_msk = exp_psw = Z; ! 115: len = MAXBYTE + 10; ! 116: exp_r0 = s_str + MAXBYTE; ! 117: exp_r1 = d_str + len; ! 118: exp_r2 = 0; ! 119: movs(no_op,exp_r0,exp_r1,exp_r2,exp_psw); ! 120: ! 121: } ! 122: ! 123: ! 124: /* THIS ROUTINE EXECUTE MOVS2, MOVS3 INSTRUCTION */ ! 125: ! 126: static movs(no_op,exp_r0,exp_r1,exp_r2,exp_psw) ! 127: char *exp_r0, *exp_r1; ! 128: long no_op, exp_psw, exp_r2; ! 129: { ! 130: char *msg1, *msg2, savs[MAXLINE], *str, *cptr, *c1ptr; ! 131: long lenstr, len_op, ix, ierror, psw, n_flg; ! 132: ! 133: flag_msk = flag_msk << 16; ! 134: len_op = len; ! 135: for(;;) ! 136: { ! 137: ! 138: /* CLEAR DESTINATION STRING */ ! 139: cptr = d_str; ! 140: for (ix=0;ix<MAXLINE;ix++) { *cptr++ = '^'; savs[ix] = NULL; } ! 141: ! 142: /* SAVE SOURCE STRINGS */ ! 143: str = s_str; ! 144: n_flg = lenstr = 0; ! 145: cptr = savs; ! 146: for(;;) ! 147: { ! 148: *cptr = *str++; ! 149: if (*cptr == NULL) break; ! 150: cptr++; lenstr++; ! 151: } ! 152: if (lenstr >= len) n_flg++; ! 153: len = len_op; ! 154: ! 155: if (no_op == 2) ! 156: { ! 157: asm("movl _s_str,r0"); /* R0 : addr of source */ ! 158: asm("movab _d_str,r1"); /* R1 : addr of destination */ ! 159: asm("bicpsw $0xf"); /* clear all flags */ ! 160: asm("bispsw _flag_msk"); ! 161: asm(".globl _mvstr2"); ! 162: asm("_mvstr2:"); ! 163: asm("movs2"); ! 164: asm("movpsl _psl"); ! 165: asm("movl r0,_r0"); ! 166: asm("movl r1,_r1"); ! 167: } ! 168: else ! 169: { ! 170: asm("movl _s_str,r0"); /* R0 : addr of source */ ! 171: asm("movab _d_str,r1"); /* R1 : addr of destination */ ! 172: asm("movl _len,r2"); /* R2 : no of bytes to move */ ! 173: asm("bicpsw $0xf"); /* clear all flags */ ! 174: asm("bispsw _flag_msk"); ! 175: asm(".globl _mvstr3"); ! 176: asm("_mvstr3:"); ! 177: asm("movs3"); ! 178: asm("movpsl _psl"); ! 179: asm("movl r0,_r0"); ! 180: asm("movl r1,_r1"); ! 181: asm("movl r2,_r2"); ! 182: } ! 183: ! 184: psw = psl & 0xf; ! 185: ! 186: /* CHECK IF SOURCE GET CHANGED */ ! 187: ierror = 0; ! 188: if (no_op==3) lenstr = len; ! 189: cptr = s_str; ! 190: c1ptr = savs; ! 191: for(ix=0;ix<lenstr;ix++) ! 192: { if (*cptr++ != *c1ptr++) ! 193: { ierror++; ! 194: break; ! 195: } ! 196: if (*cptr == NULL) break; ! 197: } ! 198: if (ierror) ! 199: { ! 200: asm("movl $3,_ercode"); ! 201: if (scoplp) longjmp(); ! 202: error_str(*cptr-1,*c1ptr-1,s_str,savs); ! 203: } ! 204: ! 205: /* CHECK DESTINATION STRING */ ! 206: ierror = 0; ! 207: cptr = d_str; ! 208: c1ptr = savs; ! 209: for(ix=0;ix<lenstr;ix++) ! 210: { if (*c1ptr++ != *cptr++) ! 211: { ierror++; ! 212: break; ! 213: } ! 214: } ! 215: if (no_op==2) { if (d_str[ix]!='\0') ierror++; } ! 216: else ! 217: if (len==0) { if (d_str[0] != '^') ierror++; } ! 218: if (ierror) ! 219: { ! 220: asm("movl $1,_ercode"); ! 221: if (scoplp) longjmp(); ! 222: if (n_flg) { savs[lenstr] = d_str[lenstr] = '\0'; } ! 223: error_str(*cptr-1,*c1ptr-1,d_str,savs); ! 224: } ! 225: ! 226: ! 227: /* CHECK R0, R1 */ ! 228: if (r0 != exp_r0 ) ! 229: { ! 230: asm("movl $3,_ercode"); ! 231: if (scoplp) longjmp(); ! 232: error_hdl1(r0,exp_r0,s_str,d_str,len); ! 233: } ! 234: if (r1 != exp_r1 ) ! 235: { ! 236: asm("movl $3,_ercode"); ! 237: if (scoplp) longjmp(); ! 238: error_hdl1(r1,exp_r1,s_str,d_str,len); ! 239: } ! 240: if (psw != exp_psw) ! 241: { ! 242: asm("movl $3,_ercode"); ! 243: if (scoplp) longjmp(); ! 244: error_hdl1(psw,exp_psw,s_str,d_str,len); ! 245: } ! 246: if (no_op == 3) ! 247: { /* MOVS3 : check r2 */ ! 248: if (r2 != exp_r2 ) ! 249: { ! 250: asm("movl $3,_ercode"); ! 251: if (scoplp) longjmp(); ! 252: error_hdl1(r2,exp_r2,s_str,d_str,len); ! 253: } ! 254: /* CHECK LENGTH OPERAND */ ! 255: if (len_op != len) ! 256: { ! 257: asm("movl $3,_ercode"); ! 258: if (scoplp) longjmp(); ! 259: error_hdl1(len_op,len,s_str,d_str,len); ! 260: } ! 261: /* CHECK NO. OF BYTES COPIED EQUAL LENGTH SPECIFIED */ ! 262: ierror = 0; ! 263: if (len<=MAXBYTE) ! 264: { if (d_str[len]!='^') ! 265: { ! 266: asm("movl $1,_ercode"); ! 267: if (scoplp) longjmp(); ! 268: error_hdl1(d_str,savs,s_str,d_str,len); ! 269: } ! 270: } ! 271: ! 272: /* check for NULL padded at end of dest. string */ ! 273: ierror = 0; ! 274: if (len>MAXBYTE) ! 275: { for(ix=MAXBYTE;ix<len;ix++) ! 276: { if (d_str[ix] != NULL) ! 277: { ! 278: asm("movl $1,_ercode"); ! 279: if (scoplp) longjmp(); ! 280: error_str(d_str,savs,s_str,d_str,len); ! 281: } ! 282: if (force_lp) longjmp(); ! 283: } ! 284: } ! 285: ! 286: } ! 287: break; ! 288: } ! 289: } ! 290: ! 291:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.