Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %% ?- one_instruction(state(1, 0, [101, 102, 101], [100] ,[6, 7, 8, 9], 0), X).
- %
- %% X = state(103, 1, [101, 102, 101], [100], [6, 7, 8, 9], 0).
- %
- %
- one_instruction(state(Acc, Pc, Mem, In, Out, Flag),
- state(NewAcc, NewPc, NewMem, NewIn, NewOut, Flag)):-
- 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).
- %add
- operator(1,Address,Mem,Acc,NewAcc,Pc,NewPc,Mem,In,In,Out,Out):- pc_update(Pc,NewPc),
- nth0(Address,Mem,Value),NewAcc is Acc+Value.
- %sub
- operator(2,Address,Mem,Acc,NewAcc,Pc,NewPc,Mem,In,In,Out,Out):- pc_update(Pc,NewPc),
- nth0(Address,Mem,Value),NewAcc is Acc-Value.
- %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).
- %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,_,_,_,_,_,_,_,_,_,_,_):- halt(0).
- operator(4,_,_,_,_,_,_,_,_,_,_,_):- halt(4).
- %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=99 non serve ad un cazzo, è già maggiore di 99 per conoscenza
- %pregressa.
- pc_update(Pc,NewPc):-Pc=99,NewPc is 0.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement