// **************************************** // Add the Software her /* City-numbers: 0 Wien 1 Linz 2 Salzburg 3 Graz 4 Innsbruck 5 Klagenfurt 6 StPoelten 7 Eisenstadt */ daten[0] = 0x4000; // BA daten[1] = 50; // Jump to start // Initialization daten[50] = 0x1800; // LDAM daten[51] = 900; // Start daten[52] = 0x3440; //ADD daten[53] = 600; // start of dist array daten[54] = 0x2800; // STAM daten[55] = 59; // dist[start] daten[56] = 0x1400; // LDA daten[57] = 0; // 0 daten[58] = 0x2800; // STAM daten[59] = 0; // dist[start] // Precompute -target for early exit when target becomes nearest daten[60] = 0x1800; // LDAM daten[61] = 901; // Target daten[62] = 0x3540; // NOT daten[63] = 0; daten[64] = 0x3440; // ADD daten[65] = 1; // +1 -> -target daten[66] = 0x2800; // STAM daten[67] = 917; // negTarget daten[68] = 0x4000; // BA daten[69] = 100; // Jump to STEP-Loop // STEP Loop daten[100] = 0x1400; // LDA daten[101] = 0xFFFF; // -1 daten[102] = 0x2800; // STAM daten[103] = 904; // nearest daten[104] = 0x1400; // LDA daten[105] = 30000; // infinity daten[106] = 0x2800; // STAM daten[107] = 905; // bestDist // Search City Loop daten[108] = 0x1400; // LDA daten[109] = 7; // Citycount - 1 daten[110] = 0x2800; // STAM daten[111] = 907; // i // Check visited[i] == 0 daten[112] = 0x3440; //ADD daten[113] = 610; // start of visited array daten[114] = 0x2800; // STAM daten[115] = 117; // self modified code daten[116] = 0x1800; // LDAM daten[117] = 0; // visited[i] daten[118] = 0x4018; // BZ daten[119] = 122; // jump to distance compare daten[120] = 0x4000; // BA daten[121] = 156; // Jump to end of search city loop, check condition // Check if dist[i] < bestDist // Load dist [i] daten[122] = 0x1800; // LDAM daten[123] = 907; // i daten[124] = 0x3440; //ADD daten[125] = 600; // start of dist array daten[126] = 0x2800; // STAM daten[127] = 129; // self modified code, adress of dist[i] daten[128] = 0x1800; // LDAM: dist[i] into accu daten[129] = 0; // dist[i] -> b daten[130] = 0x2800; // STAM daten[131] = 909; // tempDist = dist[i] // ADD-Operand = -bestDist daten[132] = 0x1800; // LDAM daten[133] = 905; // bestDist daten[134] = 0x3540; // NOT daten[135] = 0; daten[136] = 0x3440; // ADD daten[137] = 1; // +1, now -bestDist daten[138] = 0x2800; // STAM daten[139] = 143; // Operand of ADD in 144 // A = dist[i] - bestDist daten[140] = 0x1800; // LDAM daten[141] = 909; // tempDist daten[142] = 0x3440; // ADD daten[143] = 0; // is -bestDist, see daten[139] daten[144] = 0x4010; // BN daten[145] = 148; // UPDATE_NEAREST daten[146] = 0x4000; // BA daten[147] = 156; // END_COMPARE / Loop-End // UPDATE_NEAREST daten[148] = 0x1800; // LDAM daten[149] = 909; // tempDist daten[150] = 0x2800; // STAM daten[151] = 905; // bestDist = tempDist daten[152] = 0x1800; // LDAM daten[153] = 907; // i daten[154] = 0x2800; // STAM daten[155] = 904; // nearest = i // End Search City Loop daten[156] = 0x1800; // LDAM daten[157] = 907; // Step daten[158] = 0x4018; // BZ daten[159] = 166; // after search city loop daten[160] = 0x3440; //ADD daten[161] = 0xFFFF; // -1 daten[162] = 0x2800; // STAM daten[163] = 907; // i daten[164] = 0x4000; // BA daten[165] = 112; // Search City Loop // End of search City Loop // Early exit: if nearest == target, distance is final. // Note: graph is connected, so the old nearest == -1 break is not required here. daten[166] = 0x1800; // LDAM daten[167] = 904; // nearest daten[168] = 0x3440; // ADD daten[169] = 917; // -target daten[170] = 0x4018; // BZ daten[171] = 410; // nearest == target: output result // visited[nearest] = 1 daten[172] = 0x1800; // LDAM daten[173] = 904; // nearest daten[174] = 0x3440; //ADD daten[175] = 610; // Start of visited array daten[176] = 0x2800; // STAM daten[177] = 181; // address of visited[nearest] daten[178] = 0x1400; // LDA daten[179] = 1; // nearest daten[180] = 0x2800; // STAM daten[181] = 0; // visited[nearest] = 1 // P = adjStart[nearest] daten[182] = 0x1800; // LDAM daten[183] = 904; // nearest daten[184] = 0x3440; //ADD daten[185] = 700; // Start of AdjStart daten[186] = 0x2800; // STAM daten[187] = 189; // address of AdjStart[nearest] daten[188] = 0x1800; // LDAM daten[189] = 0; // AdjStart[nearest] daten[190] = 0x2800; // STAM daten[191] = 910; // p = AdjStart[nearest] // loop while (adjData[o] != END) daten[192] = 0x1800; // LDAM daten[193] = 910; // p daten[194] = 0x2800; // STAM daten[195] = 197; // operand of LDAM at 196 daten[196] = 0x1800; // LDAM daten[197] = 0; // adjData[p] daten[198] = 0x4010; // BN daten[199] = 400; // END_NEIGHBOR_LOOP -> directly to STEP control daten[200] = 0x2800; // STAM daten[201] = 908; // neighbor = adjData[p] // p = p + 1 daten[202] = 0x1800; // LDAM daten[203] = 910; // p daten[204] = 0x3440; // ADD daten[205] = 1; daten[206] = 0x2800; // STAM daten[207] = 910; // p = p + 1 daten[208] = 0x2800; // STAM daten[209] = 211; // operand of LDAM at 210 daten[210] = 0x1800; // LDAM daten[211] = 0; // edgeDist = adjData[p] daten[212] = 0x2800; // STAM daten[213] = 243; // edgeDist directly into ADD operand at 242 // if visited[neighbor] != 0: NEXT_NEIGHBOR daten[214] = 0x1800; // LDAM daten[215] = 908; // neighbor daten[216] = 0x3440; // ADD daten[217] = 610; // visited base daten[218] = 0x2800; // STAM daten[219] = 221; // operand of LDAM at 220 daten[220] = 0x1800; // LDAM daten[221] = 0; // visited[neighbor] daten[222] = 0x4018; // BZ daten[223] = 240; // UNVISITED -> directly calculate newDist daten[224] = 0x4000; // BA daten[225] = 292; // NEXT_NEIGHBOR // Unused after optimization: distNearest = dist[nearest] is no longer needed daten[226] = 0x1800; // LDAM daten[227] = 904; // nearest daten[228] = 0x3440; // ADD daten[229] = 600; // dist base daten[230] = 0x2800; // STAM daten[231] = 233; // operand of LDAM at 232 daten[232] = 0x1800; // LDAM daten[233] = 0; // dist[nearest] daten[234] = 0x2800; // STAM daten[235] = 912; // distNearest // newDist = distNearest + edgeDist daten[236] = 0x1800; // LDAM daten[237] = 911; // edgeDist daten[238] = 0x2800; // STAM daten[239] = 243; // operand of ADD at 242 daten[240] = 0x1800; // LDAM daten[241] = 905; // bestDist == dist[nearest] daten[242] = 0x3440; // ADD daten[243] = 0; // edgeDist daten[244] = 0x2800; // STAM daten[245] = 906; // newDist // distNeighbor = dist[neighbor] daten[246] = 0x1800; // LDAM daten[247] = 908; // neighbor daten[248] = 0x3440; // ADD daten[249] = 600; // dist base daten[250] = 0x2800; // STAM daten[251] = 253; // operand of LDAM at 252 daten[252] = 0x1800; // LDAM daten[253] = 0; // dist[neighbor] daten[254] = 0x2800; // STAM daten[255] = 913; // distNeighbor // compare: newDist < distNeighbor // calculate newDist - distNeighbor daten[256] = 0x1800; // LDAM daten[257] = 913; // distNeighbor daten[258] = 0x3540; // NOT daten[259] = 0; daten[260] = 0x3440; // ADD daten[261] = 1; // -distNeighbor daten[262] = 0x2800; // STAM daten[263] = 267; // operand of ADD at 266 daten[264] = 0x1800; // LDAM daten[265] = 906; // newDist daten[266] = 0x3440; // ADD daten[267] = 0; // -distNeighbor daten[268] = 0x4010; // BN daten[269] = 272; // UPDATE_DISTANCE daten[270] = 0x4000; // BA daten[271] = 292; // NEXT_NEIGHBOR // UPDATE_DISTANCE: dist[neighbor] = newDist daten[272] = 0x1800; // LDAM daten[273] = 908; // neighbor daten[274] = 0x3440; // ADD daten[275] = 600; // dist base daten[276] = 0x2800; // STAM daten[277] = 281; // operand of STAM at 280 daten[278] = 0x1800; // LDAM daten[279] = 906; // newDist daten[280] = 0x2800; // STAM daten[281] = 0; // dist[neighbor] // previous[neighbor] = nearest daten[282] = 0x1800; // LDAM daten[283] = 908; // neighbor daten[284] = 0x3440; // ADD daten[285] = 620; // previous base daten[286] = 0x2800; // STAM daten[287] = 291; // operand of STAM at 290 daten[288] = 0x1800; // LDAM daten[289] = 904; // nearest daten[290] = 0x2800; // STAM daten[291] = 0; // previous[neighbor] // NEXT_NEIGHBOR: p = p + 1 daten[292] = 0x1800; // LDAM daten[293] = 910; // p currently points to edgeDist daten[294] = 0x3440; // ADD daten[295] = 1; daten[296] = 0x2800; // STAM daten[297] = 910; // p points to next neighbor daten[298] = 0x4000; // BA daten[299] = 192; // NEIGHBOR_LOOP // Unused after optimization: neighbor END now jumps directly to 400 daten[300] = 0x4000; // BA daten[301] = 400; // STEP loop Control // End loop while (adjData[o] != END) // STEP Loop Control Block daten[400] = 0x1800; // LDAM daten[401] = 902; // Step daten[402] = 0x4018; // BZ daten[403] = 410; // after STEP Loop daten[404] = 0x3440; //ADD daten[405] = 0xFFFF; // -1 daten[406] = 0x2800; // STAM daten[407] = 902; // Step daten[408] = 0x4000; // BA daten[409] = 100; // STEP Loop // END STEP LOOP // Output result using fixed output buffer, without marker // ------------------------------------------------------------ // Output buffer layout: // daten[940] = total distance // daten[941] = pathCount // daten[942]..daten[949] = cities in reverse order: // target -> ... -> start // // The final output loop outputs exactly 10 words: // 940, 941, 942, ..., 949. // The real output values appear at PC 512 for the first 9 words // and at PC 544 for the last word. No marker is required. // ------------------------------------------------------------ // outputBuffer[0] = dist[target] daten[410] = 0x1800; // LDAM daten[411] = 901; // target daten[412] = 0x3440; // ADD daten[413] = 600; // dist base daten[414] = 0x2800; // STAM daten[415] = 417; // operand of LDAM at 416 daten[416] = 0x1800; // LDAM daten[417] = 0; // dist[target] daten[418] = 0x2800; // STAM daten[419] = 940; // outputBuffer[0] = distance // currentOut = target daten[420] = 0x1800; // LDAM daten[421] = 901; // target daten[422] = 0x2800; // STAM daten[423] = 914; // currentOut // outPtr = 942, first city slot in output buffer daten[424] = 0x1400; // LDA daten[425] = 942; daten[426] = 0x2800; // STAM daten[427] = 918; // outPtr // pathCount = 0 daten[428] = 0x1400; // LDA daten[429] = 0; daten[430] = 0x2800; // STAM daten[431] = 916; // pathCount // ------------------------------------------------------------ // BUILD_OUTPUT_BUFFER_LOOP at 432 // Writes target -> ... -> start into daten[942..] // ------------------------------------------------------------ daten[432] = 0x1800; // LDAM daten[433] = 914; // currentOut daten[434] = 0x4010; // BN daten[435] = 490; // safety: if currentOut == -1, finalize buffer // outputBuffer[outPtr] = currentOut daten[436] = 0x1800; // LDAM daten[437] = 918; // outPtr daten[438] = 0x2800; // STAM daten[439] = 443; // operand of STAM at 442 daten[440] = 0x1800; // LDAM daten[441] = 914; // currentOut daten[442] = 0x2800; // STAM daten[443] = 0; // outputBuffer[outPtr] = currentOut // outPtr = outPtr + 1 daten[444] = 0x1800; // LDAM daten[445] = 918; // outPtr daten[446] = 0x3440; // ADD daten[447] = 1; daten[448] = 0x2800; // STAM daten[449] = 918; // outPtr // pathCount = pathCount + 1 daten[450] = 0x1800; // LDAM daten[451] = 916; // pathCount daten[452] = 0x3440; // ADD daten[453] = 1; daten[454] = 0x2800; // STAM daten[455] = 916; // pathCount // Check if currentOut == start // calculate currentOut - start daten[456] = 0x1800; // LDAM daten[457] = 900; // start daten[458] = 0x3540; // NOT daten[459] = 0; daten[460] = 0x3440; // ADD daten[461] = 1; // -start daten[462] = 0x2800; // STAM daten[463] = 467; // operand of ADD at 466 daten[464] = 0x1800; // LDAM daten[465] = 914; // currentOut daten[466] = 0x3440; // ADD daten[467] = 0; // -start daten[468] = 0x4018; // BZ daten[469] = 490; // start reached -> finalize output buffer // currentOut = previous[currentOut] daten[470] = 0x1800; // LDAM daten[471] = 914; // currentOut daten[472] = 0x3440; // ADD daten[473] = 620; // previous base daten[474] = 0x2800; // STAM daten[475] = 477; // operand of LDAM at 476 daten[476] = 0x1800; // LDAM daten[477] = 0; // previous[currentOut] daten[478] = 0x2800; // STAM daten[479] = 914; // currentOut = previous[currentOut] daten[480] = 0x4000; // BA daten[481] = 432; // BUILD_OUTPUT_BUFFER_LOOP // ------------------------------------------------------------ // FINALIZE_OUTPUT_BUFFER // outputBuffer[1] = pathCount // ------------------------------------------------------------ daten[490] = 0x1800; // LDAM daten[491] = 916; // pathCount daten[492] = 0x2800; // STAM daten[493] = 941; // outputBuffer[1] = pathCount // outPtr = 940 daten[494] = 0x1400; // LDA daten[495] = 940; daten[496] = 0x2800; // STAM daten[497] = 918; // outPtr // outCount = 10 daten[498] = 0x1400; // LDA daten[499] = 10; daten[500] = 0x2800; // STAM daten[501] = 919; // outCount // ------------------------------------------------------------ // OUTPUT_BUFFER_LOOP at 502 // Outputs exactly 10 words. The first 9 values appear at PC 512. // The last value appears at PC 544 and then the machine halts. // ------------------------------------------------------------ // if outCount == 1: LAST_OUTPUT daten[502] = 0x1800; // LDAM daten[503] = 919; // outCount daten[504] = 0x3440; // ADD daten[505] = 0xFFFF; // outCount - 1 daten[506] = 0x4018; // BZ daten[507] = 540; // LAST_OUTPUT // Normal output value = daten[outPtr] daten[508] = 0x1800; // LDAM daten[509] = 918; // outPtr daten[510] = 0x2800; // STAM daten[511] = 513; // operand of LDAM at 512 daten[512] = 0x1800; // LDAM daten[513] = 0; // output value in Accu // outPtr = outPtr + 1 daten[514] = 0x1800; // LDAM daten[515] = 918; // outPtr daten[516] = 0x3440; // ADD daten[517] = 1; daten[518] = 0x2800; // STAM daten[519] = 918; // outPtr // outCount = outCount - 1 daten[520] = 0x1800; // LDAM daten[521] = 919; // outCount daten[522] = 0x3440; // ADD daten[523] = 0xFFFF; // -1 daten[524] = 0x2800; // STAM daten[525] = 919; // outCount daten[526] = 0x4000; // BA daten[527] = 502; // OUTPUT_BUFFER_LOOP // ------------------------------------------------------------ // LAST_OUTPUT // Load final buffer word and halt immediately, so Accu remains useful. // ------------------------------------------------------------ daten[540] = 0x1800; // LDAM daten[541] = 918; // outPtr daten[542] = 0x2800; // STAM daten[543] = 545; // operand of LDAM at 544 daten[544] = 0x1800; // LDAM daten[545] = 0; // final output value in Accu // HALT //daten[546] = 0x4000; // BA //daten[547] = 546; // endless loop, Accu unchanged // endless loop, Accu unchanged // end // Arrays daten[600] = 30000; // dist-Array daten[601] = 30000; // dist-Array daten[602] = 30000; // dist-Array daten[603] = 30000; // dist-Array daten[604] = 30000; // dist-Array daten[605] = 30000; // dist-Array daten[606] = 30000; // dist-Array daten[607] = 30000; // dist-Array daten[608] = 600; // dist-Array Index, Pointer to active Array Adress daten[610] = 0; // visited-Array daten[611] = 0; // visited-Array daten[612] = 0; // visited-Array daten[613] = 0; // visited-Array daten[614] = 0; // visited-Array daten[615] = 0; // visited-Array daten[616] = 0; // visited-Array daten[617] = 0; // visited-Array daten[618] = 610; // visited-Array Index, Pointer to active Array Adress daten[620] = 0xFFFF; // previous-Array daten[621] = 0xFFFF; // previous-Array daten[622] = 0xFFFF; // previous-Array daten[623] = 0xFFFF; // previous-Array daten[624] = 0xFFFF; // previous-Array daten[625] = 0xFFFF; // previous-Array daten[626] = 0xFFFF; // previous-Array daten[627] = 0xFFFF; // previous-Array daten[628] = 620; // previous-Array Index, Pointer to active Array Adress // // Cities /* adjStart */ daten[700] = 800; // Wien daten[701] = 807; // Linz daten[702] = 814; // Salzburg daten[703] = 821; // Graz daten[704] = 830; // Innsbruck daten[705] = 835; // Klagenfurt daten[706] = 844; // StPoelten daten[707] = 849; // Eisenstadt /* Wien */ daten[800] = 6; daten[801] = 65; daten[802] = 3; daten[803] = 200; daten[804] = 7; daten[805] = 60; daten[806] = 0xFFFF; /* Linz */ daten[807] = 6; daten[808] = 115; daten[809] = 2; daten[810] = 132; daten[811] = 3; daten[812] = 220; daten[813] = 0xFFFF; /* Salzburg */ daten[814] = 1; daten[815] = 132; daten[816] = 4; daten[817] = 185; daten[818] = 5; daten[819] = 220; daten[820] = 0xFFFF; /* Graz */ daten[821] = 0; daten[822] = 200; daten[823] = 5; daten[824] = 140; daten[825] = 1; daten[826] = 220; daten[827] = 7; daten[828] = 170; daten[829] = 0xFFFF; /* Innsbruck */ daten[830] = 2; daten[831] = 185; daten[832] = 5; daten[833] = 300; daten[834] = 0xFFFF; /* Klagenfurt */ daten[835] = 3; daten[836] = 140; daten[837] = 2; daten[838] = 220; daten[839] = 4; daten[840] = 300; daten[841] = 7; daten[842] = 260; daten[843] = 0xFFFF; /* StPoelten */ daten[844] = 0; daten[845] = 65; daten[846] = 1; daten[847] = 115; daten[848] = 0xFFFF; /* Eisenstadt */ daten[849] = 0; daten[850] = 60; daten[851] = 3; daten[852] = 170; daten[853] = 5; daten[854] = 260; daten[855] = 0xFFFF; // Variables daten[900] = 7; // Start daten[901] = 4; // Target daten[902] = 7; // Step daten[903] = 0; // current daten[904] = 0; // nearest daten[905] = 0; // best dist daten[906] = 0; // new dist daten[907] = 0; // Index i daten[908] = 0; // neighbor daten[909] = 0; // temp variable daten[910] = 0; // p daten[911] = 0; // edgeDist; daten[912] = 0; // distNearest; daten[913] = 0; // distNeighbor; daten[914] = 0; // currentOut daten[915] = 0; // pathPtr daten[916] = 0; // pathCount daten[917] = 0; // negTarget = -target, computed at startup daten[918] = 0; // outPtr / output buffer pointer daten[919] = 0; // outCount / number of output words left daten[940] = 0; // output buffer: distance daten[941] = 0; // output buffer: pathCount daten[942] = 0; // output buffer: city 0, reverse order daten[943] = 0; // output buffer: city 1 daten[944] = 0; // output buffer: city 2 daten[945] = 0; // output buffer: city 3 daten[946] = 0; // output buffer: city 4 daten[947] = 0; // output buffer: city 5 daten[948] = 0; // output buffer: city 6 daten[949] = 0; // output buffer: city 7 // daten[950..957] are free again; old path buffer no longer used.