Mercurial > repo
comparison interps/egobch/src/bchi.c @ 996:859f9b4339e6
<Gregor> tar xf egobot.tar.xz
author | HackBot |
---|---|
date | Sun, 09 Dec 2012 19:30:08 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
995:6883f5911eb7 | 996:859f9b4339e6 |
---|---|
1 /* | |
2 * Copyright (C) 2005 Gregor Richards | |
3 * | |
4 * This file is part of EgoBCh. | |
5 * | |
6 * EgoBCh is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * EgoBCh is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with EgoBCh; if not, write to the Free Software | |
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
19 */ | |
20 | |
21 #include <math.h> | |
22 #include <stdio.h> | |
23 | |
24 #include "bchi.h" | |
25 #include "egobch.h" | |
26 | |
27 #define LOGTWO 0.693147 | |
28 #define SETBIT(a) (7 - (int) (log((double) (a)) / LOGTWO)) | |
29 | |
30 void binaryo() | |
31 { | |
32 int i, j; | |
33 unsigned char vbit; | |
34 unsigned char *curmem; | |
35 for (i = -2; i <= 2; i++) { | |
36 curmem = mptr + i; | |
37 if (curmem < mem) continue; | |
38 for (j = 7; j >= 0; j--) { | |
39 vbit = 1 << j; | |
40 if (i == 0 && vbit == membit) | |
41 putchar('*'); | |
42 if (*curmem & vbit) | |
43 putchar('1'); | |
44 else | |
45 putchar('0'); | |
46 } | |
47 } | |
48 putchar('\n'); | |
49 } | |
50 | |
51 void bch_interpret() | |
52 { | |
53 int input, shft; | |
54 unsigned char toout; | |
55 struct bchi *cur; | |
56 | |
57 while (1) { | |
58 cur = prog + pptr; | |
59 /*printf("%d %d %x\n", mptr - mem, SETBIT(membit), (unsigned int) *mptr);*/ | |
60 | |
61 switch (cur->cmd) { | |
62 case RTGL: | |
63 /* 1) move right */ | |
64 membit >>= 1; | |
65 if (membit == 0) { | |
66 membit = 0x80; | |
67 mptr++; | |
68 } | |
69 | |
70 /* 2) check for I/O */ | |
71 if (mptr == mem && membit == 0x04) { | |
72 /* 2a) check whether to do input or output */ | |
73 if (*mem & 0x01) { | |
74 /* 2ai) output */ | |
75 putchar(mem[1]); | |
76 fflush(stdout); | |
77 } else { | |
78 /* 2aii) input */ | |
79 input = getchar(); | |
80 /* 2aiii) check for EOF */ | |
81 if (input == EOF) { | |
82 /* mark it */ | |
83 *mem |= 0x02; | |
84 } else { | |
85 mem[1] = (char) input; | |
86 } | |
87 } | |
88 } else { | |
89 /* 3) toggle */ | |
90 *mptr ^= membit; | |
91 } | |
92 pptr++; | |
93 break; | |
94 | |
95 case LFT: | |
96 /* move left */ | |
97 membit <<= 1; | |
98 if (membit == 0) { | |
99 membit = 0x01; | |
100 mptr--; | |
101 } | |
102 pptr++; | |
103 break; | |
104 | |
105 case LPO: | |
106 /* loop opening */ | |
107 if (*mptr & membit) { | |
108 /* go into the loop */ | |
109 pptr++; | |
110 } else { | |
111 /* jump the loop */ | |
112 pptr = cur->arg1 + 1; | |
113 } | |
114 break; | |
115 | |
116 case LPC: | |
117 /* loop close, jump to the beginning */ | |
118 pptr = cur->arg1; | |
119 break; | |
120 | |
121 case OUT: | |
122 /* lazy_io output */ | |
123 shft = SETBIT(membit); | |
124 toout = *mptr << shft; | |
125 | |
126 shft = 8 - shft; | |
127 toout |= mptr[1] >> shft; | |
128 | |
129 putchar(toout); | |
130 fflush(stdout); | |
131 pptr++; | |
132 break; | |
133 | |
134 case INP: | |
135 /* lazy_io input */ | |
136 input = getchar(); | |
137 if (input == EOF) input = 0; | |
138 toout = (char) input; | |
139 | |
140 /* shift it in */ | |
141 shft = SETBIT(membit); | |
142 *mptr &= ~(0xFF >> shft); | |
143 *mptr |= toout >> shft; | |
144 | |
145 shft = 8 - shft; | |
146 mptr[1] &= ~(0xFF << shft); | |
147 mptr[1] |= toout << shft; | |
148 pptr++; | |
149 break; | |
150 | |
151 case DBG: | |
152 binaryo(); | |
153 pptr++; | |
154 break; | |
155 | |
156 case FIN: | |
157 return; | |
158 | |
159 default: | |
160 pptr++; | |
161 } | |
162 } | |
163 } |