kip/kmm32.c

70 lines
1.9 KiB
C

#include"kmm32.h"
#define A a=pop()
#define AB b=pop(),A
#define DS ((W*)(mem+(MEMSZ-0x800)))
#define RS ((W*)(mem+(MEMSZ-0x400)))
B dp,rp,mem[MEMSZ];
W ip;
_ W pop(V){R DS[--dp];}
_ W por(V){R RS[--rp];}
_ V put(W i){DS[dp++]=i;}
_ V pur(W i){RS[rp++]=i;}
B lob(W i){R mem[i];}
H loh(W i){R lob(i)<<8|lob(i+1);}
W low(W i){R loh(i)<<16|loh(i+2);}
V stb(W i,B b){mem[i]=b;}
V sth(W i,H h){stb(i,h>>8),stb(i+1,h);}
V stw(W i,W w){sth(i,w>>16),sth(i+2,w);}
V vec(W i){Q(0x100<(i=low(i)),pur(ip),ip=i)}
_ W a,b;
_ V np(V){}
_ V ex(V){ip+=0x40001;}
_ V pb(V){put(lob(ip)),ip+=1;}
_ V ph(V){put(loh(ip)),ip+=2;}
_ V pw(V){put(low(ip)),ip+=4;}
_ V fb(V){put(lob(pop()));}
_ V fh(V){put(loh(pop()));}
_ V fw(V){put(low(pop()));}
_ V mb(V){AB,stb(b,a);}
_ V mh(V){AB,sth(b,a);}
_ V mw(V){AB,stw(b,a);}
_ V io(V){AB,ios[b].io(a);}
_ V ii(V){put(ios[pop()].oi());}
_ V md(V){pur(pop());}
_ V mr(V){put(por());}
_ V dd(V){--dp;}
_ V dr(V){--rp;}
_ V du(V){put(DS[dp-1]);}
_ V sw(V){AB,put(b),put(a);}
_ V ov(V){put(DS[dp-2]);}
_ V ad(V){AB,put(a+b);}
_ V su(V){AB,put(a-b);}
_ V mu(V){AB,put(a*b);}
_ V di(V){AB,put(a/b),put(a%b);}
_ V an(V){AB,put(a&b);}
_ V or(V){AB,put(a|b);}
_ V xr(V){AB,put(a^b);}
_ V sl(V){AB,put(a<<b);}
_ V sr(V){AB,put(a>>b);}
_ V sa(V){AB,put((Ws)a>>b);}
_ V eq(V){AB,put(a==b);}
_ V lt(V){AB,put(a<b);}
_ V gt(V){AB,put(a>b);}
_ V no(V){put(!pop());}
_ V ju(V){ip=pop();}
_ V jc(V){AB;Q(a,ip=b)}
_ V ca(V){pur(ip),ip=pop();}
_ V cc(V){AB;Q(a,ip=b)}
_ V(*ops[])(V)=
/*0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25*/
/*0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37*/
{np,ex,pb,ph,pw,fb,fh,fw,mb,mh,mw,io,ii,md,mr,dd,dr,du,sw,ov,ad,su,mu,di,an,or,xr,sl,sr,sa,eq,lt,gt,no,ju,jc,ca,cc};
V emu(W c){while(c--&&ip<0x40000)ops[mem[ip++]]();}
V lod(B*c,W l){for(ip=0;ip<l;++ip)mem[ip+0x100]=c[ip];dp=rp=0,ip=0x100;}