char dispatch_mem() { Z80 &cpu = CpuMgr.Cpu(); if (!mem_max) return 0; if (mem_ascii) { u8 Kbd[256]; GetKeyboardState(Kbd); unsigned short k; if (ToAscii(input.lastkey,0,Kbd,&k,0) != 1) return 0; k &= 0xFF; if (k < 0x20 || k >= 0x80) return 0; editwm(cpu.mem_curs, (unsigned char)k); mright(); return 1; } else { if ((input.lastkey >= '0' && input.lastkey <= '9') || (input.lastkey >= 'A' && input.lastkey <= 'F')) { unsigned char k = (input.lastkey >= 'A') ? input.lastkey-'A'+10 : input.lastkey-'0'; unsigned char c = editrm(cpu.mem_curs); if (cpu.mem_second) editwm(cpu.mem_curs, (c & 0xF0) | k); else editwm(cpu.mem_curs, (c & 0x0F) | (k << 4)); mright(); return 1; } } return 0; }
int play(void) { int i; Mouse om; int s; Rune r; Alt alts[NALT+1]; alts[TIMER].c = timerc; alts[TIMER].v = nil; alts[TIMER].op = CHANRCV; alts[MOUSE].c = mousec; alts[MOUSE].v = &mouse; alts[MOUSE].op = CHANRCV; alts[SUSPEND].c = suspc; alts[SUSPEND].v = &s; alts[SUSPEND].op = CHANRCV; alts[RESHAPE].c = mousectl->resizec; alts[RESHAPE].v = nil; alts[RESHAPE].op = CHANRCV; alts[KBD].c = kbdc; alts[KBD].v = &r; alts[KBD].op = CHANRCV; alts[NALT].op = CHANEND; dt = 64; lastmx = -1; lastmx = movemouse(); choosepiece(); lastmx = warp(mouse.xy, lastmx); for(;;) switch(alt(alts)) { case MOUSE: if(suspended) { om = mouse; break; } if(lastmx < 0) lastmx = mouse.xy.x; if(mouse.xy.x > lastmx+DMOUSE) { mright(); lastmx = mouse.xy.x; } if(mouse.xy.x < lastmx-DMOUSE) { mleft(); lastmx = mouse.xy.x; } if(mouse.buttons&1 && !(om.buttons&1)) rleft(); if(mouse.buttons&2 && !(om.buttons&2)) if(drop(1)) return 1; if(mouse.buttons&4 && !(om.buttons&4)) rright(); om = mouse; break; case SUSPEND: if (!suspended && s) suspend(1); else if (suspended && !s) { suspend(0); lastmx = warp(mouse.xy, lastmx); } break; case RESHAPE: redraw(1); break; case KBD: if(suspended) break; switch(r) { case 'f': case ';': mright(); break; case 'a': case 'j': mleft(); break; case 'd': case 'l': rright(); break; case 's': case 'k': rleft(); break; case ' ': if(drop(1)) return 1; break; } break; case TIMER: if(suspended) break; dt -= tsleep; if(dt < 0) { i = 1; dt = 16 * (points+nrand(10000)-5000) / 10000; if(dt >= 32) { i += (dt-32)/16; dt = 32; } dt = 52-dt; while(i-- > 0) if(movepiece()==0 && ++fusst==40) { if(drop(0)) return 1; break; } } break; } }