spo/ass1/bonus/dijkstra.asm
2025-11-14 16:50:02 +01:00

86 lines
2.7 KiB
NASM

DIJKSTRA START 0
.zacetna inicializacija, d=0
LDA #0
STA RAZDALJE, START
STA PROV, START
.zacetno vozlisce nima predhodnika
LDA #-1
STA PREV, START
.neskoncna while zanka
WHILE LDS #-1 . S = -1, hrani vozlisce ki imam min razdaljo v okolici
LDX #0 . stevec = 0
FOR1 LDA PROV, X . nalozi potencialno razdaljo sosednjega vozlisca v okolici
CMP #-1
JEQ NEXT . ce ze obiskano=-2 ali neobiskano=-1 preskoci vozlisce
CMP #-2
JEQ NEXT
RMO S, A . sicer S v A
CMP #-1 . ce S se ni nastavljen ga nastavi prvic
JEQ SET
STA old_X . sicer poglej ali ima trenutno vozl. manjso pot. razdaljo prov[X] < prov[S]
LDA PROV, X . nalozi p. razdaljo tren. vozl.
RMO A, T . shrani jo v T reg.
RMO S, X . premakni trenutni ix min. vozl. v X za ix naslavljanje
LDA PROV, X . nalozi trenutno min razdaljo
LDX old_X . obnovi X, vrednost stevca zanke FOR1
COMPR A, T . primerjaj vrednosti tj. ce razdalja ni krajsa preskoci, sicer SET
JEQ NEXT
JGT NEXT
SET RMO X, S . S nastavi na ix vozlisca - trenutna iteracija
NEXT TIX INPUT_V
J FOR1
. ce ni vec vozlisc v okolici koncaj
RMO S, A
CMP #-1
JEQ HALT
.sicer p. razdaljo shrani kot dejansko in oznaci vozlisce kot obiskano
RMO S, X
STA D, X
LDA #-2
STA PROV, X
.nato dodaj vozlisca v okolico oz. posodobi razdalje obstojecih vozlisc v okolici
LDX #0 . stevec na 0
FOR2 LDA INPUT_X, X . preveri ali je to povezava ki izvira v vozl. S
COMPR A, S
JGT NEXT2 . ce ni preskoci
JLT NEXT2
.sicer preveri ali je vozlisce neobiskano
LDA PROV, X
CMP #-1
JGT NEXT2
JLT NEXT2
STA old_X . zacasno zamenjaj vrednost X
LDX INPUT_Y, X
LDA D, X .nalozi D[Y] v A
RMO A, T .zacasno shrani v T
LDA INPUT_W, X
ADDR T, A
STA prov, X . prov[Y] = D[S] + W
RMO A, X
NEXT2 TIX INPUT_V
J FOR2
. J ZA WHILE?!
HALT J HALT
END DIJKSTRA
.vhodni parametri
INPUT_V = 9
INPUT_E = 16
INPUT_X RESW 100
INPUT_Y RESW 100
INPUT_W RESW 100
.pomozne spremenljivke
old_X RESW 1
.najkrajse razdalje
D RESW 9
.prejsnje vozlisce
PREV RESW 9
.provisional razdalje (okolica), -2 = done, -1 neobiskan
PROV RESW 9
.indeks zacetnega vozlisca
START WORD 0