Assembler for MIMD-TRAP2/3 (c) V.Angelov, v3.6, Dec 2007 SVN Revision 0, SVN Date 2007-12-27 Please send any comments to: angelov@kip.uni-heidelberg.de 18:34:32 / 21 Apr 2008 Source code file: src/EBtst.asm Memory initialisation file: Log file: wrk/cpu0.log Program memory size in words: 4096 Default constants, read from /cad/tools/bin/asm_mimd.inc 1 CPU0 = 2 CC_SIGNED = 0X14 3 CC_NSIGNED = 0X04 4 CC_ZERO = 0X11 5 CC_NZERO = 0X01 6 CC_OVERFL = 0X13 7 CC_NOVERFL = 0X03 8 CC_NEG = 0X12 9 CC_NNEG = 0X02 10 CC_CARRY = 0X10 11 CC_NCARRY = 0X00 12 CC_BUSY = 0X17 13 CC_NBUSY = 0X07 14 CC_DIVB = 0X15 15 CC_NDIVB = 0X05 16 CC_ERRDIV = 0X16 17 CC_NERRDIV = 0X06 18 CC_UNCOND = 0X0F 19 CC_EQ = 0X11 20 CC_NEQ = 0X01 21 CC_NEG = 0X12 22 CC_POS0 = 0X02 23 CC_LTS = 0X14 24 CC_GES = 0X04 25 CC_LTU = 0X10 26 CC_GEU = 0X00 27 CC_LES = 0X19 28 CC_GTS = 0X09 29 CC_LEU = 0X18 30 CC_GTU = 0X08 31 RR_BYTE = 3 32 RR_WORD = 1 33 RR_DWORD = 0 34 LRA1 = LRA 3, 35 LRA2 = LRA 1, 36 LRA4 = LRA 0, 37 LRA4+ = LRA+ 0, 38 XOR = EOR 39 NOT = COM 40 SHLT = SHL 41 ANDT = AND 42 R0 = PRF[0] 43 R1 = PRF[1] 44 R2 = PRF[2] 45 R3 = PRF[3] 46 R4 = PRF[4] 47 R5 = PRF[5] 48 R6 = PRF[6] 49 R7 = PRF[7] 50 R8 = PRF[8] 51 R9 = PRF[9] 52 R10 = PRF[10] 53 R11 = PRF[11] 54 R12 = PRF[12] 55 R13 = PRF[13] 56 R14 = PRF[14] 57 R15 = PRF[15] 58 G0 = GRF[0] 59 G1 = GRF[1] 60 G2 = GRF[2] 61 G3 = GRF[3] 62 G4 = GRF[4] 63 G5 = GRF[5] 64 G6 = GRF[6] 65 G7 = GRF[7] 66 G8 = GRF[8] 67 G9 = GRF[9] 68 G10 = GRF[10] 69 G11 = GRF[11] 70 G12 = GRF[12] 71 G13 = GRF[13] 72 G14 = GRF[14] 73 G15 = GRF[15] 74 F0 = FIT[0] 75 F1 = FIT[1] 76 F2 = FIT[2] 77 F3 = FIT[3] 78 F4 = FIT[4] 79 F5 = FIT[5] 80 F6 = FIT[6] 81 F7 = FIT[7] 82 F8 = FIT[8] 83 F9 = FIT[9] 84 F10 = FIT[10] 85 F11 = FIT[11] 86 F12 = FIT[12] 87 F13 = FIT[13] 88 F14 = FIT[14] 89 F15 = FIT[15] 90 C0 = CON[0] 91 C1 = CON[1] 92 C2 = CON[2] 93 C3 = CON[3] 94 C4 = CON[4] 95 C5 = CON[5] 96 C6 = CON[6] 97 C7 = CON[7] 98 C8 = CON[8] 99 C9 = CON[9] 100 C10 = CON[10] 101 C11 = CON[11] 102 C12 = CON[12] 103 C13 = CON[13] 104 C14 = CON[14] 105 C15 = CON[15] 106 ASM_SVN_REV = 0 1: ; Full test of the EBFs. 2: ; The number of the errors counted by cpu(n) is st 3: #ifdef short 4: #def eblength= 4; 5: #else 6: #def eblength=64; 7: #endif 8: #def margaddr=prf[0] ; marginal address (first ad 9: #def work=PRF[1] ; register for current opera 10: #def rdata=PRF[2] ; data red by test_programs 11: #def tdata=PRF[3] ; test_vector to be writen 12: #def errnum=PRF[4] ; contains the number of err 13: #def return1=PRF[5] ; return address (at first l 14: #def return2=PRF[6] ; return address (at second 15: #def return3=PRF[7] ; return address (at third l 16: #def tdgen=PRF[8] ; test data generator code l 17: #def itdgen=PRF[9] ; init tdgen code label 18: #def psrmask=PRF[10] ; mask for test_vector 19: #def chanum=PRF[12] ; number of certain chanal 20: ; prf11 and prf13 are used inside the testing rout 21: ; DEFINITIONS, USED IN THE PROGRAM CODE: 22: 23: #def ioaddr=PRF[14] ; contains the autoincrement 24: #def errstore=PRF[15] ; autoincrement address for 25: 26: #def bitnum=grf[0] ; 32 minus the number of bit 27: 28: #def BITMASK10=0x3FF ; 10-bit mask 29: 30: 31: nop 0000 : 0000_0000_0000_0000_0000_0000 32: #ifdef cpu0 33: iext 0x300F 0001 : 0101_0000_0000_0000_0000_0011 34: mov 0x300F r1 0002 : 1100_0110_0000_0001_1110_0001 35: mov c0 r0 0003 : 1100_0010_0000_0110_0000_0000 36: sgio r0 r1 0004 : 0010_0100_0000_0000_0010_0000 37: #else 38: nop 39: nop 40: nop 41: nop 42: #endif 43: start: jmp cc_uncond mprg 0005 : 0000_0100_0000_0000_0000_1111 44: 45: ; BEGIN THE TESTING ROUTINE (uses testin 46: cltst: mov 1, prf[11] 0006 : 1100_0110_0000_0000_0010_1011 47: mov 1, prf[13] 0007 : 1100_0110_0000_0000_0010_1101 48: 49: nt: nop 0008 : 0000_0000_0000_0000_0000_0000 50: 51: ;#ifdef walk1 52: mov wlk1, tdgen ; call walkin 0009 : 1100_0110_0000_0000_0000_1000 53: mov iwlk1, itdgen ; 000A : 1100_0110_0000_0000_0000_1001 54: mvpcr +2, return2 000B : 1100_0110_0000_0001_1010_0110 55: jmp cc_uncond, tstglio 000C : 0000_0100_0000_0000_0000_1111 56: ;#endif 57: 58: ;#ifdef walk0 59: mov wlk0, tdgen ; call walkin 000D : 1100_0110_0000_0000_0000_1000 60: mov iwlk0, itdgen 000E : 1100_0110_0000_0000_0000_1001 61: mvpcr +2, return2 000F : 1100_0110_0000_0010_0010_0110 62: jmp cc_uncond, tstglio 0010 : 0000_0100_0000_0000_0000_1111 63: ;#endif 64: 65: ;#ifdef psrgt 66: mov psr, tdgen ; call pseudo 0011 : 1100_0110_0000_0000_0000_1000 67: mov ipsr, itdgen 0012 : 1100_0110_0000_0000_0000_1001 68: mvpcr +2, return2 0013 : 1100_0110_0000_0010_1010_0110 69: jmp cc_uncond, tstglio 0014 : 0000_0100_0000_0000_0000_1111 70: ;#endif 71: 72: add prf[13], c3, prf[13] ; next init 0015 : 1000_0010_1101_0110_0110_1101 73: shl 1, prf[11], prf[11] ; testing r 0016 : 1011_0010_0001_0001_0110_1011 74: jmp cc_carry, return1 0017 : 0000_1000_0101_0000_0001_0000 75: mov bitnum work 0018 : 1100_0010_0000_0010_0000_0001 76: mov 15 rdata 0019 : 1100_0110_0000_0001_1110_0010 77: mov prf[11] tdata 001A : 1100_0010_0000_0001_0110_0011 78: cmp rdata bitnum 001B : 1000_1000_0010_0010_0000_0000 79: jmpr cc_ncarry 3 001C : 0000_0100_0000_0011_1110_0000 80: shl 15 tdata tdata 001D : 1011_0010_1111_0000_0110_0011 81: sub work rdata work 001E : 1000_1010_0001_0000_0100_0001 82: shlt work, tdata ; if MSB of t 001F : 0111_0000_0001_0000_0110_0000 83: jmp cc_ncarry, nt 0020 : 0000_0100_0000_0000_0000_0000 84: jmp cc_uncond return1 ; left side o 0021 : 0000_1000_0101_0000_0000_1111 85: 86: ; END OF THE TESTING ROUTINE 87: 88: ; BEGIN OF THE SUBROUTINE 89: 90: tstglio: mvpcr +2, return3 0022 : 1100_0110_0000_0100_1000_0111 91: jmp cc_uncond, itdgen ; go to 0023 : 0000_1000_1001_0000_0000_1111 92: 93: shl 2 c5 margaddr ; prepar 0024 : 1011_0010_0010_0110_1010_0000 94: add margaddr c5 margaddr ; in GIO 0025 : 1000_0010_0000_0110_1010_0000 95: add margaddr chanum margaddr ; ioaddr 0026 : 1000_0010_0000_0001_1000_0000 96: mov 0x80 work ; the va 0027 : 1100_0110_0001_0000_0000_0001 97: mul32 margaddr work margaddr ; margad 0028 : 1001_0000_0000_0000_0010_1000 98: nop 0029 : 0000_0000_0000_0000_0000_0000 99: iext 0x2000 002A : 0101_0000_0000_0000_0000_0010 100: mov 0x2000 work 002B : 1100_0110_0000_0000_0000_0001 101: add margaddr work margaddr 002C : 1000_0010_0000_0000_0010_0000 102: 103: mov margaddr, ioaddr ; then t 002D : 1100_0010_0000_0000_0000_1110 104: mov eblength work ; additi 002E : 1100_0110_0000_1000_0000_0001 105: add work margaddr margaddr 002F : 1000_0010_0001_0000_0000_0000 106: wd: jmpr cc_busy, 0 0030 : 0000_0100_0000_0110_0001_0111 107: sgio+ tdata ; ioaddr 0031 : 0011_1100_0011_0000_0000_0000 108: 109: mov 20 work ; certai 0032 : 1100_0110_0000_0010_1000_0001 110: wt: sub work c1 work 0033 : 1000_1010_0001_0110_0010_0001 111: jmp cc_nzero wt 0034 : 0000_0100_0000_0000_0000_0001 112: 113: mvpcr +2, return3 ; prepar 0035 : 1100_0110_0000_0110_1110_0111 114: jmp cc_uncond, tdgen ; compar 0036 : 0000_1000_1000_0000_0000_1111 115: cmp ioaddr, margaddr 0037 : 1000_1000_1110_0000_0000_0000 116: jmp cc_carry, wd 0038 : 0000_0100_0000_0000_0001_0000 117: 118: ; BEGIN COMPARING PART OF CODE 119: 120: mov 0x40 margaddr ; prepar 0039 : 1100_0110_0000_1000_0000_0000 121: mul32 margaddr chanum margaddr ; ioaddr 003A : 1001_0000_0000_0001_1000_1000 122: ; nop 123: mov 0x800 work 003B : 1100_0111_0000_0000_0000_0001 124: add work margaddr margaddr 003C : 1000_0010_0001_0000_0000_0000 125: mov margaddr, ioaddr 003D : 1100_0010_0000_0000_0000_1110 126: mov eblength work 003E : 1100_0110_0000_1000_0000_0001 127: add work margaddr margaddr ; prepar 003F : 1000_0010_0001_0000_0000_0000 128: mvpcr +2, return3 0040 : 1100_0110_0000_1000_0100_0111 129: jmp cc_uncond, itdgen ; and go 0041 : 0000_1000_1001_0000_0000_1111 130: 131: wc: jmpr cc_busy, 0 0042 : 0000_0100_0000_1000_0101_0111 132: lpio ioaddr rdata ; here i 0043 : 1110_0010_0000_0001_1100_0010 133: lpio+ rdata ; with s 0044 : 1110_1110_0000_0000_0000_0010 134: ; nop ; wait 135: and rdata psrmask rdata ; the da 0045 : 1010_0110_0010_0001_0100_0010 136: cmp rdata, tdata ; err_or 0046 : 1000_1000_0010_0000_0110_0000 137: jmp cc_zero, noerr ; bit 0047 : 0000_0100_0000_0000_0001_0001 138: add errnum, c1, errnum 0048 : 1000_0010_0100_0110_0010_0100 139: 140: noerr: mvpcr +2, return3 0049 : 1100_0110_0000_1001_0110_0111 141: jmp cc_uncond, tdgen ; get nex 004A : 0000_1000_1000_0000_0000_1111 142: 143: cmp ioaddr, margaddr ; is tne 004B : 1000_1000_1110_0000_0000_0000 144: jmp cc_carry, wc ; if not 004C : 0000_0100_0000_0000_0001_0000 145: 146: jmp cc_uncond, return2 ; otherwi 004D : 0000_1000_0110_0000_0000_1111 147: 148: ; prepares the next data - walking 1 149: wlk1: shl 1, tdata, tdata 004E : 1011_0010_0001_0000_0110_0011 150: and tdata, psrmask, tdata 004F : 1010_0110_0011_0001_0100_0011 151: jmp cc_nzero, return3 0050 : 0000_1000_0111_0000_0000_0001 152: mov 1, tdata 0051 : 1100_0110_0000_0000_0010_0011 153: jmp cc_uncond, return3 0052 : 0000_1000_0111_0000_0000_1111 154: ; end of walking 1 155: 156: ; prepares the next data - walking 0 157: wlk0: com tdata, tdata 0053 : 1011_1110_0000_0000_0110_0011 158: shl 1, tdata, tdata 0054 : 1011_0010_0001_0000_0110_0011 159: and tdata, psrmask, tdata 0055 : 1010_0110_0011_0001_0100_0011 160: jmpr cc_nzero, +2 0056 : 0000_0100_0000_1011_0000_0001 161: mov 1, tdata 0057 : 1100_0110_0000_0000_0010_0011 162: com tdata, tdata 0058 : 1011_1110_0000_0000_0110_0011 163: and tdata, psrmask, tdata 0059 : 1010_0110_0011_0001_0100_0011 164: jmp cc_uncond, return3 005A : 0000_1000_0111_0000_0000_1111 165: ; end of walking 0 166: 167: ; prepares the next data by pseudo random generato 168: psr: lpio 0x202, tdata 005B : 1110_0110_0100_0000_0100_0011 169: and tdata, psrmask, tdata 005C : 1010_0110_0011_0001_0100_0011 170: jmp cc_uncond, return3 005D : 0000_1000_0111_0000_0000_1111 171: ; end random generator 172: 173: ; init walking 1 174: iwlk1: and prf[11], psrmask, tdata 005E : 1010_0110_1011_0001_0100_0011 175: jmp cc_uncond, return3 005F : 0000_1000_0111_0000_0000_1111 176: 177: ; init walking 0 178: iwlk0: com prf[11], tdata 0060 : 1011_1110_0000_0001_0110_0011 179: and tdata, psrmask, tdata 0061 : 1010_0110_0011_0001_0100_0011 180: jmp cc_uncond, return3 0062 : 0000_1000_0111_0000_0000_1111 181: 182: ; init psr 183: ;#ifdef trap3 184: ipsr: mov b1_0_0_00_01_00000, tdata 0063 : 1100_0111_0000_0100_0000_0011 185: ;#else 186: ;ipsr: mov b1_0_0_00_01_0000, tdata 187: ;#endif 188: mov 31 work 0064 : 1100_0110_0000_0011_1110_0001 189: sub work bitnum work 0065 : 1000_1010_0001_0010_0000_0001 190: ;#ifdef trap3 191: ;#else 192: ; cmp work 16 193: ; jmpr cc_carry 2 194: ; mov 15 work 195: ;#endif 196: or tdata work tdata 0066 : 1010_1010_0011_0000_0010_0011 197: spio tdata, 0x201 0067 : 0010_0000_0011_0010_0000_0001 198: mov prf[13], tdata 0068 : 1100_0010_0000_0001_1010_0011 199: spio tdata, 0x200 0069 : 0010_0000_0011_0010_0000_0000 200: nop 006A : 0000_0000_0000_0000_0000_0000 201: nop 006B : 0000_0000_0000_0000_0000_0000 202: lpio 0x202, tdata 006C : 1110_0110_0100_0000_0100_0011 203: jmp cc_uncond, return3 006D : 0000_1000_0111_0000_0000_1111 204: ; END OF THE SUBROUTINES 205: 206: ; MAIN PROGRAM CODE BELOW 207: mprg: nop 006E : 0000_0000_0000_0000_0000_0000 208: mov BITMASK10 psrmask 006F : 1100_0110_0111_1111_1110_1010 209: mov 22 bitnum 0070 : 1100_0110_0000_0010_1101_0000 210: mov 0, errnum 0071 : 1100_0110_0000_0000_0000_0100 211: 212: mov c0 chanum ; call te 0072 : 1100_0010_0000_0110_0000_1100 213: mvpcr +2 return1 0073 : 1100_0110_0000_1110_1010_0101 214: jmp cc_uncond cltst 0074 : 0000_0100_0000_0000_0000_1111 215: mov c1 chanum ; call te 0075 : 1100_0010_0000_0110_0010_1100 216: mvpcr +2 return1 0076 : 1100_0110_0000_1111_0000_0101 217: jmp cc_uncond cltst 0077 : 0000_0100_0000_0000_0000_1111 218: mov c2 chanum ; call te 0078 : 1100_0010_0000_0110_0100_1100 219: mvpcr +2 return1 0079 : 1100_0110_0000_1111_0110_0101 220: jmp cc_uncond cltst 007A : 0000_0100_0000_0000_0000_1111 221: mov c3 chanum ; call te 007B : 1100_0010_0000_0110_0110_1100 222: mvpcr +2 return1 007C : 1100_0110_0000_1111_1100_0101 223: jmp cc_uncond cltst 007D : 0000_0100_0000_0000_0000_1111 224: mov c4 chanum ; call te 007E : 1100_0010_0000_0110_1000_1100 225: mvpcr +2 return1 007F : 1100_0110_0001_0000_0010_0101 226: jmp cc_uncond cltst 0080 : 0000_0100_0000_0000_0000_1111 227: 228: #ifdef cpu3 229: mov 5 chanum ; call te 230: mvpcr +2 return1 231: jmp cc_uncond cltst 232: #else 233: nop 0081 : 0000_0000_0000_0000_0000_0000 234: nop 0082 : 0000_0000_0000_0000_0000_0000 235: nop 0083 : 0000_0000_0000_0000_0000_0000 236: #endif cpu3 237: 238: jmpr cc_busy 0 ; here re 0084 : 0000_0100_0001_0000_1001_0111 239: iext 0x3010 0085 : 0101_0000_0000_0000_0000_0011 240: mov 0x3010 ioaddr ; Counter 0086 : 1100_0110_0000_0010_0000_1110 241: add ioaddr c5 ioaddr 0087 : 1000_0010_1110_0110_1010_1110 242: lgio 1 ioaddr ; the val 0088 : 1110_1001_0000_0001_1100_0000 243: jmpr cc_busy 0 0089 : 0000_0100_0001_0001_0011_0111 244: lpio 0x301 work 008A : 1110_0110_0110_0000_0010_0001 245: add errnum work errnum 008B : 1000_0010_0100_0000_0010_0100 246: ; add errnum c5 errnum 247: 248: iext 0xF000 ; the tot 008C : 0101_0000_0000_0000_0000_1111 249: mov 0xF000 errstore 008D : 1100_0110_0000_0000_0000_1111 250: add errstore c5 errstore 008E : 1000_0010_1111_0110_1010_1111 251: jmpr cc_busy 0 008F : 0000_0100_0001_0001_1111_0111 252: sgio errnum errstore 0090 : 0010_0100_0100_0001_1110_0000 253: jmpr cc_busy 0 0091 : 0000_0100_0001_0010_0011_0111 254: 255: #ifdef cpu3 256: jmpr cc_busy, 0 257: iext 0x0A26 ; CPU3 tur 258: mov 0x0A26, work 259: mov b0_0111, rdata 260: sgio rdata, work 261: jmpr cc_busy, 0 262: sgio rdata 0xA20 263: ; send end to the scsn master in simulati 264: mov 1, work 265: iext 0x3178 266: mov 0x3178, ioaddr 267: sgio+ work 268: mov 0, tdata 269: ; single ended bidir outputs 270: jmpr cc_busy, 0 271: sgio tdata, ioaddr 272: jmpr cc_busy, 0 273: sgio work, ioaddr 274: jmpr cc_busy, 0 275: mov 0x012, work 276: sgio work, 0xA04 277: jmpr cc_uncond 0 278: #else 279: ; turns on cpu N+1 ... 280: mov c1 rdata 0092 : 1100_0010_0000_0110_0010_0010 281: jmpr cc_busy 0 0093 : 0000_0100_0001_0010_0111_0111 282: mov c1 ioaddr 0094 : 1100_0010_0000_0110_0010_1110 283: add ioaddr c5 ioaddr 0095 : 1000_0010_1110_0110_1010_1110 284: shl 1 ioaddr ioaddr 0096 : 1011_0010_0001_0001_1100_1110 285: mov 0xA20 work 0097 : 1100_0111_0100_0100_0000_0001 286: add ioaddr work ioaddr 0098 : 1000_0010_1110_0000_0010_1110 287: sgio rdata ioaddr 0099 : 0010_0100_0010_0001_1100_0000 288: jmpr cc_busy 0 009A : 0000_0100_0001_0011_0101_0111 289: sub ioaddr c2 ioaddr 009B : 1000_1010_1110_0110_0100_1110 290: mov c0 rdata 009C : 1100_0010_0000_0110_0000_0010 291: sgio rdata ioaddr 009D : 0010_0100_0010_0001_1100_0000 292: jmpr cc_uncond 0 009E : 0000_0100_0001_0011_1100_1111 293: ; ... and stops itself 294: #endif cpu3 Source file read, 0 error(s), 0 warning(s).