Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- one_instruction(state(Acc, Pc, Mem, In, Out, Flag),
- state(NewAcc, NewPc, NewMem, NewIn, NewOut, NewFlag)):-
- nth0(Pc,Mem,Cell),
- Op is div(Cell,100),
- Address is mod(Cell,100),
- operator(Op,Address,Mem,Acc,NewAcc,Pc,NewPc, NewMem, In, NewIn,Out,NewOut, Flag, NewFlag).
- %add
- %
- operator(1,Address,Mem,Acc,NewAcc,Pc,NewPc,Mem,In,In,Out,Out,Flag, NewFlag):-
- pc_update(Pc,NewPc),
- nth0(Address,Mem,Value),
- somma(NewAcc, Acc, Value, Flag, NewFlag).
- %sub
- %
- operator(2,Address,Mem,Acc,NewAcc,Pc,NewPc,Mem,In,In,Out,Out,Flag,NewFlag):-
- pc_update(Pc,NewPc),
- nth0(Address,Mem,Value),
- sott(NewAcc, Acc, Value, Flag, NewFlag).
- %store
- operator(3,Address,Mem,Acc,Acc,Pc,NewPc,NewMem,In,In,Out,Out,_,_):-
- pc_update(Pc,NewPc),
- fun(Mem, Address, Acc, _, NewMem),!.
- %load
- operator(5,Address,Mem,_,NewAcc,Pc,NewPc,Mem,In,In,Out,Out,_,_):-
- pc_update(Pc,NewPc),
- nth0(Address, Mem, NewAcc).
- %branch
- operator(6,Address,Mem,Acc,Acc,_,Address,Mem,In,In,Out,Out,_,_):- Address < 100.
- %branch if zero
- operator(7,Address,Mem,Acc,Acc,_,Address,Mem,In,In,Out,Out,_,_):- Acc = 0.
- operator(7,_,Mem,Acc,Acc,Pc,NewPc,Mem,In,In,Out,Out,_,_):- pc_update(Pc,NewPc).
- %input:
- operator(9, 01,Mem,_,NewAcc,Pc,NewPc,Mem, In, NewIn,Out,Out,_,_):-
- pc_update(Pc,NewPc),
- input(In, NewAcc),
- nth0(0, In, _, NewIn),!.
- %operator(9,Address,Mem,Acc,_,Pc,_,_,In,_,Out,_,Flag, _):-
- %not(Address=1), not(Address=2), halted_state(state(Acc, Pc, Mem, In,
- %Out, Flag)),!.
- %output:
- operator(9, 02, Mem,Acc,Acc,Pc,NewPc,Mem,In,In,Out,NewOut,_,_):- pc_update(Pc,NewPc), append(Out, [Acc], NewOut),!.
- %fine
- operator(0,_, Mem,NewAcc,NewAcc,NewPc,NewPc,Mem,NewIn,NewIn,_,NewOut,_,_):-
- halted_state(state(NewAcc, NewPc, Mem, NewIn, NewOut, Flag)), true.
- operator(4,_, Mem,NewAcc,NewAcc,NewPc,NewPc,Mem,NewIn,NewIn,_,NewOut,_,_):-
- halted_state(state(NewAcc, NewPc, Mem, NewIn, NewOut, Flag)), true.
- halted_state(state(_, Pc, Mem, _,_,_)):-
- nth0(Pc,Mem,Cell),
- Op is div(Cell,100),
- Op is 0,!.
- execution_loop(state(NewAcc, NewPc, NewMem, NewIn, Out, Flag), Out):- halted_state(state(NewAcc, NewPc, NewMem, NewIn, NewOut, Flag)), write("finito"),!.
- execution_loop(state(Acc, Pc, Mem, In, Out, Flag), Out2):-
- one_instruction(state(Acc, Pc, Mem, In, Out, Flag), state(NewAcc, NewPc, NewMem, NewIn, NewOut, NewFlag)),
- execution_loop(state(NewAcc, NewPc, NewMem, NewIn, NewOut, NewFlag), Out2).
- %Qui sotto lo schifo. Poi creiamo un secondo file di moduli magari
- %
- %
- %
- %aggiunge in posizione indice
- fun(List, Indice, Val, NewList, X):- nth0(Indice, NewList, Val, List), NewIndice is Indice+1, fun2(NewList, NewIndice, _, X),!.
- %%toglie da indice +1
- fun2(List, Indice,_, NewList):- nth0(Indice, List, _, NewList).
- %aggiunge in testa
- input([H], H).
- input([H | _], H).
- %non serve, ma la memoria dovra' avere 100 posizioni
- mem(Index,[0|T]):- Index < 100, NewIndex is 1+Index, mem(NewIndex,T),!.
- mem(Index,[0]):- Index is 99.
- pc_update(Pc,NewPc):-Pc<99,NewPc is Pc+1,!.
- pc_update(Pc,NewPc):-Pc=99,NewPc is 0.
- sott(NewAcc, Acc, Value, 0, NewFlag):- Temp is Acc-Value, Temp < 0, NewAcc is Temp + 1000, NewFlag is 1,!.
- sott(NewAcc, Acc, Value, 1, NewFlag):- Temp is Acc-Value, Temp < 0, NewAcc is Temp + 1000, NewFlag is 0,!.
- sott(NewAcc, Acc, Value, 0, NewFlag):- Temp is Acc-Value, Temp > 0, NewAcc is Temp, NewFlag is 0,!.
- sott(NewAcc, Acc, Value, 1, NewFlag):- Temp is Acc-Value, Temp > 0, NewAcc is Temp, NewFlag is 1,!.
- somma(NewAcc, Acc, Value, _, NewFlag) :- Temp is Acc+Value, Temp >= 1000,!, NewAcc is mod(Temp, 1000), NewFlag is 1.
- somma(NewAcc, Acc, Value, Flag, NewFlag) :- Temp is Acc+Value, NewAcc is Temp, flag(Flag, NewFlag).
- flag(Flag, NewFlag):- Flag is 0, NewFlag is 0,!.
- flag(Flag, NewFlag):- Flag is 1, NewFlag is 1,!.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement