procedure interpret; var // PC est la position de l'instruction dans le code // SP est la position courante du sommet de la pile pc, sp, j, k, n: integer; i: instr; // Instruction en cours de traitement c: char; h: boolean; // Quitter le programme begin pc := 0; h := false; repeat i := code[pc]; pc := pc + 1; case i.op of add: begin m[sp + 1] := m[sp + 1] + m[sp]; sp := sp + 1 end; neg: m[sp] := -m[sp]; mul: begin m[sp + 1] := m[sp + 1] * m[sp]; sp := sp + 1 end; divd: begin m[sp + 1] := m[sp + 1] div m[sp]; sp := sp + 1 end; remd: begin m[sp + 1] := m[sp + 1] mod m[sp]; sp := sp + 1 end; div2: m[sp] := m[sp] div 2; rem2: m[sp] := m[sp] mod 2; eqli: begin m[sp + 1] := ord(m[sp + 1] = m[sp]); sp := sp + 1 end; neqi: begin m[sp + 1] := ord(m[sp + 1] <> m[sp]); sp := sp + 1 end; lssi: begin m[sp + 1] := ord(m[sp + 1] < m[sp]); sp := sp + 1 end; leqi: begin m[sp + 1] := ord(m[sp + 1] <= m[sp]); sp := sp + 1 end; gtri: begin m[sp + 1] := ord(m[sp + 1] > m[sp]); sp := sp + 1 end; geqi: begin m[sp + 1] := ord(m[sp + 1] >= m[sp]); sp := sp + 1 end; dupl: begin sp := sp - 1; m[sp] := m[sp + 1] end; swap: begin k := m[sp]; m[sp] := m[sp + 1]; m[sp + 1] := k end; andb: begin if m[sp] = 0 then m[sp + 1] := 0; sp := sp + 1 end; orb: begin if m[sp] = 1 then m[sp + 1] := 1; sp := sp + 1 end; load: m[sp] := m[m[sp]]; stor: begin m[m[sp]] := m[sp + 1]; sp := sp + 2 end; hhalt: h := true; (* Entrée/sortie *) wri: begin write(m[sp + 1]: m[sp]); sp := sp + 2 end; wrc: begin write(chr(m[sp])); sp := sp + 1 end; wrl: writeln; rdi: begin read(m[m[sp]]); sp := sp + 1 end; rdc: begin read(c); m[m[sp]] := ord(c); sp := sp + 1 end; rdl: readln; eol: begin sp := sp - 1; m[sp] := ord(eoln(input)) end; (* Entrée/sortie *) ldc: begin sp := sp - 1; m[sp] := i.a end; ldla: begin sp := sp - 1; m[sp] := sp + 1 + i.a end; ldl: begin sp := sp - 1; m[sp] := m[sp + 1 + i.a] end; ldg: begin sp := sp - 1; m[sp] := m[i.a] end; stl: begin m[sp + i.a] := m[sp]; sp := sp + 1 end; stg: begin m[i.a] := m[sp]; sp := sp + 1 end; move: begin k := m[sp]; j := m[sp + 1]; sp := sp + 2; n := i.a; repeat n := n - 1; m[k + n] := m[j + n]until n = 0 end; copy: begin j := m[sp]; n := i.a; sp := sp - n + 1; repeat n := n - 1; m[sp + n] := m[j + n]until n = 0 end; addc: m[sp] := m[sp] + i.a; mulc: m[sp] := m[sp] * i.a; jump: pc := i.a; jumpz: begin if m[sp] = 0 then pc := i.a; sp := sp + 1 end; call: begin sp := sp - 1; m[sp] := pc; pc := i.a end; adjs: sp := sp + i.a; sets: sp := i.a; exit: begin pc := m[sp]; sp := sp + i.a end; end until h end;