// ################# Main program ###################### daten[0] = 0xF000; // Init subroutine table daten[1] = 0x1800; // LDAM daten[2] = 60; // counter how many subroutines left over daten[3] = 0x4018; // BZ: no subroutines left over to init? daten[4] = 25; daten[5] = 0x3440; //ADD daten[6] = 0xFFFF; // Sub 1 from subroutine left over counter daten[7] = 0x2800; // STAM daten[8] = 60; // store subroutine left over counter in variable daten[9] = 0x1800; // LDAM daten[10] = 61; // adress storage index variable, stores address of next table entry daten[11] = 0x3440; //ADD daten[12] = 0x0001; // 1 to next table index daten[13] = 0x2800; // STAM daten[14] = 61; // store table index daten[15] = 0x1800; // LDAM // increment address variable daten[16] = 99; // subroutine adress variable daten[17] = 0x3440; //ADD daten[18] = 100; // add 100 to the subroutine adress (each subroutine has 100 words) daten[19] = 0x2800; // STAM daten[20] = 99; // store subroutine adress in adress variable daten[21] = 0x2C00; // STAMM // store new address in address array daten[22] = 61; // Store the new subroutine adress in the table entry wiith the right index daten[23] = 0x4000; //BA // LOOP back daten[24] = 1; // back to the beginning daten[25] = 0x1400; // LDA // Init daten[26] = 62; // 62 is the adress of the table entry for the first subroutine adress daten[27] = 0x2800; // STAM daten[28] = 61; // Store this adress in 61 (Init the table index to the first table entry) // Start subroutines daten[29] = 0x1C00; // LDAMM daten[30] = 61; // Load address of subroutine (address of address is stored in 0x61) daten[31] = 0x2800; // STAM daten[32] = 34; // Write jump address into CALL command daten[33] = 0x5000; // CALL to test subroutine daten[34] = 0; daten[35] = 0x2800; // STAM daten[36] = 40; // Write return value into ADD parameter to be able to add it to result register daten[37] = 0x1800; // LDAM // Result = Result + 1 daten[38] = 98; daten[39] = 0x3440; //ADD daten[40] = 1; daten[41] = 0x2800; // STAM daten[42] = 98; daten[43] = 0x1800; // LDAM // Set index to next Address daten[44] = 61; daten[45] = 0x3440; //ADD daten[46] = 1; daten[47] = 0x2800; // STAM daten[48] = 61; daten[49] = 0x1C00; // LDAMM daten[50] = 61; // Load address of next subroutine daten[51] = 0x4018; // BZ // Address == 0 ? daten[52] = 70; daten[53] = 0x4000; //BA // Loop back daten[54] = 29; // Testroutine Adresses, this table stores the adresses to call. The table is generated daten[60] = 4; // Counter how many subroutines left over daten[61] = 61; // address of the next table index (init: first table entry) daten[62] = 0; daten[63] = 0; daten[64] = 0; daten[65] = 0; daten[66] = 0; // End result: load the result variable into the accu, System on Halt now daten[70] = 0x1800; // LDAM daten[71] = 98; // Variables daten[98] = 0; // Result daten[99] = 0; // Variable (address variable) // **************************************************************************************************** // Test commands, control unit // **************************************************************************************************** // ********** LDA, ADD, STAM, LDAM ****************** daten[100] = 0x1400; // LDA // LOAD / STORE daten[101] = 195; // 195 into Accu daten[102] = 0x3440; //ADD daten[103] = 2; // 197 in Accu daten[104] = 0x2800; // STAM daten[105] = 196; // 197 in address 196 daten[106] = 0x1400; // LDA daten[107] = 0; daten[108] = 0x1800; // LDAM daten[109] = 196; // Adresse 196 in Accu = 197 daten[110] = 0x3440; //ADD daten[111] = 0xFF3B; // add -197 = 0 daten[112] = 0x4018; // BZ daten[113] = 116; // OK daten[114] = 0x4000; //BA daten[115] = 168; // error // ********** LDAMM, STAMM ****************** daten[116] = 0x1400; // LDA // LDAMM and STAMM daten[117] = 0x5555; daten[118] = 0x2C00; // STAMM daten[119] = 196; daten[120] = 0x1400; // LDA daten[121] = 0; daten[122] = 0x1C00; // LDAMM daten[123] = 196; daten[124] = 0x3440; //ADD daten[125] = 0xAAAB; // Auf 0 subtrahieren daten[126] = 0x4018; // BZ daten[127] = 130; // OK daten[128] = 0x4000; //BA daten[129] = 168; // error // ********** BC, BN ****************** daten[130] = 0x1400; // LDA // Carry daten[131] = 0xFFFE; daten[132] = 0x3440; //ADD daten[133] = 0x0003; // Carry == 1 daten[134] = 0x4008; // BC daten[135] = 138; // OK daten[136] = 0x4000; //BA daten[137] = 168; // error daten[138] = 0x1400; // LDA // BN daten[139] = 0x8000; daten[140] = 0x4010; // BN daten[141] = 144; // OK daten[142] = 0x4000; //BA daten[143] = 168; // error // ********** ADD, SHL/R, AND, OR, NOT ****************** daten[144] = 0x1400; // LDA // Shift, AND, OR, NOT daten[145] = 0x5555; // 0101 0101 0101 0101 daten[146] = 0x35C0; // SHL daten[147] = 0x0000; // 1010 1010 1010 1010 daten[148] = 0x3480; //AND daten[149] = 0xCA21; // 1100 1010 0010 0001 -> 1000 1010 0010 0000 daten[150] = 0x3540; //NOT // 0x8A20 daten[151] = 0; // 0111 0101 1101 1111 =75DF daten[152] = 0x34C0; // OR daten[153] = 0xA0A0; // 1010 0000 1010 0000 = F5FF daten[154] = 0x3580; // SHR daten[155] = 0; // = 0111 1010 1111 1111 daten[156] = 0x3440; //ADD daten[157] = 0x8502; // auf 1 daten[158] = 0x4000; //BA // if all calculations are OK: accu = 1 daten[159] = 170; daten[168] = 0x1400; // LDA // BN daten[169] = 0x1000; daten[170] = 0x6000; // RETURN daten[195] = 195; // **************************************************************************************************** // Test ALU Part 1 // **************************************************************************************************** // ********** ADD ****************** daten[200] = 0x1400; // LDA daten[201] = 0x5555; daten[202] = 0x3440; //ADD daten[203] = 0x5555; daten[204] = 0x3440; //ADD daten[205] = 0xAAAB; daten[206] = 0x4008; // BC daten[207] = 210; daten[208] = 0x4000; //BA // jump to errorcode daten[209] = 297; // ********** SHL ****************** daten[210] = 0x1800; // LDAM daten[211] = 295; // Load value to shift daten[212] = 0x35C0; // SHL daten[213] = 0x0000; daten[214] = 0x2800; // STAM daten[215] = 295; // Store shiftet value in variable 295 daten[216] = 0x1800; // LDAM daten[217] = 296; // Load Counter daten[218] = 0x3440; //ADD daten[219] = 0xFFFF; // -1 daten[220] = 0x2800; // STAM daten[221] = 296; // Store Counter daten[222] = 0x4018; // BZ daten[223] = 226; // last shift, now check the result daten[224] = 0x4000; //BA daten[225] = 210; // Jump back to next shift daten[226] = 0x1800; // LDAM daten[227] = 295; // Load result into accu daten[228] = 0x3440; //ADD daten[229] = 0x8000; // Sub 0x8000 daten[230] = 0x4018; // BZ daten[231] = 234; // if result was 0x8000 jump to next test daten[232] = 0x4000; //BA // jump to errorcode daten[233] = 297; // ********** SHR ****************** daten[234] = 0x1400; // LDA daten[235] = 0x000F; // Reinit counter daten[236] = 0x2800; // STAM daten[237] = 296; // Store Counter daten[238] = 0x1400; // LDA daten[239] = 0x8000; // Init with 0x8000 daten[240] = 0x2800; // STAM daten[241] = 295; // Store init value daten[242] = 0x1800; // LDAM daten[243] = 295; // Load value daten[244] = 0x3580; // SHR daten[245] = 0x0000; daten[246] = 0x2800; // STAM daten[247] = 295; // Store shiftet value in variable 295 daten[248] = 0x1800; // LDAM daten[249] = 296; // Load Counter daten[250] = 0x3440; //ADD daten[251] = 0xFFFF; // -1 daten[252] = 0x2800; // STAM daten[253] = 296; // Store Counter daten[254] = 0x4018; // BZ daten[255] = 258; // last shift, now check the result daten[256] = 0x4000; //BA daten[257] = 242; // Jump back to next shift daten[258] = 0x1800; // LDAM daten[259] = 295; // Load result into accu daten[260] = 0x3440; //ADD daten[261] = 0xFFFF; // Sub 1 daten[262] = 0x4018; // BZ daten[263] = 266; // if result was 0x0001 jump to Return daten[264] = 0x4000; //BA // jump to errorcode daten[265] = 297; daten[266] = 0x1400; // LDA daten[267] = 0x0004; // OK daten[268] = 0x6000; // RETURN daten[295] = 0x0001; // Variable daten[296] = 0x000F; // Variable daten[297] = 0x1400; // LDA daten[298] = 0x2000; // Errorcode daten[299] = 0x6000; // RETURN // **************************************************************************************************** // Test address range // **************************************************************************************************** // Adress 989 = 11 1101 1101 daten[300] = 0x1400; // LDA daten[301] = 989; daten[302] = 0x2800; // STAM daten[303] = 989; daten[304] = 0x1400; // LDA daten[305] = 0; daten[306] = 0x1800; // LDAM daten[307] = 989; daten[308] = 0x3440; //ADD daten[309] = 0xFC23; // Sub 989 daten[310] = 0x4018; // BZ daten[311] = 314; // if result was 0x8000 jump to next test daten[312] = 0x4000; //BA // jump to errorcode daten[313] = 397; // Adress 1021 = 11 1111 1101 daten[314] = 0x1400; // LDA daten[315] = 1021; daten[316] = 0x2800; // STAM daten[317] = 1021; daten[318] = 0x1400; // LDA daten[319] = 0; daten[320] = 0x1800; // LDAM daten[321] = 1021; daten[322] = 0x3440; //ADD daten[323] = 0xFC03; // Sub 989 daten[324] = 0x4018; // BZ daten[325] = 328; // if result was 0x8000 jump to next test daten[326] = 0x4000; //BA // jump to errorcode daten[327] = 397; // Adress 834 = 11 0100 0010 daten[328] = 0x1400; // LDA daten[329] = 834; daten[330] = 0x2800; // STAM daten[331] = 834; daten[332] = 0x1400; // LDA daten[333] = 0; daten[334] = 0x1800; // LDAM daten[335] = 834; daten[336] = 0x3440; //ADD daten[337] = 0xFCBE; // Sub 989 daten[338] = 0x4018; // BZ daten[339] = 394; // if result was 0x8000 jump to result daten[340] = 0x4000; //BA // jump to errorcode daten[341] = 397; daten[394] = 0x1400; // LDA daten[395] = 0x0010; // OK daten[396] = 0x6000; // RETURN daten[397] = 0x1400; // LDA daten[398] = 0x4000; daten[399] = 0x6000; // RETURN // **************************************************************************************************** // Test ALU Part 2 // **************************************************************************************************** // ********** AND, OR, NOT ****************** // OR daten[400] = 0x1400; // LDA daten[401] = 0; daten[402] = 0x34C0; // OR daten[403] = 0x5555; daten[404] = 0x3440; // ADD daten[405] = 0xAAAB; daten[406] = 0x4018; // BZ daten[407] = 410; daten[408] = 0x4000; //BA // jump to errorcode daten[409] = 497; daten[410] = 0x1400; // LDA daten[411] = 0; daten[412] = 0x34C0; // OR daten[413] = 0xAAAA; daten[414] = 0x3440; // ADD daten[415] = 0x5556; daten[416] = 0x4018; // BZ daten[417] = 420; daten[418] = 0x4000; //BA // jump to errorcode daten[419] = 497; // AND daten[420] = 0x1400; // LDA daten[421] = 0xFFFF; daten[422] = 0x3480; // AND daten[423] = 0x5555; daten[424] = 0x3440; // ADD daten[425] = 0xAAAB; daten[426] = 0x4018; // BZ daten[427] = 430; daten[428] = 0x4000; //BA // jump to errorcode daten[429] = 497; daten[430] = 0x1400; // LDA daten[431] = 0xFFFF; daten[432] = 0x3480; // AND daten[433] = 0xAAAA; daten[434] = 0x3440; // ADD daten[435] = 0x5556; daten[436] = 0x4018; // BZ daten[437] = 440; daten[438] = 0x4000; //BA // jump to errorcode daten[439] = 497; // NOT daten[440] = 0x1400; // LDA daten[441] = 0x5555; daten[442] = 0x3540; // NOT daten[443] = 0x0000; daten[444] = 0x3440; // ADD daten[445] = 0x5556; daten[446] = 0x4018; // BZ daten[447] = 450; daten[448] = 0x4000; //BA // jump to errorcode daten[449] = 497; daten[450] = 0x1400; // LDA daten[451] = 0xAAAA; daten[452] = 0x3540; // AND daten[453] = 0x0000; daten[454] = 0x3440; // ADD daten[455] = 0xAAAB; daten[456] = 0x4018; // BZ daten[457] = 494; daten[438] = 0x4000; //BA // jump to errorcode daten[439] = 497; // Results daten[494] = 0x1400; // LDA daten[495] = 0x0040; // OK daten[496] = 0x6000; // RETURN daten[497] = 0x1400; // LDA daten[498] = 0x8000; // Errorcode daten[499] = 0x6000; // RETURN