Advertisement
Guest User

Untitled

a guest
Dec 5th, 2018
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 6 4.25 KB | None | 0 0
  1.  
  2. one_instruction(state(Acc, Pc, Mem, In, Out, Flag),
  3.                 state(NewAcc, NewPc, NewMem, NewIn, NewOut, NewFlag)):-
  4.                 nth0(Pc,Mem,Cell),
  5.                 Op is div(Cell,100),
  6.                 Address is mod(Cell,100),
  7.                 operator(Op,Address,Mem,Acc,NewAcc,Pc,NewPc, NewMem, In, NewIn,Out,NewOut, Flag, NewFlag).
  8. %add
  9. %
  10.  
  11. operator(1,Address,Mem,Acc,NewAcc,Pc,NewPc,Mem,In,In,Out,Out,Flag, NewFlag):-
  12.                 pc_update(Pc,NewPc),
  13.                 nth0(Address,Mem,Value),
  14.                 somma(NewAcc, Acc, Value, Flag, NewFlag).
  15. %sub
  16. %
  17. operator(2,Address,Mem,Acc,NewAcc,Pc,NewPc,Mem,In,In,Out,Out,Flag,NewFlag):-
  18.                 pc_update(Pc,NewPc),
  19.                 nth0(Address,Mem,Value),
  20.                 sott(NewAcc, Acc, Value, Flag, NewFlag).
  21. %store
  22. operator(3,Address,Mem,Acc,Acc,Pc,NewPc,NewMem,In,In,Out,Out,_,_):-
  23.                 pc_update(Pc,NewPc),
  24.                 fun(Mem, Address, Acc, _, NewMem),!.
  25.  
  26. %load
  27. operator(5,Address,Mem,_,NewAcc,Pc,NewPc,Mem,In,In,Out,Out,_,_):-
  28.                 pc_update(Pc,NewPc),
  29.                 nth0(Address, Mem, NewAcc).
  30.  
  31.  
  32. %branch
  33. operator(6,Address,Mem,Acc,Acc,_,Address,Mem,In,In,Out,Out,_,_):- Address < 100.
  34.  
  35. %branch if zero
  36. operator(7,Address,Mem,Acc,Acc,_,Address,Mem,In,In,Out,Out,_,_):- Acc = 0.
  37. operator(7,_,Mem,Acc,Acc,Pc,NewPc,Mem,In,In,Out,Out,_,_):- pc_update(Pc,NewPc).
  38.  
  39.  
  40.  
  41. %input:
  42. operator(9, 01,Mem,_,NewAcc,Pc,NewPc,Mem, In, NewIn,Out,Out,_,_):-
  43.                 pc_update(Pc,NewPc),
  44.                 input(In, NewAcc),
  45.                nth0(0, In, _, NewIn),!.
  46.  
  47. %operator(9,Address,Mem,Acc,_,Pc,_,_,In,_,Out,_,Flag, _):-
  48.  %not(Address=1), not(Address=2), halted_state(state(Acc, Pc, Mem, In,
  49.  %Out, Flag)),!.
  50.  
  51.                                                                                                                                  %output:
  52. operator(9, 02, Mem,Acc,Acc,Pc,NewPc,Mem,In,In,Out,NewOut,_,_):- pc_update(Pc,NewPc), append(Out, [Acc], NewOut),!.
  53.  
  54.  
  55.  
  56. %fine
  57. operator(0,_, Mem,NewAcc,NewAcc,NewPc,NewPc,Mem,NewIn,NewIn,_,NewOut,_,_):-
  58.                 halted_state(state(NewAcc, NewPc, Mem, NewIn, NewOut, Flag)), true.
  59. operator(4,_, Mem,NewAcc,NewAcc,NewPc,NewPc,Mem,NewIn,NewIn,_,NewOut,_,_):-
  60.                 halted_state(state(NewAcc, NewPc, Mem, NewIn, NewOut, Flag)), true.
  61.  
  62.  
  63.  
  64. halted_state(state(_, Pc, Mem, _,_,_)):-
  65.                 nth0(Pc,Mem,Cell),
  66.                 Op is div(Cell,100),
  67.                 Op is 0,!.
  68.  
  69.  
  70. execution_loop(state(NewAcc, NewPc, NewMem, NewIn, Out, Flag), Out):- halted_state(state(NewAcc, NewPc, NewMem, NewIn, NewOut, Flag)), write("finito"),!.
  71.  
  72. execution_loop(state(Acc, Pc, Mem, In, Out, Flag), Out2):-
  73.                 one_instruction(state(Acc, Pc, Mem, In, Out, Flag), state(NewAcc, NewPc, NewMem, NewIn, NewOut, NewFlag)),
  74.                  execution_loop(state(NewAcc, NewPc, NewMem, NewIn, NewOut, NewFlag), Out2).
  75.  
  76.  
  77.  
  78.  
  79.  
  80. %Qui sotto lo schifo. Poi creiamo un secondo file di moduli magari
  81. %
  82. %
  83. %
  84.  
  85.  
  86. %aggiunge in posizione indice
  87. fun(List, Indice, Val, NewList, X):- nth0(Indice, NewList, Val, List), NewIndice is Indice+1, fun2(NewList, NewIndice, _, X),!.
  88. %%toglie da indice +1
  89. fun2(List, Indice,_, NewList):- nth0(Indice, List, _, NewList).
  90.  
  91. %aggiunge in testa
  92. input([H], H).
  93. input([H | _], H).
  94.  
  95. %non serve, ma la memoria dovra' avere 100 posizioni
  96. mem(Index,[0|T]):- Index < 100, NewIndex is 1+Index, mem(NewIndex,T),!.
  97. mem(Index,[0]):- Index is 99.
  98.  
  99.  
  100.  
  101. pc_update(Pc,NewPc):-Pc<99,NewPc is Pc+1,!.
  102. pc_update(Pc,NewPc):-Pc=99,NewPc is 0.
  103.  
  104.  
  105. sott(NewAcc, Acc, Value, 0, NewFlag):-  Temp is Acc-Value, Temp < 0, NewAcc is Temp + 1000, NewFlag is 1,!.
  106.  
  107. sott(NewAcc, Acc, Value, 1, NewFlag):-  Temp is Acc-Value, Temp < 0, NewAcc is Temp + 1000, NewFlag is 0,!.
  108.  
  109. sott(NewAcc, Acc, Value, 0, NewFlag):-  Temp is Acc-Value, Temp > 0, NewAcc is Temp, NewFlag is 0,!.
  110.  
  111. sott(NewAcc, Acc, Value, 1, NewFlag):-  Temp is Acc-Value, Temp > 0, NewAcc is Temp, NewFlag is 1,!.
  112.  
  113.  
  114.  
  115.  
  116.  
  117. somma(NewAcc, Acc, Value, _, NewFlag) :- Temp is Acc+Value, Temp >= 1000,!, NewAcc is mod(Temp, 1000), NewFlag is 1.
  118.  
  119. somma(NewAcc, Acc, Value, Flag, NewFlag) :- Temp is Acc+Value,  NewAcc is Temp, flag(Flag, NewFlag).
  120. flag(Flag, NewFlag):- Flag is 0, NewFlag is 0,!.
  121. flag(Flag, NewFlag):- Flag is 1, NewFlag is 1,!.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement