IPS(Interpreter for Process Structures) for mbed
Dependencies: ConfigFile FATFileSystem mbed
IPS port from linux/unix version.
mbed_blinky.ips
0 VAR led1 " LED1 " DigitalOut led1 ! : main ANFANG 1 JA? 1 led1 @ write 200 wait_ms 0 led1 @ write 200 wait_ms DANN/NOCHMAL ; main
- ips-02.tgz - ips for linux/unix
- ipsdoc.zip - document
- https://bitbucket.org/va009039/ips/
BaseIPS.cpp@4:b62b40563944, 2015-05-24 (annotated)
- Committer:
- va009039
- Date:
- Sun May 24 21:29:48 2015 +0900
- Revision:
- 4:b62b40563944
- Parent:
- 2:908338b1151a
fix I2C
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 |
2:908338b1151a | 1 | // BaseIPS.cpp 2015/5/22 |
va009039 |
2:908338b1151a | 2 | #include <algorithm> |
va009039 |
1:e74530ad6b9e | 3 | #include "mbed.h" |
va009039 |
1:e74530ad6b9e | 4 | #include "BaseIPS.h" |
va009039 |
1:e74530ad6b9e | 5 | |
va009039 |
2:908338b1151a | 6 | #ifndef NO_MATH |
va009039 |
1:e74530ad6b9e | 7 | #include <math.h> |
va009039 |
1:e74530ad6b9e | 8 | #define Round(x) ( (x>=0) ? (int)(x+0.5) : (int)(x-0.5) ) |
va009039 |
2:908338b1151a | 9 | #endif |
va009039 |
1:e74530ad6b9e | 10 | |
va009039 |
1:e74530ad6b9e | 11 | BaseIPS::BaseIPS() { |
va009039 |
1:e74530ad6b9e | 12 | PS = 0xfff8; |
va009039 |
1:e74530ad6b9e | 13 | RS = 0x4f8; |
va009039 |
1:e74530ad6b9e | 14 | depth=0; |
va009039 |
1:e74530ad6b9e | 15 | idle=0; |
va009039 |
1:e74530ad6b9e | 16 | input_ptr = 512; |
va009039 |
1:e74530ad6b9e | 17 | cycle = 0; |
va009039 |
1:e74530ad6b9e | 18 | inputfile = NULL; |
va009039 |
1:e74530ad6b9e | 19 | } |
va009039 |
1:e74530ad6b9e | 20 | |
va009039 |
1:e74530ad6b9e | 21 | u16 BaseIPS::peek(u16 a) { |
va009039 |
1:e74530ad6b9e | 22 | return peekB(a) | peekB(a + 1)<<8; |
va009039 |
1:e74530ad6b9e | 23 | } |
va009039 |
1:e74530ad6b9e | 24 | |
va009039 |
1:e74530ad6b9e | 25 | void BaseIPS::poke(u16 a, u16 w) { |
va009039 |
1:e74530ad6b9e | 26 | pokeB(a, w & 0xff); |
va009039 |
1:e74530ad6b9e | 27 | pokeB(a + 1, w>>8); |
va009039 |
1:e74530ad6b9e | 28 | } |
va009039 |
1:e74530ad6b9e | 29 | |
va009039 |
1:e74530ad6b9e | 30 | u32 BaseIPS::peek32(u16 a) { |
va009039 |
1:e74530ad6b9e | 31 | return peekB(a) | peekB(a + 1)<<8 | peekB(a + 2)<<16 | peekB(a + 3)<<24; |
va009039 |
1:e74530ad6b9e | 32 | } |
va009039 |
1:e74530ad6b9e | 33 | |
va009039 |
1:e74530ad6b9e | 34 | |
va009039 |
1:e74530ad6b9e | 35 | void BaseIPS::push_ps(u16 w) { |
va009039 |
1:e74530ad6b9e | 36 | PS -= 2; |
va009039 |
1:e74530ad6b9e | 37 | poke(PS, w); |
va009039 |
1:e74530ad6b9e | 38 | } |
va009039 |
1:e74530ad6b9e | 39 | |
va009039 |
1:e74530ad6b9e | 40 | u16 BaseIPS::pull_ps() { |
va009039 |
1:e74530ad6b9e | 41 | PS += 2; |
va009039 |
1:e74530ad6b9e | 42 | return peek(PS - 2); |
va009039 |
1:e74530ad6b9e | 43 | } |
va009039 |
1:e74530ad6b9e | 44 | |
va009039 |
1:e74530ad6b9e | 45 | void BaseIPS::push_rs(u16 w) { |
va009039 |
1:e74530ad6b9e | 46 | RS -= 2; |
va009039 |
1:e74530ad6b9e | 47 | poke(RS, w); |
va009039 |
1:e74530ad6b9e | 48 | } |
va009039 |
1:e74530ad6b9e | 49 | |
va009039 |
1:e74530ad6b9e | 50 | u16 BaseIPS::pull_rs() { |
va009039 |
1:e74530ad6b9e | 51 | RS += 2; |
va009039 |
1:e74530ad6b9e | 52 | return peek(RS - 2); |
va009039 |
1:e74530ad6b9e | 53 | } |
va009039 |
1:e74530ad6b9e | 54 | |
va009039 |
1:e74530ad6b9e | 55 | void BaseIPS::c_rumpelstilzchen(void) { // 0 |
va009039 |
1:e74530ad6b9e | 56 | } |
va009039 |
1:e74530ad6b9e | 57 | |
va009039 |
1:e74530ad6b9e | 58 | void BaseIPS::c_defex(void) { // 1 |
va009039 |
1:e74530ad6b9e | 59 | push_rs(PPC); |
va009039 |
1:e74530ad6b9e | 60 | PPC = HP; |
va009039 |
1:e74530ad6b9e | 61 | depth++; |
va009039 |
1:e74530ad6b9e | 62 | } |
va009039 |
1:e74530ad6b9e | 63 | |
va009039 |
2:908338b1151a | 64 | void BaseIPS::c_consex(void) { // 2 |
va009039 |
1:e74530ad6b9e | 65 | push_ps(peek(HP)); |
va009039 |
1:e74530ad6b9e | 66 | } |
va009039 |
1:e74530ad6b9e | 67 | |
va009039 |
1:e74530ad6b9e | 68 | void BaseIPS::c_varex(void) { // 3 |
va009039 |
1:e74530ad6b9e | 69 | push_ps(HP); |
va009039 |
1:e74530ad6b9e | 70 | } |
va009039 |
1:e74530ad6b9e | 71 | |
va009039 |
1:e74530ad6b9e | 72 | void BaseIPS::c_retex(void) { // 4 |
va009039 |
1:e74530ad6b9e | 73 | depth--; |
va009039 |
1:e74530ad6b9e | 74 | PPC = pull_rs(); |
va009039 |
1:e74530ad6b9e | 75 | } |
va009039 |
1:e74530ad6b9e | 76 | |
va009039 |
1:e74530ad6b9e | 77 | void BaseIPS::c_get(void) { // 5 |
va009039 |
1:e74530ad6b9e | 78 | poke(PS, peek(peek(PS))); |
va009039 |
1:e74530ad6b9e | 79 | } |
va009039 |
1:e74530ad6b9e | 80 | |
va009039 |
1:e74530ad6b9e | 81 | void BaseIPS::c_getB(void) { // 6 |
va009039 |
1:e74530ad6b9e | 82 | poke(PS, peekB(peek(PS))); |
va009039 |
1:e74530ad6b9e | 83 | } |
va009039 |
1:e74530ad6b9e | 84 | |
va009039 |
1:e74530ad6b9e | 85 | void BaseIPS::c_put(void) { // 7 |
va009039 |
1:e74530ad6b9e | 86 | u16 a = pull_ps(); |
va009039 |
1:e74530ad6b9e | 87 | u16 v = pull_ps(); |
va009039 |
1:e74530ad6b9e | 88 | if (peek(a) != v) idle=0; |
va009039 |
1:e74530ad6b9e | 89 | poke(a, v); |
va009039 |
1:e74530ad6b9e | 90 | } |
va009039 |
1:e74530ad6b9e | 91 | |
va009039 |
1:e74530ad6b9e | 92 | void BaseIPS::c_putB(void) { // 8 |
va009039 |
1:e74530ad6b9e | 93 | u16 a = pull_ps(); |
va009039 |
1:e74530ad6b9e | 94 | u16 v = pull_ps(); |
va009039 |
1:e74530ad6b9e | 95 | if (peekB(a) != v) idle=0; |
va009039 |
1:e74530ad6b9e | 96 | pokeB(a, v); |
va009039 |
1:e74530ad6b9e | 97 | idle=0; |
va009039 |
1:e74530ad6b9e | 98 | } |
va009039 |
1:e74530ad6b9e | 99 | |
va009039 |
1:e74530ad6b9e | 100 | void BaseIPS::c_1bliteral(void) { // 9 |
va009039 |
1:e74530ad6b9e | 101 | push_ps(peekB(PPC)); |
va009039 |
1:e74530ad6b9e | 102 | PPC++; |
va009039 |
1:e74530ad6b9e | 103 | } |
va009039 |
1:e74530ad6b9e | 104 | |
va009039 |
1:e74530ad6b9e | 105 | void BaseIPS::c_2bliteral(void) { // 10 |
va009039 |
1:e74530ad6b9e | 106 | push_ps(peek(PPC)); |
va009039 |
1:e74530ad6b9e | 107 | PPC += 2; |
va009039 |
1:e74530ad6b9e | 108 | } |
va009039 |
1:e74530ad6b9e | 109 | |
va009039 |
1:e74530ad6b9e | 110 | void BaseIPS::c_bronz(void) { // 11 |
va009039 |
1:e74530ad6b9e | 111 | if ((pull_ps() & 1) == 0) PPC=peek(PPC); |
va009039 |
1:e74530ad6b9e | 112 | else PPC += 2; |
va009039 |
1:e74530ad6b9e | 113 | } |
va009039 |
1:e74530ad6b9e | 114 | |
va009039 |
1:e74530ad6b9e | 115 | void BaseIPS::c_jump(void) { // 12 |
va009039 |
1:e74530ad6b9e | 116 | PPC = peek(PPC); |
va009039 |
1:e74530ad6b9e | 117 | } |
va009039 |
1:e74530ad6b9e | 118 | |
va009039 |
1:e74530ad6b9e | 119 | void BaseIPS::c_weg(void) { // 13 |
va009039 |
1:e74530ad6b9e | 120 | PS += 2; |
va009039 |
1:e74530ad6b9e | 121 | } |
va009039 |
1:e74530ad6b9e | 122 | |
va009039 |
1:e74530ad6b9e | 123 | void BaseIPS::c_pweg(void) { // 14 |
va009039 |
1:e74530ad6b9e | 124 | PS += 4; |
va009039 |
1:e74530ad6b9e | 125 | } |
va009039 |
1:e74530ad6b9e | 126 | |
va009039 |
1:e74530ad6b9e | 127 | void BaseIPS::c_plus(void) { // 15 |
va009039 |
1:e74530ad6b9e | 128 | s16 v = pull_ps(); |
va009039 |
1:e74530ad6b9e | 129 | poke(PS, peek(PS) + v); |
va009039 |
1:e74530ad6b9e | 130 | } |
va009039 |
1:e74530ad6b9e | 131 | |
va009039 |
1:e74530ad6b9e | 132 | void BaseIPS::c_minus(void) { // 16 |
va009039 |
1:e74530ad6b9e | 133 | s16 v = pull_ps(); |
va009039 |
1:e74530ad6b9e | 134 | poke(PS, peek(PS) - v); |
va009039 |
1:e74530ad6b9e | 135 | } |
va009039 |
1:e74530ad6b9e | 136 | |
va009039 |
1:e74530ad6b9e | 137 | void BaseIPS::c_dup(void) { // 17 |
va009039 |
1:e74530ad6b9e | 138 | push_ps(peek(PS)); |
va009039 |
1:e74530ad6b9e | 139 | } |
va009039 |
1:e74530ad6b9e | 140 | |
va009039 |
1:e74530ad6b9e | 141 | void BaseIPS::c_pdup(void) { // 18 |
va009039 |
1:e74530ad6b9e | 142 | push_ps(peek(PS + 2)); |
va009039 |
1:e74530ad6b9e | 143 | push_ps(peek(PS + 2)); |
va009039 |
1:e74530ad6b9e | 144 | } |
va009039 |
1:e74530ad6b9e | 145 | |
va009039 |
1:e74530ad6b9e | 146 | void BaseIPS::c_vert(void) { // 19 |
va009039 |
1:e74530ad6b9e | 147 | s16 h=peek(PS); |
va009039 |
1:e74530ad6b9e | 148 | poke(PS, peek(PS + 2)); |
va009039 |
1:e74530ad6b9e | 149 | poke(PS + 2, h); |
va009039 |
1:e74530ad6b9e | 150 | } |
va009039 |
1:e74530ad6b9e | 151 | |
va009039 |
1:e74530ad6b9e | 152 | void BaseIPS::c_zwo(void) { // 20 |
va009039 |
1:e74530ad6b9e | 153 | push_ps(peek(PS+2)); |
va009039 |
1:e74530ad6b9e | 154 | } |
va009039 |
1:e74530ad6b9e | 155 | |
va009039 |
1:e74530ad6b9e | 156 | void BaseIPS::c_rdu(void) { // 21 |
va009039 |
1:e74530ad6b9e | 157 | s16 h=peek(PS); |
va009039 |
1:e74530ad6b9e | 158 | poke(PS, peek(PS+2)); |
va009039 |
1:e74530ad6b9e | 159 | poke(PS+2, peek(PS+4)); |
va009039 |
1:e74530ad6b9e | 160 | poke(PS+4, h); |
va009039 |
1:e74530ad6b9e | 161 | } |
va009039 |
1:e74530ad6b9e | 162 | |
va009039 |
1:e74530ad6b9e | 163 | void BaseIPS::c_rdo(void) { // 22 |
va009039 |
1:e74530ad6b9e | 164 | s16 h=peek(PS+4); |
va009039 |
1:e74530ad6b9e | 165 | poke(PS+4, peek(PS+2)); |
va009039 |
1:e74530ad6b9e | 166 | poke(PS+2, peek(PS)); |
va009039 |
1:e74530ad6b9e | 167 | poke(PS, h); |
va009039 |
1:e74530ad6b9e | 168 | } |
va009039 |
1:e74530ad6b9e | 169 | |
va009039 |
1:e74530ad6b9e | 170 | void BaseIPS::c_index(void) { // 23 |
va009039 |
1:e74530ad6b9e | 171 | push_ps(peek(RS)); |
va009039 |
1:e74530ad6b9e | 172 | } |
va009039 |
1:e74530ad6b9e | 173 | |
va009039 |
1:e74530ad6b9e | 174 | void BaseIPS::c_s_to_r(void) { // 24 |
va009039 |
1:e74530ad6b9e | 175 | push_rs(pull_ps()); |
va009039 |
1:e74530ad6b9e | 176 | } |
va009039 |
1:e74530ad6b9e | 177 | |
va009039 |
1:e74530ad6b9e | 178 | void BaseIPS::c_r_to_s(void) { // 25 |
va009039 |
1:e74530ad6b9e | 179 | push_ps(pull_rs()); |
va009039 |
1:e74530ad6b9e | 180 | } |
va009039 |
1:e74530ad6b9e | 181 | |
va009039 |
1:e74530ad6b9e | 182 | void BaseIPS::c_eqz(void) { // 26 |
va009039 |
1:e74530ad6b9e | 183 | poke(PS,(peek(PS)==0)); |
va009039 |
1:e74530ad6b9e | 184 | } |
va009039 |
1:e74530ad6b9e | 185 | |
va009039 |
1:e74530ad6b9e | 186 | void BaseIPS::c_gz(void) { // 27 |
va009039 |
1:e74530ad6b9e | 187 | poke(PS,((s16)peek(PS)>0)); |
va009039 |
1:e74530ad6b9e | 188 | } |
va009039 |
1:e74530ad6b9e | 189 | |
va009039 |
1:e74530ad6b9e | 190 | void BaseIPS::c_lz(void) { // 28 |
va009039 |
1:e74530ad6b9e | 191 | poke(PS,((s16)peek(PS)<0)); |
va009039 |
1:e74530ad6b9e | 192 | } |
va009039 |
1:e74530ad6b9e | 193 | |
va009039 |
1:e74530ad6b9e | 194 | void BaseIPS::c_geu(void) { // 29 |
va009039 |
1:e74530ad6b9e | 195 | u16 a,b; |
va009039 |
1:e74530ad6b9e | 196 | b=pull_ps(); |
va009039 |
1:e74530ad6b9e | 197 | a=peek(PS); |
va009039 |
1:e74530ad6b9e | 198 | poke(PS,a>=b); |
va009039 |
1:e74530ad6b9e | 199 | } |
va009039 |
1:e74530ad6b9e | 200 | |
va009039 |
1:e74530ad6b9e | 201 | void BaseIPS::c_f_vergl(void) { // 30 |
va009039 |
1:e74530ad6b9e | 202 | int t; |
va009039 |
1:e74530ad6b9e | 203 | u16 n,a1,a2; |
va009039 |
1:e74530ad6b9e | 204 | n=pull_ps(); |
va009039 |
1:e74530ad6b9e | 205 | a2=pull_ps(); |
va009039 |
1:e74530ad6b9e | 206 | a1=peek(PS); |
va009039 |
1:e74530ad6b9e | 207 | t=1; |
va009039 |
1:e74530ad6b9e | 208 | do { |
va009039 |
1:e74530ad6b9e | 209 | int b; |
va009039 |
1:e74530ad6b9e | 210 | b=(s16)peekB(a1++)-(s16)peekB(a2++); |
va009039 |
1:e74530ad6b9e | 211 | if (b>0) t=2; |
va009039 |
1:e74530ad6b9e | 212 | else if (b<0) t=0; |
va009039 |
1:e74530ad6b9e | 213 | n=(n-1)&0xff; |
va009039 |
1:e74530ad6b9e | 214 | } while (n); |
va009039 |
1:e74530ad6b9e | 215 | poke(PS,t); |
va009039 |
1:e74530ad6b9e | 216 | } |
va009039 |
1:e74530ad6b9e | 217 | |
va009039 |
1:e74530ad6b9e | 218 | void BaseIPS::c_nicht(void) { // 31 |
va009039 |
1:e74530ad6b9e | 219 | poke(PS, 0xffff^peek(PS)); |
va009039 |
1:e74530ad6b9e | 220 | } |
va009039 |
1:e74530ad6b9e | 221 | |
va009039 |
1:e74530ad6b9e | 222 | void BaseIPS::c_und(void) { // 32 |
va009039 |
1:e74530ad6b9e | 223 | u16 v = pull_ps(); |
va009039 |
1:e74530ad6b9e | 224 | poke(PS, v & peek(PS)); |
va009039 |
1:e74530ad6b9e | 225 | } |
va009039 |
1:e74530ad6b9e | 226 | |
va009039 |
1:e74530ad6b9e | 227 | void BaseIPS::c_oder(void) { // 33 |
va009039 |
1:e74530ad6b9e | 228 | u16 v = pull_ps(); |
va009039 |
1:e74530ad6b9e | 229 | poke(PS, v | peek(PS)); |
va009039 |
1:e74530ad6b9e | 230 | } |
va009039 |
1:e74530ad6b9e | 231 | |
va009039 |
1:e74530ad6b9e | 232 | void BaseIPS::c_exo(void) { // 34 |
va009039 |
1:e74530ad6b9e | 233 | u16 v = pull_ps(); |
va009039 |
1:e74530ad6b9e | 234 | poke(PS, v ^ peek(PS)); |
va009039 |
1:e74530ad6b9e | 235 | } |
va009039 |
1:e74530ad6b9e | 236 | |
va009039 |
1:e74530ad6b9e | 237 | void BaseIPS::c_bit(void) { // 35 |
va009039 |
1:e74530ad6b9e | 238 | poke(PS, 1<<peek(PS)); |
va009039 |
1:e74530ad6b9e | 239 | } |
va009039 |
1:e74530ad6b9e | 240 | |
va009039 |
1:e74530ad6b9e | 241 | void BaseIPS::c_cbit(void) { // 36 |
va009039 |
1:e74530ad6b9e | 242 | int a = pull_ps(); |
va009039 |
1:e74530ad6b9e | 243 | int b = (pull_ps())&0x07; |
va009039 |
1:e74530ad6b9e | 244 | pokeB(a, peekB(a)&~(1<<b) ); |
va009039 |
1:e74530ad6b9e | 245 | } |
va009039 |
1:e74530ad6b9e | 246 | |
va009039 |
1:e74530ad6b9e | 247 | void BaseIPS::c_sbit(void) { // 37 |
va009039 |
1:e74530ad6b9e | 248 | int a,b; |
va009039 |
1:e74530ad6b9e | 249 | a=pull_ps(); |
va009039 |
1:e74530ad6b9e | 250 | b=(pull_ps())&0x07; |
va009039 |
1:e74530ad6b9e | 251 | pokeB(a, peekB(a)|(1<<b) ); |
va009039 |
1:e74530ad6b9e | 252 | } |
va009039 |
1:e74530ad6b9e | 253 | |
va009039 |
1:e74530ad6b9e | 254 | void BaseIPS::c_tbit(void) { // 38 |
va009039 |
1:e74530ad6b9e | 255 | int a,b; |
va009039 |
1:e74530ad6b9e | 256 | a=pull_ps(); |
va009039 |
1:e74530ad6b9e | 257 | b=(peek(PS))&0x07; |
va009039 |
1:e74530ad6b9e | 258 | if (peekB(a)&(1<<b)) poke(PS,1); |
va009039 |
1:e74530ad6b9e | 259 | else poke(PS,0); |
va009039 |
1:e74530ad6b9e | 260 | } |
va009039 |
1:e74530ad6b9e | 261 | |
va009039 |
1:e74530ad6b9e | 262 | void BaseIPS::loop_sharedcode(int i) { |
va009039 |
1:e74530ad6b9e | 263 | int l; |
va009039 |
1:e74530ad6b9e | 264 | l=(s16)peek(RS); |
va009039 |
1:e74530ad6b9e | 265 | if (i<=l) { |
va009039 |
1:e74530ad6b9e | 266 | push_rs(i); |
va009039 |
1:e74530ad6b9e | 267 | PPC=peek(PPC); |
va009039 |
1:e74530ad6b9e | 268 | } else { |
va009039 |
1:e74530ad6b9e | 269 | pull_rs(); |
va009039 |
1:e74530ad6b9e | 270 | PPC+=2; |
va009039 |
1:e74530ad6b9e | 271 | } |
va009039 |
1:e74530ad6b9e | 272 | } |
va009039 |
1:e74530ad6b9e | 273 | |
va009039 |
1:e74530ad6b9e | 274 | void BaseIPS::c_jeex(void) { // 39 |
va009039 |
1:e74530ad6b9e | 275 | PPC=peek(PPC); |
va009039 |
1:e74530ad6b9e | 276 | push_rs(pull_ps()); |
va009039 |
1:e74530ad6b9e | 277 | loop_sharedcode((s16)pull_ps()); |
va009039 |
1:e74530ad6b9e | 278 | } |
va009039 |
1:e74530ad6b9e | 279 | |
va009039 |
1:e74530ad6b9e | 280 | void BaseIPS::c_loopex(void) { // 40 |
va009039 |
1:e74530ad6b9e | 281 | loop_sharedcode((s16)(pull_rs()+1)); |
va009039 |
1:e74530ad6b9e | 282 | } |
va009039 |
1:e74530ad6b9e | 283 | |
va009039 |
1:e74530ad6b9e | 284 | void BaseIPS::c_plusloopex(void) { // 41 |
va009039 |
1:e74530ad6b9e | 285 | int i; |
va009039 |
1:e74530ad6b9e | 286 | i=(s16)(pull_rs()); |
va009039 |
1:e74530ad6b9e | 287 | loop_sharedcode(i+(s16)pull_rs()); |
va009039 |
1:e74530ad6b9e | 288 | } |
va009039 |
1:e74530ad6b9e | 289 | |
va009039 |
1:e74530ad6b9e | 290 | void BaseIPS::c_fieldtrans(void) { // 42 |
va009039 |
1:e74530ad6b9e | 291 | /* note: cannot call memcpy() here, because memcpy()'s behaviour is not defined when source and destination areas overlap */ |
va009039 |
1:e74530ad6b9e | 292 | /* memmove() cannot be used either, because its behaviour for overlap is different from what IPS expects */ |
va009039 |
1:e74530ad6b9e | 293 | int n,d,s,b; |
va009039 |
1:e74530ad6b9e | 294 | n=pull_ps(); |
va009039 |
1:e74530ad6b9e | 295 | d=pull_ps(); |
va009039 |
1:e74530ad6b9e | 296 | s=pull_ps(); |
va009039 |
1:e74530ad6b9e | 297 | do { |
va009039 |
1:e74530ad6b9e | 298 | b=peekB(s++); |
va009039 |
1:e74530ad6b9e | 299 | pokeB(d++,b); |
va009039 |
1:e74530ad6b9e | 300 | n=(n-1)&0xff; |
va009039 |
1:e74530ad6b9e | 301 | } while (n); |
va009039 |
1:e74530ad6b9e | 302 | if (d<=0x400) redraw=1; |
va009039 |
1:e74530ad6b9e | 303 | idle=0; |
va009039 |
1:e74530ad6b9e | 304 | } |
va009039 |
1:e74530ad6b9e | 305 | |
va009039 |
1:e74530ad6b9e | 306 | void BaseIPS::c_pmul(void) { // 43 |
va009039 |
1:e74530ad6b9e | 307 | u32 c = pull_ps() * pull_ps(); |
va009039 |
1:e74530ad6b9e | 308 | push_ps((s16)(c&0xffff)); |
va009039 |
1:e74530ad6b9e | 309 | push_ps(c>>16); |
va009039 |
1:e74530ad6b9e | 310 | } |
va009039 |
1:e74530ad6b9e | 311 | |
va009039 |
1:e74530ad6b9e | 312 | void BaseIPS::c_pdiv(void) { // 44 |
va009039 |
1:e74530ad6b9e | 313 | u32 q,n; |
va009039 |
1:e74530ad6b9e | 314 | u16 d,nh,nl,r; |
va009039 |
1:e74530ad6b9e | 315 | d=pull_ps(); |
va009039 |
1:e74530ad6b9e | 316 | nh=pull_ps(); |
va009039 |
1:e74530ad6b9e | 317 | nl=pull_ps(); |
va009039 |
1:e74530ad6b9e | 318 | n=(nh<<16)+nl; |
va009039 |
1:e74530ad6b9e | 319 | if (d==0) { q=0xffff; r=0; } |
va009039 |
1:e74530ad6b9e | 320 | else { |
va009039 |
1:e74530ad6b9e | 321 | q=n/d; |
va009039 |
1:e74530ad6b9e | 322 | r=n%d; |
va009039 |
1:e74530ad6b9e | 323 | if (q>=0x10000) { q=0xffff; r=0; } |
va009039 |
1:e74530ad6b9e | 324 | } |
va009039 |
1:e74530ad6b9e | 325 | push_ps(q); |
va009039 |
1:e74530ad6b9e | 326 | push_ps(r); |
va009039 |
1:e74530ad6b9e | 327 | } |
va009039 |
1:e74530ad6b9e | 328 | |
va009039 |
1:e74530ad6b9e | 329 | void BaseIPS::c_tue(void) { // 45 |
va009039 |
1:e74530ad6b9e | 330 | HP = pull_ps(); |
va009039 |
1:e74530ad6b9e | 331 | } |
va009039 |
1:e74530ad6b9e | 332 | |
va009039 |
1:e74530ad6b9e | 333 | void BaseIPS::c_polyname(void) { // 46 |
va009039 |
1:e74530ad6b9e | 334 | u32 x,p,d; |
va009039 |
1:e74530ad6b9e | 335 | d=pull_ps(); |
va009039 |
1:e74530ad6b9e | 336 | x=pull_ps(); |
va009039 |
1:e74530ad6b9e | 337 | p=pull_ps(); |
va009039 |
1:e74530ad6b9e | 338 | x= x | (p&0xff00) | ((p&0xff)<<16); |
va009039 |
1:e74530ad6b9e | 339 | p = d ^ x ^ (x>>1) ^ (x>>2) ^ (x>>7); |
va009039 |
1:e74530ad6b9e | 340 | x = x ^ ((p&0xff)<<24); |
va009039 |
1:e74530ad6b9e | 341 | x >>= 7; |
va009039 |
1:e74530ad6b9e | 342 | push_ps( (x&0xff00) | ((x>>16)&0xff) ); |
va009039 |
1:e74530ad6b9e | 343 | push_ps( (x&0xff) ); |
va009039 |
1:e74530ad6b9e | 344 | } |
va009039 |
1:e74530ad6b9e | 345 | |
va009039 |
1:e74530ad6b9e | 346 | void BaseIPS::c_scode(void) { // 47 |
va009039 |
1:e74530ad6b9e | 347 | int i; |
va009039 |
1:e74530ad6b9e | 348 | u32 nd; |
va009039 |
1:e74530ad6b9e | 349 | int offs=peek(a_Os); |
va009039 |
1:e74530ad6b9e | 350 | i=peek(a_NDptr); |
va009039 |
1:e74530ad6b9e | 351 | nd=peek32(i); |
va009039 |
1:e74530ad6b9e | 352 | i=peek(a_P3); |
va009039 |
1:e74530ad6b9e | 353 | while (i) { |
va009039 |
1:e74530ad6b9e | 354 | i+=offs; |
va009039 |
1:e74530ad6b9e | 355 | if ( ( (peek32(i) ^ nd) & 0xffffff3f) ==0) { |
va009039 |
1:e74530ad6b9e | 356 | push_ps(i+6); |
va009039 |
1:e74530ad6b9e | 357 | return; |
va009039 |
1:e74530ad6b9e | 358 | } |
va009039 |
1:e74530ad6b9e | 359 | i=peek(i+4); |
va009039 |
1:e74530ad6b9e | 360 | } |
va009039 |
1:e74530ad6b9e | 361 | push_ps(0); |
va009039 |
1:e74530ad6b9e | 362 | } |
va009039 |
1:e74530ad6b9e | 363 | |
va009039 |
1:e74530ad6b9e | 364 | void BaseIPS::c_cscan(void) { // 48 |
va009039 |
1:e74530ad6b9e | 365 | int a; |
va009039 |
1:e74530ad6b9e | 366 | int pi,pe; |
va009039 |
1:e74530ad6b9e | 367 | int comment=0; |
va009039 |
1:e74530ad6b9e | 368 | pi=peek(a_PI); |
va009039 |
1:e74530ad6b9e | 369 | pe=peek(a_PE); |
va009039 |
1:e74530ad6b9e | 370 | |
va009039 |
1:e74530ad6b9e | 371 | a=pull_ps(); |
va009039 |
1:e74530ad6b9e | 372 | if (a==1) { |
va009039 |
1:e74530ad6b9e | 373 | while (pi<=pe) { |
va009039 |
1:e74530ad6b9e | 374 | if (comment) { |
va009039 |
1:e74530ad6b9e | 375 | if (peekB(pi)==')') comment=0; |
va009039 |
1:e74530ad6b9e | 376 | } else { |
va009039 |
1:e74530ad6b9e | 377 | if (peekB(pi)=='(') comment=1; |
va009039 |
1:e74530ad6b9e | 378 | else if (peekB(pi)!=' ') { |
va009039 |
1:e74530ad6b9e | 379 | poke(a_PI,pi); |
va009039 |
1:e74530ad6b9e | 380 | push_ps(1); |
va009039 |
1:e74530ad6b9e | 381 | return; |
va009039 |
1:e74530ad6b9e | 382 | } |
va009039 |
1:e74530ad6b9e | 383 | } |
va009039 |
1:e74530ad6b9e | 384 | pi++; |
va009039 |
1:e74530ad6b9e | 385 | } |
va009039 |
1:e74530ad6b9e | 386 | push_ps(0); |
va009039 |
1:e74530ad6b9e | 387 | poke(a_P2,1); |
va009039 |
1:e74530ad6b9e | 388 | return; |
va009039 |
1:e74530ad6b9e | 389 | } else { |
va009039 |
1:e74530ad6b9e | 390 | while (pi<=pe) { |
va009039 |
1:e74530ad6b9e | 391 | if (peekB(pi)==' ') { |
va009039 |
1:e74530ad6b9e | 392 | break; |
va009039 |
1:e74530ad6b9e | 393 | } |
va009039 |
1:e74530ad6b9e | 394 | pi++; |
va009039 |
1:e74530ad6b9e | 395 | } |
va009039 |
1:e74530ad6b9e | 396 | poke(a_PI,pi); |
va009039 |
1:e74530ad6b9e | 397 | push_ps(0); |
va009039 |
1:e74530ad6b9e | 398 | } |
va009039 |
1:e74530ad6b9e | 399 | } |
va009039 |
1:e74530ad6b9e | 400 | |
va009039 |
1:e74530ad6b9e | 401 | void BaseIPS::c_chs(void) { // 49 |
va009039 |
1:e74530ad6b9e | 402 | poke(PS,-(s16)peek(PS)); |
va009039 |
1:e74530ad6b9e | 403 | } |
va009039 |
1:e74530ad6b9e | 404 | |
va009039 |
1:e74530ad6b9e | 405 | void BaseIPS::c_cyc2(void) { // 50 |
va009039 |
1:e74530ad6b9e | 406 | u32 ch,a,crcc; |
va009039 |
1:e74530ad6b9e | 407 | int i; |
va009039 |
2:908338b1151a | 408 | |
va009039 |
1:e74530ad6b9e | 409 | ch=pull_ps(); |
va009039 |
1:e74530ad6b9e | 410 | a=pull_ps(); |
va009039 |
1:e74530ad6b9e | 411 | crcc=(a>>8)|((a&0xff)<<8); |
va009039 |
2:908338b1151a | 412 | |
va009039 |
1:e74530ad6b9e | 413 | ch<<=8; |
va009039 |
1:e74530ad6b9e | 414 | for (i=0;i<=7;i++) { |
va009039 |
1:e74530ad6b9e | 415 | //int test; |
va009039 |
1:e74530ad6b9e | 416 | //test=(ch^crcc)&0x8000; |
va009039 |
1:e74530ad6b9e | 417 | crcc<<=1; |
va009039 |
1:e74530ad6b9e | 418 | ch<<=1; |
va009039 |
1:e74530ad6b9e | 419 | if ((ch^crcc)&0x10000) crcc^=0x1021; |
va009039 |
1:e74530ad6b9e | 420 | } |
va009039 |
1:e74530ad6b9e | 421 | |
va009039 |
1:e74530ad6b9e | 422 | push_ps( ((crcc&0xff)<<8) | ((crcc>>8)&0xff) ); |
va009039 |
1:e74530ad6b9e | 423 | } |
va009039 |
1:e74530ad6b9e | 424 | |
va009039 |
1:e74530ad6b9e | 425 | void BaseIPS::c_close(void) { // 51 |
va009039 |
1:e74530ad6b9e | 426 | if (inputfile) { |
va009039 |
1:e74530ad6b9e | 427 | file_close(inputfile); |
va009039 |
1:e74530ad6b9e | 428 | inputfile = NULL; |
va009039 |
1:e74530ad6b9e | 429 | } |
va009039 |
1:e74530ad6b9e | 430 | } |
va009039 |
1:e74530ad6b9e | 431 | |
va009039 |
1:e74530ad6b9e | 432 | void BaseIPS::c_open(void) { // 52 |
va009039 |
1:e74530ad6b9e | 433 | if (inputfile) { |
va009039 |
1:e74530ad6b9e | 434 | file_close(inputfile); |
va009039 |
1:e74530ad6b9e | 435 | } |
va009039 |
2:908338b1151a | 436 | size_t namelen = pull_ps(); |
va009039 |
1:e74530ad6b9e | 437 | int namestart = pull_ps(); |
va009039 |
1:e74530ad6b9e | 438 | char filename[256]; |
va009039 |
2:908338b1151a | 439 | namelen = std::min(namelen, sizeof(filename)-1); |
va009039 |
2:908338b1151a | 440 | for(size_t i = 0; i < namelen; i++) { |
va009039 |
1:e74530ad6b9e | 441 | filename[i] = peekB(namestart + i); |
va009039 |
1:e74530ad6b9e | 442 | } |
va009039 |
1:e74530ad6b9e | 443 | filename[namelen] = '\0'; |
va009039 |
1:e74530ad6b9e | 444 | inputfile = file_open(filename); |
va009039 |
1:e74530ad6b9e | 445 | push_ps(inputfile != NULL ? 1 : 0); |
va009039 |
1:e74530ad6b9e | 446 | } |
va009039 |
1:e74530ad6b9e | 447 | |
va009039 |
1:e74530ad6b9e | 448 | void BaseIPS::c_oscli(void) { // 53 |
va009039 |
1:e74530ad6b9e | 449 | error("OSCLI not implemented!"); |
va009039 |
1:e74530ad6b9e | 450 | } |
va009039 |
1:e74530ad6b9e | 451 | |
va009039 |
1:e74530ad6b9e | 452 | void BaseIPS::c_load(void) { // 54 |
va009039 |
1:e74530ad6b9e | 453 | error("LOAD not implemented!"); |
va009039 |
1:e74530ad6b9e | 454 | } |
va009039 |
1:e74530ad6b9e | 455 | |
va009039 |
1:e74530ad6b9e | 456 | void BaseIPS::c_save(void) { // 55 |
va009039 |
1:e74530ad6b9e | 457 | int namelen = pull_ps(); |
va009039 |
1:e74530ad6b9e | 458 | int namestart = pull_ps(); |
va009039 |
1:e74530ad6b9e | 459 | int end = pull_ps(); |
va009039 |
1:e74530ad6b9e | 460 | int start = pull_ps(); |
va009039 |
1:e74530ad6b9e | 461 | |
va009039 |
1:e74530ad6b9e | 462 | char filename[256]; |
va009039 |
1:e74530ad6b9e | 463 | if (namelen > 255) namelen = 255; |
va009039 |
1:e74530ad6b9e | 464 | for(int i = 0; i < namelen; i++) { |
va009039 |
1:e74530ad6b9e | 465 | filename[i] = peekB(namestart + i); |
va009039 |
1:e74530ad6b9e | 466 | } |
va009039 |
1:e74530ad6b9e | 467 | filename[namelen] = 0; |
va009039 |
1:e74530ad6b9e | 468 | |
va009039 |
1:e74530ad6b9e | 469 | void* fh = file_open(filename, "wb"); |
va009039 |
1:e74530ad6b9e | 470 | if (fh == NULL) { |
va009039 |
1:e74530ad6b9e | 471 | push_ps(0); |
va009039 |
1:e74530ad6b9e | 472 | return; |
va009039 |
1:e74530ad6b9e | 473 | } |
va009039 |
1:e74530ad6b9e | 474 | for(int i = start; i < end; i++) { |
va009039 |
1:e74530ad6b9e | 475 | file_putc(peekB(i), fh); |
va009039 |
1:e74530ad6b9e | 476 | } |
va009039 |
1:e74530ad6b9e | 477 | file_close(fh); |
va009039 |
1:e74530ad6b9e | 478 | push_ps(1); |
va009039 |
1:e74530ad6b9e | 479 | } |
va009039 |
1:e74530ad6b9e | 480 | |
va009039 |
1:e74530ad6b9e | 481 | void BaseIPS::c_setkbptr(void) { // 56 |
va009039 |
1:e74530ad6b9e | 482 | input_ptr = pull_ps() & 0x3ff; |
va009039 |
1:e74530ad6b9e | 483 | } |
va009039 |
1:e74530ad6b9e | 484 | |
va009039 |
1:e74530ad6b9e | 485 | void BaseIPS::c_getPS(void) { // 57 |
va009039 |
1:e74530ad6b9e | 486 | push_ps(PS); |
va009039 |
1:e74530ad6b9e | 487 | } |
va009039 |
1:e74530ad6b9e | 488 | |
va009039 |
1:e74530ad6b9e | 489 | void BaseIPS::c_setPS(void) { // 58 |
va009039 |
1:e74530ad6b9e | 490 | PS=pull_ps(); |
va009039 |
1:e74530ad6b9e | 491 | } |
va009039 |
1:e74530ad6b9e | 492 | |
va009039 |
2:908338b1151a | 493 | #ifndef NO_MATH |
va009039 |
1:e74530ad6b9e | 494 | void BaseIPS::c_rp_code(void) { // 59 |
va009039 |
1:e74530ad6b9e | 495 | double theta,x,y,r; |
va009039 |
1:e74530ad6b9e | 496 | pull_ps(); |
va009039 |
1:e74530ad6b9e | 497 | y=(s16)pull_ps(); |
va009039 |
1:e74530ad6b9e | 498 | x=(s16)pull_ps(); |
va009039 |
1:e74530ad6b9e | 499 | theta=((s16)pull_ps())/10430.38; /* convert to radians */ |
va009039 |
1:e74530ad6b9e | 500 | theta+=atan2(y,x); |
va009039 |
1:e74530ad6b9e | 501 | r=sqrt(x*x+y*y)*1.6468; |
va009039 |
1:e74530ad6b9e | 502 | push_ps(Round(theta*10430.38)); |
va009039 |
1:e74530ad6b9e | 503 | push_ps((int)(r+0.5)); |
va009039 |
1:e74530ad6b9e | 504 | push_ps(0); |
va009039 |
1:e74530ad6b9e | 505 | } |
va009039 |
1:e74530ad6b9e | 506 | |
va009039 |
1:e74530ad6b9e | 507 | void BaseIPS::c_tr_code(void) { // 60 |
va009039 |
1:e74530ad6b9e | 508 | double theta,x,y,r; |
va009039 |
1:e74530ad6b9e | 509 | pull_ps(); |
va009039 |
1:e74530ad6b9e | 510 | y=(s16)pull_ps(); |
va009039 |
1:e74530ad6b9e | 511 | x=(s16)pull_ps(); |
va009039 |
1:e74530ad6b9e | 512 | theta=((s16)pull_ps())/10430.38; /* convert to radians */ |
va009039 |
1:e74530ad6b9e | 513 | theta+=atan2(y,x); |
va009039 |
1:e74530ad6b9e | 514 | r=sqrt(x*x+y*y)*1.6468; |
va009039 |
1:e74530ad6b9e | 515 | push_ps(0); |
va009039 |
1:e74530ad6b9e | 516 | push_ps(Round(r*cos(theta))); |
va009039 |
1:e74530ad6b9e | 517 | push_ps(Round(r*sin(theta))); |
va009039 |
1:e74530ad6b9e | 518 | } |
va009039 |
2:908338b1151a | 519 | #else |
va009039 |
2:908338b1151a | 520 | void BaseIPS::c_rp_code(void) { |
va009039 |
2:908338b1151a | 521 | error("c_rp_code not implemented!\n"); |
va009039 |
2:908338b1151a | 522 | } |
va009039 |
2:908338b1151a | 523 | void BaseIPS::c_tr_code(void) { |
va009039 |
2:908338b1151a | 524 | error("c_tr_code not implemented!\n"); |
va009039 |
2:908338b1151a | 525 | } |
va009039 |
2:908338b1151a | 526 | #endif |
va009039 |
1:e74530ad6b9e | 527 | |
va009039 |
1:e74530ad6b9e | 528 | void BaseIPS::c_swap3(void) { // 61 |
va009039 |
1:e74530ad6b9e | 529 | u16 h; |
va009039 |
1:e74530ad6b9e | 530 | h=peek(PS+6); poke(PS+6,peek(PS)); poke(PS,h); |
va009039 |
1:e74530ad6b9e | 531 | h=peek(PS+8); poke(PS+8,peek(PS+2)); poke(PS+2,h); |
va009039 |
1:e74530ad6b9e | 532 | h=peek(PS+10); poke(PS+10,peek(PS+4)); poke(PS+4,h); |
va009039 |
1:e74530ad6b9e | 533 | } |
va009039 |
1:e74530ad6b9e | 534 | |
va009039 |
1:e74530ad6b9e | 535 | void BaseIPS::c_defchar(void) { // 62 |
va009039 |
1:e74530ad6b9e | 536 | error("DEFCHAR not implemented!\n"); |
va009039 |
1:e74530ad6b9e | 537 | } |
va009039 |
1:e74530ad6b9e | 538 | |
va009039 |
1:e74530ad6b9e | 539 | void BaseIPS::c_pplus(void) { // 63 |
va009039 |
1:e74530ad6b9e | 540 | u32 h=pull_ps(); |
va009039 |
1:e74530ad6b9e | 541 | u32 b=(h<<16)+pull_ps(); |
va009039 |
1:e74530ad6b9e | 542 | h=pull_ps(); |
va009039 |
1:e74530ad6b9e | 543 | u32 a=(h<<16)+pull_ps(); |
va009039 |
1:e74530ad6b9e | 544 | u32 c=a+b; |
va009039 |
1:e74530ad6b9e | 545 | push_ps(c&0xffff); |
va009039 |
1:e74530ad6b9e | 546 | push_ps(c>>16); |
va009039 |
1:e74530ad6b9e | 547 | } |
va009039 |
1:e74530ad6b9e | 548 | |
va009039 |
1:e74530ad6b9e | 549 | void BaseIPS::c_pminus(void) { // 64 |
va009039 |
1:e74530ad6b9e | 550 | u32 h = pull_ps(); |
va009039 |
1:e74530ad6b9e | 551 | u32 b = (h<<16)+pull_ps(); |
va009039 |
1:e74530ad6b9e | 552 | h = pull_ps(); |
va009039 |
1:e74530ad6b9e | 553 | u32 a = (h<<16)+pull_ps(); |
va009039 |
1:e74530ad6b9e | 554 | u32 c = a - b; |
va009039 |
1:e74530ad6b9e | 555 | push_ps(c&0xffff); |
va009039 |
1:e74530ad6b9e | 556 | push_ps(c>>16); |
va009039 |
1:e74530ad6b9e | 557 | } |
va009039 |
1:e74530ad6b9e | 558 | |
va009039 |
1:e74530ad6b9e | 559 | void BaseIPS::do_20ms(void) { |
va009039 |
1:e74530ad6b9e | 560 | pokeB(UHR, peekB(UHR) + 2); // 20ms |
va009039 |
1:e74530ad6b9e | 561 | if (peekB(UHR) == 100) { |
va009039 |
1:e74530ad6b9e | 562 | pokeB(UHR, 0); |
va009039 |
1:e74530ad6b9e | 563 | pokeB(UHR+1, peekB(UHR+1) + 1); |
va009039 |
1:e74530ad6b9e | 564 | if (peekB(UHR+1) == 60) { |
va009039 |
1:e74530ad6b9e | 565 | pokeB(UHR+1, 0); |
va009039 |
1:e74530ad6b9e | 566 | pokeB(UHR+2, peekB(UHR+2) + 1); |
va009039 |
1:e74530ad6b9e | 567 | if (peekB(UHR+2) == 60) { |
va009039 |
1:e74530ad6b9e | 568 | pokeB(UHR+2, 0); |
va009039 |
1:e74530ad6b9e | 569 | pokeB(UHR+3, peekB(UHR+3) + 1); |
va009039 |
1:e74530ad6b9e | 570 | if (peekB(UHR+3) == 24) { |
va009039 |
1:e74530ad6b9e | 571 | pokeB(UHR+3, 0); |
va009039 |
1:e74530ad6b9e | 572 | poke(UHR+4, peek(UHR+4) + 1); |
va009039 |
1:e74530ad6b9e | 573 | } |
va009039 |
1:e74530ad6b9e | 574 | } |
va009039 |
1:e74530ad6b9e | 575 | } |
va009039 |
1:e74530ad6b9e | 576 | } |
va009039 |
1:e74530ad6b9e | 577 | |
va009039 |
1:e74530ad6b9e | 578 | const int sus[4]={SU0,SU1,SU2,SU3}; |
va009039 |
1:e74530ad6b9e | 579 | for (int i = 0; i < 4; i++) { |
va009039 |
1:e74530ad6b9e | 580 | int su=sus[i]; |
va009039 |
1:e74530ad6b9e | 581 | if ((peekB(su)&1) == 0) { |
va009039 |
1:e74530ad6b9e | 582 | if (peekB(su) != 0) { |
va009039 |
1:e74530ad6b9e | 583 | pokeB(su, peekB(su) - 2); |
va009039 |
1:e74530ad6b9e | 584 | } else { |
va009039 |
1:e74530ad6b9e | 585 | if (peekB(su+1) != 0) { |
va009039 |
1:e74530ad6b9e | 586 | pokeB(su, 98); |
va009039 |
1:e74530ad6b9e | 587 | pokeB(su+1, peekB(su+1) - 1); |
va009039 |
1:e74530ad6b9e | 588 | } else { |
va009039 |
1:e74530ad6b9e | 589 | if (peekB(su+2) != 0) { |
va009039 |
1:e74530ad6b9e | 590 | pokeB(su+1, 59); |
va009039 |
1:e74530ad6b9e | 591 | pokeB(su+2, peekB(su+2) - 1); |
va009039 |
1:e74530ad6b9e | 592 | } else { |
va009039 |
1:e74530ad6b9e | 593 | if (peekB(su+3) != 0) { |
va009039 |
1:e74530ad6b9e | 594 | pokeB(su+2, 255); |
va009039 |
1:e74530ad6b9e | 595 | pokeB(su+3, peekB(su+3) - 1); |
va009039 |
1:e74530ad6b9e | 596 | } else { |
va009039 |
1:e74530ad6b9e | 597 | pokeB(su, 1); |
va009039 |
1:e74530ad6b9e | 598 | } |
va009039 |
1:e74530ad6b9e | 599 | } |
va009039 |
1:e74530ad6b9e | 600 | } |
va009039 |
1:e74530ad6b9e | 601 | } |
va009039 |
1:e74530ad6b9e | 602 | } |
va009039 |
1:e74530ad6b9e | 603 | } |
va009039 |
1:e74530ad6b9e | 604 | } |
va009039 |
1:e74530ad6b9e | 605 | |
va009039 |
1:e74530ad6b9e | 606 | void BaseIPS::read_inputfile(void) { |
va009039 |
1:e74530ad6b9e | 607 | for(int i = 0x200; i < 0x400; i++) { |
va009039 |
1:e74530ad6b9e | 608 | pokeB(i, ' '); |
va009039 |
1:e74530ad6b9e | 609 | } |
va009039 |
1:e74530ad6b9e | 610 | |
va009039 |
1:e74530ad6b9e | 611 | do { |
va009039 |
1:e74530ad6b9e | 612 | int ch = file_getc(inputfile); |
va009039 |
2:908338b1151a | 613 | if (ch<1) { |
va009039 |
1:e74530ad6b9e | 614 | if (input_ptr == peek(a_PI)) { |
va009039 |
2:908338b1151a | 615 | file_close(inputfile); |
va009039 |
2:908338b1151a | 616 | inputfile = NULL; |
va009039 |
2:908338b1151a | 617 | pokeB(LOADFLAG, 0); |
va009039 |
1:e74530ad6b9e | 618 | input_ptr = 0x200; |
va009039 |
1:e74530ad6b9e | 619 | } |
va009039 |
2:908338b1151a | 620 | break; |
va009039 |
1:e74530ad6b9e | 621 | } |
va009039 |
1:e74530ad6b9e | 622 | if (ch=='\r') { |
va009039 |
1:e74530ad6b9e | 623 | /* ignore \r, we expect at least also a \n as end-of-line */ |
va009039 |
1:e74530ad6b9e | 624 | } else if (ch=='\n') { |
va009039 |
1:e74530ad6b9e | 625 | input_ptr=(input_ptr&0xffc0)+64; |
va009039 |
1:e74530ad6b9e | 626 | } else { |
va009039 |
1:e74530ad6b9e | 627 | pokeB(input_ptr++,ch); |
va009039 |
1:e74530ad6b9e | 628 | } |
va009039 |
1:e74530ad6b9e | 629 | } while (input_ptr<1024 && inputfile); /* 1024 = TVE */ |
va009039 |
1:e74530ad6b9e | 630 | |
va009039 |
1:e74530ad6b9e | 631 | if (input_ptr!=peek(a_PI)) { |
va009039 |
1:e74530ad6b9e | 632 | pokeB(READYFLAG,1); |
va009039 |
1:e74530ad6b9e | 633 | poke(a_PE,input_ptr-1); |
va009039 |
1:e74530ad6b9e | 634 | idle=0; |
va009039 |
1:e74530ad6b9e | 635 | } |
va009039 |
1:e74530ad6b9e | 636 | } |
va009039 |
1:e74530ad6b9e | 637 | |
va009039 |
1:e74530ad6b9e | 638 | void BaseIPS::emulator() { |
va009039 |
1:e74530ad6b9e | 639 | PPC = 0x0400; |
va009039 |
1:e74530ad6b9e | 640 | input_ptr = peek(a_PI); |
va009039 |
1:e74530ad6b9e | 641 | while(1) { |
va009039 |
1:e74530ad6b9e | 642 | HP = peek(PPC); |
va009039 |
1:e74530ad6b9e | 643 | PPC += 2; |
va009039 |
1:e74530ad6b9e | 644 | exec: u16 CPC = peek(HP); |
va009039 |
1:e74530ad6b9e | 645 | HP += 2; |
va009039 |
1:e74530ad6b9e | 646 | trace(cycle++, PPC-2, HP-2, CPC, PS, RS); |
va009039 |
1:e74530ad6b9e | 647 | switch(CPC) { |
va009039 |
2:908338b1151a | 648 | case 0: c_rumpelstilzchen(); break; |
va009039 |
1:e74530ad6b9e | 649 | case 1: c_defex(); break; |
va009039 |
1:e74530ad6b9e | 650 | case 2: c_consex(); break; |
va009039 |
1:e74530ad6b9e | 651 | case 3: c_varex(); break; |
va009039 |
1:e74530ad6b9e | 652 | case 4: c_retex(); break; |
va009039 |
1:e74530ad6b9e | 653 | case 5: c_get(); break; |
va009039 |
1:e74530ad6b9e | 654 | case 6: c_getB(); break; |
va009039 |
1:e74530ad6b9e | 655 | case 7: c_put(); break; |
va009039 |
1:e74530ad6b9e | 656 | case 8: c_putB(); break; |
va009039 |
1:e74530ad6b9e | 657 | case 9: c_1bliteral(); break; |
va009039 |
1:e74530ad6b9e | 658 | case 10: c_2bliteral(); break; |
va009039 |
1:e74530ad6b9e | 659 | case 11: c_bronz(); break; |
va009039 |
1:e74530ad6b9e | 660 | case 12: c_jump(); break; |
va009039 |
1:e74530ad6b9e | 661 | case 13: c_weg(); break; |
va009039 |
1:e74530ad6b9e | 662 | case 14: c_pweg(); break; |
va009039 |
1:e74530ad6b9e | 663 | case 15: c_plus(); break; |
va009039 |
1:e74530ad6b9e | 664 | case 16: c_minus(); break; |
va009039 |
1:e74530ad6b9e | 665 | case 17: c_dup(); break; |
va009039 |
1:e74530ad6b9e | 666 | case 18: c_pdup(); break; |
va009039 |
1:e74530ad6b9e | 667 | case 19: c_vert(); break; |
va009039 |
1:e74530ad6b9e | 668 | case 20: c_zwo(); break; |
va009039 |
1:e74530ad6b9e | 669 | case 21: c_rdu(); break; |
va009039 |
1:e74530ad6b9e | 670 | case 22: c_rdo(); break; |
va009039 |
1:e74530ad6b9e | 671 | case 23: c_index(); break; |
va009039 |
1:e74530ad6b9e | 672 | case 24: c_s_to_r(); break; |
va009039 |
1:e74530ad6b9e | 673 | case 25: c_r_to_s(); break; |
va009039 |
1:e74530ad6b9e | 674 | case 26: c_eqz(); break; |
va009039 |
1:e74530ad6b9e | 675 | case 27: c_gz(); break; |
va009039 |
1:e74530ad6b9e | 676 | case 28: c_lz(); break; |
va009039 |
1:e74530ad6b9e | 677 | case 29: c_geu(); break; |
va009039 |
1:e74530ad6b9e | 678 | case 30: c_f_vergl(); break; |
va009039 |
1:e74530ad6b9e | 679 | case 31: c_nicht(); break; |
va009039 |
1:e74530ad6b9e | 680 | case 32: c_und(); break; |
va009039 |
1:e74530ad6b9e | 681 | case 33: c_oder(); break; |
va009039 |
1:e74530ad6b9e | 682 | case 34: c_exo(); break; |
va009039 |
1:e74530ad6b9e | 683 | case 35: c_bit(); break; |
va009039 |
1:e74530ad6b9e | 684 | case 36: c_cbit(); break; |
va009039 |
1:e74530ad6b9e | 685 | case 37: c_sbit(); break; |
va009039 |
1:e74530ad6b9e | 686 | case 38: c_tbit(); break; |
va009039 |
1:e74530ad6b9e | 687 | case 39: c_jeex(); break; |
va009039 |
1:e74530ad6b9e | 688 | case 40: c_loopex(); break; |
va009039 |
1:e74530ad6b9e | 689 | case 41: c_plusloopex(); break; |
va009039 |
1:e74530ad6b9e | 690 | case 42: c_fieldtrans(); break; |
va009039 |
1:e74530ad6b9e | 691 | case 43: c_pmul(); break; |
va009039 |
1:e74530ad6b9e | 692 | case 44: c_pdiv(); break; |
va009039 |
1:e74530ad6b9e | 693 | case 45: c_tue(); goto exec; |
va009039 |
1:e74530ad6b9e | 694 | case 46: c_polyname(); break; |
va009039 |
1:e74530ad6b9e | 695 | case 47: c_scode(); break; |
va009039 |
1:e74530ad6b9e | 696 | case 48: c_cscan(); break; |
va009039 |
1:e74530ad6b9e | 697 | case 49: c_chs(); break; |
va009039 |
1:e74530ad6b9e | 698 | case 50: c_cyc2(); break; |
va009039 |
1:e74530ad6b9e | 699 | case 51: c_close(); break; |
va009039 |
1:e74530ad6b9e | 700 | case 52: c_open(); break; |
va009039 |
1:e74530ad6b9e | 701 | case 53: c_oscli(); break; |
va009039 |
1:e74530ad6b9e | 702 | case 54: c_load(); break; |
va009039 |
1:e74530ad6b9e | 703 | case 55: c_save(); break; |
va009039 |
1:e74530ad6b9e | 704 | case 56: c_setkbptr(); break; |
va009039 |
1:e74530ad6b9e | 705 | case 57: c_getPS(); break; |
va009039 |
1:e74530ad6b9e | 706 | case 58: c_setPS(); break; |
va009039 |
1:e74530ad6b9e | 707 | case 59: c_rp_code(); break; |
va009039 |
1:e74530ad6b9e | 708 | case 60: c_tr_code(); break; |
va009039 |
1:e74530ad6b9e | 709 | case 61: c_swap3(); break; |
va009039 |
1:e74530ad6b9e | 710 | case 62: c_defchar(); break; |
va009039 |
1:e74530ad6b9e | 711 | case 63: c_pplus(); break; |
va009039 |
1:e74530ad6b9e | 712 | case 64: c_pminus(); break; |
va009039 |
2:908338b1151a | 713 | default: usercode(CPC); break; |
va009039 |
1:e74530ad6b9e | 714 | } |
va009039 |
1:e74530ad6b9e | 715 | do_io(); |
va009039 |
1:e74530ad6b9e | 716 | if (test_20ms()) { |
va009039 |
1:e74530ad6b9e | 717 | do_20ms(); |
va009039 |
1:e74530ad6b9e | 718 | } |
va009039 |
1:e74530ad6b9e | 719 | if (inputfile) { |
va009039 |
1:e74530ad6b9e | 720 | if (!(peekB(READYFLAG)&1) && (peekB(LOADFLAG)&1)) { |
va009039 |
1:e74530ad6b9e | 721 | read_inputfile(); |
va009039 |
1:e74530ad6b9e | 722 | } |
va009039 |
1:e74530ad6b9e | 723 | } |
va009039 |
1:e74530ad6b9e | 724 | } |
va009039 |
1:e74530ad6b9e | 725 | } |
va009039 |
1:e74530ad6b9e | 726 | |
va009039 |
1:e74530ad6b9e | 727 | void BaseIPS::load_image(const u8* image, int size) { |
va009039 |
1:e74530ad6b9e | 728 | for(int i = 0; i < size; i++) { |
va009039 |
1:e74530ad6b9e | 729 | pokeB(i, *image++); |
va009039 |
1:e74530ad6b9e | 730 | } |
va009039 |
1:e74530ad6b9e | 731 | } |
va009039 |
1:e74530ad6b9e | 732 | |
va009039 |
1:e74530ad6b9e | 733 | void BaseIPS::command(const char* s) { |
va009039 |
1:e74530ad6b9e | 734 | if (s) { |
va009039 |
1:e74530ad6b9e | 735 | int cmd_len = strlen(s); |
va009039 |
1:e74530ad6b9e | 736 | for(int i = 0; i < cmd_len; i++) { |
va009039 |
1:e74530ad6b9e | 737 | pokeB(i + 64*8, *s++); |
va009039 |
1:e74530ad6b9e | 738 | } |
va009039 |
1:e74530ad6b9e | 739 | poke(a_PE, 0x200 + cmd_len); |
va009039 |
1:e74530ad6b9e | 740 | pokeB(READYFLAG, 1); |
va009039 |
1:e74530ad6b9e | 741 | } |
va009039 |
1:e74530ad6b9e | 742 | } |
va009039 |
1:e74530ad6b9e | 743 | |
va009039 |
1:e74530ad6b9e | 744 |