Skip to content

Instantly share code, notes, and snippets.

@creaktive
Created May 18, 2011 13:07
Show Gist options
  • Star 11 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save creaktive/978540 to your computer and use it in GitHub Desktop.
Save creaktive/978540 to your computer and use it in GitHub Desktop.
Javascript PC Emulator by Fabrice Bellard
/*
PC Emulator
Copyright (c) 2011 Fabrice Bellard
Redistribution or commercial use is prohibited without the author's
permission.
*/
"use strict";
var aa;
var ba=[1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1];
var ca=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14];
var da=[0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,8,0,1,2,3,4];
function ea() {
var i,fa;
this.regs=new Array();
for(i=0; i<8; i++)this.regs[i]=0;
this.eip=0;
this.cc_op=0;
this.cc_dst=0;
this.cc_src=0;
this.cc_op2=0;
this.cc_dst2=0;
this.df=1;
this.eflags=0x2;
this.cycle_count=0;
this.hard_irq=0;
this.cpl=0;
this.cr0=(1<<0);
this.cr2=0;
this.cr3=0;
this.cr4=0;
this.idt= {base:0,limit:0};
this.gdt= {base:0,limit:0};
this.segs=new Array();
for(i=0; i<6; i++) {
this.segs[i]= {selector:0,base:0,limit:0,flags:0};
}
this.tr= {selector:0,base:0,limit:0,flags:0};
this.ldt= {selector:0,base:0,limit:0,flags:0};
this.halted=0;
this.phys_mem=null;
fa=0x100000;
this.tlb_read_kernel=new Int32Array(fa);
this.tlb_write_kernel=new Int32Array(fa);
this.tlb_read_user=new Int32Array(fa);
this.tlb_write_user=new Int32Array(fa);
for(i=0; i<fa; i++) {
this.tlb_read_kernel[i]=-1;
this.tlb_write_kernel[i]=-1;
this.tlb_read_user[i]=-1;
this.tlb_write_user[i]=-1;
}
this.tlb_pages=new Int32Array(2048);
this.tlb_pages_count=0;
}
ea.prototype.phys_mem_resize=function(ga) {
this.mem_size=ga;
this.phys_mem=new ArrayBuffer(ga);
this.phys_mem8=new Uint8Array(this.phys_mem,0,ga);
this.phys_mem16=new Uint16Array(this.phys_mem,0,ga/2);
this.phys_mem32=new Int32Array(this.phys_mem,0,ga/4);
};
ea.prototype.ld8_phys=function(ha) {
return this.phys_mem8[ha];
};
ea.prototype.st8_phys=function(ha,ia) {
this.phys_mem8[ha]=ia;
};
ea.prototype.ld32_phys=function(ha) {
return this.phys_mem32[ha>>2];
};
ea.prototype.st32_phys=function(ha,ia) {
this.phys_mem32[ha>>2]=ia;
};
ea.prototype.tlb_set_page=function(ha,ja,ka,la) {
var i,ia,j;
ja&=-4096;
ha&=-4096;
ia=ha^ja;
i=ha>>>12;
if(this.tlb_read_kernel[i]==-1) {
if(this.tlb_pages_count>=2048) {
this.tlb_flush_all1((i-1)&0xfffff);
}
this.tlb_pages[this.tlb_pages_count++]=i;
}
this.tlb_read_kernel[i]=ia;
if(ka) {
this.tlb_write_kernel[i]=ia;
} else {
this.tlb_write_kernel[i]=-1;
}
if(la) {
this.tlb_read_user[i]=ia;
if(ka) {
this.tlb_write_user[i]=ia;
} else {
this.tlb_write_user[i]=-1;
}
} else {
this.tlb_read_user[i]=-1;
this.tlb_write_user[i]=-1;
}
};
ea.prototype.tlb_flush_page=function(ha) {
var i;
i=ha>>>12;
this.tlb_read_kernel[i]=-1;
this.tlb_write_kernel[i]=-1;
this.tlb_read_user[i]=-1;
this.tlb_write_user[i]=-1;
};
ea.prototype.tlb_flush_all=function() {
var i,j,n,ma;
ma=this.tlb_pages;
n=this.tlb_pages_count;
for(j=0; j<n; j++) {
i=ma[j];
this.tlb_read_kernel[i]=-1;
this.tlb_write_kernel[i]=-1;
this.tlb_read_user[i]=-1;
this.tlb_write_user[i]=-1;
}
this.tlb_pages_count=0;
};
ea.prototype.tlb_flush_all1=function(na) {
var i,j,n,ma,oa;
ma=this.tlb_pages;
n=this.tlb_pages_count;
oa=0;
for(j=0; j<n; j++) {
i=ma[j];
if(i==na) {
ma[oa++]=i;
} else {
this.tlb_read_kernel[i]=-1;
this.tlb_write_kernel[i]=-1;
this.tlb_read_user[i]=-1;
this.tlb_write_user[i]=-1;
}
}
this.tlb_pages_count=oa;
};
ea.prototype.st8_N=function(ha,pa) {
var i;
for(i=0; i<pa.length; i++) {
this.st8_phys(ha+i,pa[i]);
}
};
function qa(ia,n) {
var i,s;
var h="0123456789ABCDEF";
s="";
for(i=n-1; i>=0; i--) {
s=s+h[(ia>>>(i*4))&15];
}
return s;
}
function ra(n) {
return qa(n,8);
}
function sa(n) {
return qa(n,2);
}
function ta(n) {
return qa(n,4);
}
ea.prototype.dump=function() {
var i,ua,va;
var wa=[" ES"," CS"," SS"," DS"," FS"," GS","LDT"," TR"];
console.log("TSC="+ra(this.cycle_count)+" EIP="+ra(this.eip)+"\nEAX="+ra(this.regs[0])+" ECX="+ra(this.regs[1])+" EDX="+ra(this.regs[2])+" EBX="+ra(this.regs[3])+" ESP="+ra(this.regs[4])+" EBP="+ra(this.regs[5]));
console.log("ESI="+ra(this.regs[6])+" EDI="+ra(this.regs[7]));
console.log("EFL="+ra(this.eflags)+" OP="+sa(this.cc_op)+" SRC="+ra(this.cc_src)+" DST="+ra(this.cc_dst)+" OP2="+sa(this.cc_op2)+" DST2="+ra(this.cc_dst2));
console.log("CPL="+this.cpl+" CR0="+ra(this.cr0)+" CR2="+ra(this.cr2)+" CR3="+ra(this.cr3)+" CR4="+ra(this.cr4));
va="";
for(i=0; i<8; i++) {
if(i==6)ua=this.ldt;
else if(i==7)ua=this.tr;
else ua=this.segs[i];
va+=wa[i]+"="+ta(ua.selector)+" "+ra(ua.base)+" "+ra(ua.limit)+" "+ta((ua.flags>>8)&0xf0ff);
if(i&1) {
console.log(va);
va="";
} else {
va+=" ";
}
}
ua=this.gdt;
va="GDT= "+ra(ua.base)+" "+ra(ua.limit)+" ";
ua=this.idt;
va+="IDT= "+ra(ua.base)+" "+ra(ua.limit);
console.log(va);
};
ea.prototype.exec=function(xa) {
var ya,ha,za;
var Aa,Ba,Ca,Da,Ea;
var Fa,Ga,Ha,b,Ia,ia,Ja,Ka,La,Ma,Na,Oa;
var Pa,Qa;
var Ra,Sa,Ta,Ua;
var Va,Wa,Xa,Ya,Za,ab;
function bb() {
var cb;
db(ha,0,ya.cpl==3);
cb=Za[ha>>>12]^ha;
return Ra[cb];
}
function eb() {
var Ua;
return(((Ua=Za[ha>>>12])==-1)?bb():Ra[ha^Ua]);
}
function fb() {
var ia;
ia=eb();
ha++;
ia|=eb()<<8;
ha--;
return ia;
}
function gb() {
var Ua;
return(((Ua=Za[ha>>>12])|ha)&1?fb():Sa[(ha^Ua)>>1]);
}
function hb() {
var ia;
ia=eb();
ha++;
ia|=eb()<<8;
ha++;
ia|=eb()<<16;
ha++;
ia|=eb()<<24;
ha-=3;
return ia;
}
function ib() {
var Ua;
return(((Ua=Za[ha>>>12])|ha)&3?hb():Ta[(ha^Ua)>>2]);
}
function jb() {
var cb;
db(ha,1,ya.cpl==3);
cb=ab[ha>>>12]^ha;
return Ra[cb];
}
function kb() {
var cb;
return((cb=ab[ha>>>12])==-1)?jb():Ra[ha^cb];
}
function lb() {
var ia;
ia=kb();
ha++;
ia|=kb()<<8;
ha--;
return ia;
}
function mb() {
var cb;
return((cb=ab[ha>>>12])|ha)&1?lb():Sa[(ha^cb)>>1];
}
function nb() {
var ia;
ia=kb();
ha++;
ia|=kb()<<8;
ha++;
ia|=kb()<<16;
ha++;
ia|=kb()<<24;
ha-=3;
return ia;
}
function ob() {
var cb;
return((cb=ab[ha>>>12])|ha)&3?nb():Ta[(ha^cb)>>2];
}
function pb(ia) {
var cb;
db(ha,1,ya.cpl==3);
cb=ab[ha>>>12]^ha;
Ra[cb]=ia;
}
function qb(ia) {
var Ua;
{
Ua=ab[ha>>>12];
if(Ua==-1) {
pb(ia);
} else {
Ra[ha^Ua]=ia;
}
};
}
function rb(ia) {
qb(ia);
ha++;
qb(ia>>8);
ha--;
}
function sb(ia) {
var Ua;
{
Ua=ab[ha>>>12];
if((Ua|ha)&1) {
rb(ia);
} else {
Sa[(ha^Ua)>>1]=ia;
}
};
}
function tb(ia) {
qb(ia);
ha++;
qb(ia>>8);
ha++;
qb(ia>>16);
ha++;
qb(ia>>24);
ha-=3;
}
function ub(ia) {
var Ua;
{
Ua=ab[ha>>>12];
if((Ua|ha)&3) {
tb(ia);
} else {
Ta[(ha^Ua)>>2]=ia;
}
};
}
function vb() {
var cb;
db(ha,0,0);
cb=Va[ha>>>12]^ha;
return Ra[cb];
}
function wb() {
var cb;
return((cb=Va[ha>>>12])==-1)?vb():Ra[ha^cb];
}
function xb() {
var ia;
ia=wb();
ha++;
ia|=wb()<<8;
ha--;
return ia;
}
function yb() {
var cb;
return((cb=Va[ha>>>12])|ha)&1?xb():Sa[(ha^cb)>>1];
}
function zb() {
var ia;
ia=wb();
ha++;
ia|=wb()<<8;
ha++;
ia|=wb()<<16;
ha++;
ia|=wb()<<24;
ha-=3;
return ia;
}
function Ab() {
var cb;
return((cb=Va[ha>>>12])|ha)&3?zb():Ta[(ha^cb)>>2];
}
function Bb(ia) {
var cb;
db(ha,1,0);
cb=Wa[ha>>>12]^ha;
Ra[cb]=ia;
}
function Cb(ia) {
var cb;
cb=Wa[ha>>>12];
if(cb==-1) {
Bb(ia);
} else {
Ra[ha^cb]=ia;
}
}
function Db(ia) {
Cb(ia);
ha++;
Cb(ia>>8);
ha--;
}
function Eb(ia) {
var cb;
cb=Wa[ha>>>12];
if((cb|ha)&1) {
Db(ia);
} else {
Sa[(ha^cb)>>1]=ia;
}
}
function Fb(ia) {
Cb(ia);
ha++;
Cb(ia>>8);
ha++;
Cb(ia>>16);
ha++;
Cb(ia>>24);
ha-=3;
}
function Gb(ia) {
var cb;
cb=Wa[ha>>>12];
if((cb|ha)&3) {
Fb(ia);
} else {
Ta[(ha^cb)>>2]=ia;
}
}
var Hb,Ib;
function Jb(ha) {
var cb;
db(ha,0,ya.cpl==3);
cb=Za[ha>>>12]^ha;
return Ra[cb];
}
function Kb() {
var ia,Ja;
ia=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
return ia|(Ja<<8);
}
function Lb() {
var ia,Ja,cb;
cb=Za[Hb>>>12];
if(((Hb|cb)&0xfff)<=4092) {
cb^=Hb;
ia=Ra[cb]|(Ra[cb+1]<<8)|(Ra[cb+2]<<16)|(Ra[cb+3]<<24);
Hb+=4;
} else {
ia=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ia|=Ja<<8;
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ia|=Ja<<16;
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ia|=Ja<<24;
}
return ia;
}
function Mb(Ga,Nb) {
var base,ha,Ob,Pb;
switch((Ga&7)|((Ga>>3)&0x18)) {
case 0x04:
Ob=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
base=Ob&7;
if(base==5) {
ha=Lb();
} else {
ha=za[base];
if(Nb&&base==4)ha=(ha+Nb)&-1;
}
Pb=(Ob>>3)&7;
if(Pb!=4) {
ha=(ha+(za[Pb]<<(Ob>>6)))&-1;
}
break;
case 0x0c:
Ob=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ha=((((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua])<<24)>>24;
Hb++;;
base=Ob&7;
ha=(ha+za[base])&-1;
if(Nb&&base==4)ha=(ha+Nb)&-1;
Pb=(Ob>>3)&7;
if(Pb!=4) {
ha=(ha+(za[Pb]<<(Ob>>6)))&-1;
}
break;
case 0x14:
Ob=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ha=Lb();
base=Ob&7;
ha=(ha+za[base])&-1;
if(Nb&&base==4)ha=(ha+Nb)&-1;
Pb=(Ob>>3)&7;
if(Pb!=4) {
ha=(ha+(za[Pb]<<(Ob>>6)))&-1;
}
break;
case 0x05:
ha=Lb();
break;
case 0x00:
case 0x01:
case 0x02:
case 0x03:
case 0x06:
case 0x07:
base=Ga&7;
ha=za[base];
break;
case 0x08:
case 0x09:
case 0x0a:
case 0x0b:
case 0x0d:
case 0x0e:
case 0x0f:
ha=((((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua])<<24)>>24;
Hb++;;
base=Ga&7;
ha=(ha+za[base])&-1;
break;
case 0x10:
case 0x11:
case 0x12:
case 0x13:
case 0x15:
case 0x16:
case 0x17:
ha=Lb();
base=Ga&7;
ha=(ha+za[base])&-1;
break;
default:
throw"get_modrm";
}
if(Fa&0x000f) {
ha=(ha+ya.segs[(Fa&0x000f)-1].base)&-1;
}
return ha;
}
function Qb() {
var ha;
ha=Lb();
if(Fa&0x000f) {
ha=(ha+ya.segs[(Fa&0x000f)-1].base)&-1;
}
return ha;
}
function Rb(Ia,ia) {
if(Ia&4)za[Ia&3]=(za[Ia&3]&-65281)|((ia&0xff)<<8);
else za[Ia&3]=(za[Ia&3]&-256)|(ia&0xff);
}
function Sb(Ia,ia) {
za[Ia]=(za[Ia]&-65536)|(ia&0xffff);
}
function Tb(La,Ub,Vb) {
var Wb;
switch(La) {
case 0:
Aa=Vb;
Ub=(Ub+Vb)&-1;
Ba=Ub;
Ca=0;
break;
case 1:
Ub=Ub|Vb;
Ba=Ub;
Ca=12;
break;
case 2:
Wb=Xb(2);
Aa=Vb;
Ub=(Ub+Vb+Wb)&-1;
Ba=Ub;
Ca=Wb?3:0;
break;
case 3:
Wb=Xb(2);
Aa=Vb;
Ub=(Ub-Vb-Wb)&-1;
Ba=Ub;
Ca=Wb?9:6;
break;
case 4:
Ub=Ub&Vb;
Ba=Ub;
Ca=12;
break;
case 5:
Aa=Vb;
Ub=(Ub-Vb)&-1;
Ba=Ub;
Ca=6;
break;
case 6:
Ub=Ub^Vb;
Ba=Ub;
Ca=12;
break;
case 7:
Aa=Vb;
Ba=(Ub-Vb)&-1;
Ca=6;
break;
default:
throw"arith"+8+": invalid op";
}
return Ub;
}
function Yb(ia) {
if(Ca<25) {
Da=Ca;
}
Ea=(ia+1)&-1;
Ca=25;
return Ea;
}
function Zb(ia) {
if(Ca<25) {
Da=Ca;
}
Ea=(ia-1)&-1;
Ca=28;
return Ea;
}
function ac(La,Ub,Vb) {
var Wb;
switch(La) {
case 0:
Aa=Vb;
Ub=(Ub+Vb)&-1;
Ba=Ub;
Ca=1;
break;
case 1:
Ub=Ub|Vb;
Ba=Ub;
Ca=13;
break;
case 2:
Wb=Xb(2);
Aa=Vb;
Ub=(Ub+Vb+Wb)&-1;
Ba=Ub;
Ca=Wb?4:1;
break;
case 3:
Wb=Xb(2);
Aa=Vb;
Ub=(Ub-Vb-Wb)&-1;
Ba=Ub;
Ca=Wb?10:7;
break;
case 4:
Ub=Ub&Vb;
Ba=Ub;
Ca=13;
break;
case 5:
Aa=Vb;
Ub=(Ub-Vb)&-1;
Ba=Ub;
Ca=7;
break;
case 6:
Ub=Ub^Vb;
Ba=Ub;
Ca=13;
break;
case 7:
Aa=Vb;
Ba=(Ub-Vb)&-1;
Ca=7;
break;
default:
throw"arith"+16+": invalid op";
}
return Ub;
}
function bc(ia) {
if(Ca<25) {
Da=Ca;
}
Ea=(ia+1)&-1;
Ca=26;
return Ea;
}
function cc(ia) {
if(Ca<25) {
Da=Ca;
}
Ea=(ia-1)&-1;
Ca=29;
return Ea;
}
function dc(La,Ub,Vb) {
var Wb;
switch(La) {
case 0:
Aa=Vb;
Ub=(Ub+Vb)&-1;
Ba=Ub;
Ca=2;
break;
case 1:
Ub=Ub|Vb;
Ba=Ub;
Ca=14;
break;
case 2:
Wb=Xb(2);
Aa=Vb;
Ub=(Ub+Vb+Wb)&-1;
Ba=Ub;
Ca=Wb?5:2;
break;
case 3:
Wb=Xb(2);
Aa=Vb;
Ub=(Ub-Vb-Wb)&-1;
Ba=Ub;
Ca=Wb?11:8;
break;
case 4:
Ub=Ub&Vb;
Ba=Ub;
Ca=14;
break;
case 5:
Aa=Vb;
Ub=(Ub-Vb)&-1;
Ba=Ub;
Ca=8;
break;
case 6:
Ub=Ub^Vb;
Ba=Ub;
Ca=14;
break;
case 7:
Aa=Vb;
Ba=(Ub-Vb)&-1;
Ca=8;
break;
default:
throw"arith"+32+": invalid op";
}
return Ub;
}
function ec(ia) {
if(Ca<25) {
Da=Ca;
}
Ea=(ia+1)&-1;
Ca=27;
return Ea;
}
function fc(ia) {
if(Ca<25) {
Da=Ca;
}
Ea=(ia-1)&-1;
Ca=30;
return Ea;
}
function gc(La,Ub,Vb) {
var hc,Wb;
switch(La) {
case 0:
if(Vb&0x1f) {
Vb&=0x7;
Ub&=0xff;
hc=Ub;
Ub=(Ub<<Vb)|(Ub>>>(8-Vb));
Aa=ic()&~(0x0800|0x0001);
Aa|=(Ub&0x0001)|(((hc^Ub)<<4)&0x0800);
Ca=24;
}
break;
case 1:
if(Vb&0x1f) {
Vb&=0x7;
Ub&=0xff;
hc=Ub;
Ub=(Ub>>>Vb)|(Ub<<(8-Vb));
Aa=ic()&~(0x0800|0x0001);
Aa|=((Ub>>7)&0x0001)|(((hc^Ub)<<4)&0x0800);
Ca=24;
}
break;
case 2:
Vb=da[Vb&0x1f];
if(Vb) {
Ub&=0xff;
hc=Ub;
Wb=Xb(2);
Ub=(Ub<<Vb)|(Wb<<(Vb-1));
if(Vb>1)Ub|=hc>>>(9-Vb);
Aa=ic()&~(0x0800|0x0001);
Aa|=(((hc^Ub)<<4)&0x0800)|((hc>>(8-Vb))&0x0001);
Ca=24;
}
break;
case 3:
Vb=da[Vb&0x1f];
if(Vb) {
Ub&=0xff;
hc=Ub;
Wb=Xb(2);
Ub=(Ub>>>Vb)|(Wb<<(8-Vb));
if(Vb>1)Ub|=hc<<(9-Vb);
Aa=ic()&~(0x0800|0x0001);
Aa|=(((hc^Ub)<<4)&0x0800)|((hc>>(Vb-1))&0x0001);
Ca=24;
}
break;
case 4:
case 6:
Vb&=0x1f;
if(Vb) {
Aa=Ub<<(Vb-1);
Ba=Ub=Ub<<Vb;
Ca=15;
}
break;
case 5:
Vb&=0x1f;
if(Vb) {
Ub&=0xff;
Aa=Ub>>>(Vb-1);
Ba=Ub=Ub>>>Vb;
Ca=18;
}
break;
case 7:
Vb&=0x1f;
if(Vb) {
Ub=(Ub<<24)>>24;
Aa=Ub>>(Vb-1);
Ba=Ub=Ub>>Vb;
Ca=18;
}
break;
default:
throw"unsupported shift8="+La;
}
return Ub;
}
function jc(La,Ub,Vb) {
var hc,Wb;
switch(La) {
case 0:
if(Vb&0x1f) {
Vb&=0xf;
Ub&=0xffff;
hc=Ub;
Ub=(Ub<<Vb)|(Ub>>>(16-Vb));
Aa=ic()&~(0x0800|0x0001);
Aa|=(Ub&0x0001)|(((hc^Ub)>>4)&0x0800);
Ca=24;
}
break;
case 1:
if(Vb&0x1f) {
Vb&=0xf;
Ub&=0xffff;
hc=Ub;
Ub=(Ub>>>Vb)|(Ub<<(16-Vb));
Aa=ic()&~(0x0800|0x0001);
Aa|=((Ub>>15)&0x0001)|(((hc^Ub)>>4)&0x0800);
Ca=24;
}
break;
case 2:
Vb=ca[Vb&0x1f];
if(Vb) {
Ub&=0xffff;
hc=Ub;
Wb=Xb(2);
Ub=(Ub<<Vb)|(Wb<<(Vb-1));
if(Vb>1)Ub|=hc>>>(17-Vb);
Aa=ic()&~(0x0800|0x0001);
Aa|=(((hc^Ub)>>4)&0x0800)|((hc>>(16-Vb))&0x0001);
Ca=24;
}
break;
case 3:
Vb=ca[Vb&0x1f];
if(Vb) {
Ub&=0xffff;
hc=Ub;
Wb=Xb(2);
Ub=(Ub>>>Vb)|(Wb<<(16-Vb));
if(Vb>1)Ub|=hc<<(17-Vb);
Aa=ic()&~(0x0800|0x0001);
Aa|=(((hc^Ub)>>4)&0x0800)|((hc>>(Vb-1))&0x0001);
Ca=24;
}
break;
case 4:
case 6:
Vb&=0x1f;
if(Vb) {
Aa=Ub<<(Vb-1);
Ba=Ub=Ub<<Vb;
Ca=16;
}
break;
case 5:
Vb&=0x1f;
if(Vb) {
Ub&=0xffff;
Aa=Ub>>>(Vb-1);
Ba=Ub=Ub>>>Vb;
Ca=19;
}
break;
case 7:
Vb&=0x1f;
if(Vb) {
Ub=(Ub<<16)>>16;
Aa=Ub>>(Vb-1);
Ba=Ub=Ub>>Vb;
Ca=19;
}
break;
default:
throw"unsupported shift16="+La;
}
return Ub;
}
function kc(La,Ub,Vb) {
var hc,Wb;
switch(La) {
case 0:
Vb&=0x1f;
if(Vb) {
hc=Ub;
Ub=(Ub<<Vb)|(Ub>>>(32-Vb));
Aa=ic()&~(0x0800|0x0001);
Aa|=(Ub&0x0001)|(((hc^Ub)>>20)&0x0800);
Ca=24;
}
break;
case 1:
Vb&=0x1f;
if(Vb) {
hc=Ub;
Ub=(Ub>>>Vb)|(Ub<<(32-Vb));
Aa=ic()&~(0x0800|0x0001);
Aa|=((Ub>>31)&0x0001)|(((hc^Ub)>>20)&0x0800);
Ca=24;
}
break;
case 2:
Vb&=0x1f;
if(Vb) {
hc=Ub;
Wb=Xb(2);
Ub=(Ub<<Vb)|(Wb<<(Vb-1));
if(Vb>1)Ub|=hc>>>(33-Vb);
Aa=ic()&~(0x0800|0x0001);
Aa|=(((hc^Ub)>>20)&0x0800)|((hc>>(32-Vb))&0x0001);
Ca=24;
}
break;
case 3:
Vb&=0x1f;
if(Vb) {
hc=Ub;
Wb=Xb(2);
Ub=(Ub>>>Vb)|(Wb<<(32-Vb));
if(Vb>1)Ub|=hc<<(33-Vb);
Aa=ic()&~(0x0800|0x0001);
Aa|=(((hc^Ub)>>20)&0x0800)|((hc>>(Vb-1))&0x0001);
Ca=24;
}
break;
case 4:
case 6:
Vb&=0x1f;
if(Vb) {
Aa=Ub<<(Vb-1);
Ba=Ub=Ub<<Vb;
Ca=17;
}
break;
case 5:
Vb&=0x1f;
if(Vb) {
Aa=Ub>>>(Vb-1);
Ba=Ub=Ub>>>Vb;
Ca=20;
}
break;
case 7:
Vb&=0x1f;
if(Vb) {
Aa=Ub>>(Vb-1);
Ba=Ub=Ub>>Vb;
Ca=20;
}
break;
default:
throw"unsupported shift32="+La;
}
return Ub;
}
function lc(Ub,Vb,mc) {
mc&=0x1f;
if(mc) {
Aa=Ub<<(mc-1);
Ba=Ub=(Ub<<mc)|(Vb>>>(32-mc));
Ca=17;
}
return Ub;
}
function nc(Ub,Vb,mc) {
mc&=0x1f;
if(mc) {
Aa=Ub>>(mc-1);
Ba=Ub=(Ub>>>mc)|(Vb<<(32-mc));
Ca=20;
}
return Ub;
}
function oc(Ub,Vb) {
Vb&=0x1f;
Aa=Ub>>Vb;
Ca=20;
}
function pc(Ub,Vb) {
Vb&=0x1f;
Aa=Ub>>Vb;
Ub|=(1<<Vb);
Ca=20;
return Ub;
}
function qc(Ub,Vb) {
Vb&=0x1f;
Aa=Ub>>Vb;
Ub&=~(1<<Vb);
Ca=20;
return Ub;
}
function rc(Ub,Vb) {
Vb&=0x1f;
Aa=Ub>>Vb;
Ub^=(1<<Vb);
Ca=20;
return Ub;
}
function sc(Ub,Vb) {
if(Vb) {
Ub=0;
while((Vb&1)==0) {
Ub++;
Vb>>=1;
}
Ba=1;
} else {
Ba=0;
}
Ca=14;
return Ub;
}
function tc(Ub,Vb) {
if(Vb) {
Ub=31;
while(Vb>=0) {
Ub--;
Vb<<=1;
}
Ba=1;
} else {
Ba=0;
}
Ca=14;
return Ub;
}
function uc(b) {
var a,q,r;
a=za[0]&0xffff;
b&=0xff;
if((a>>8)>=b)vc(0);
q=(a/b)&-1;
r=(a%b);
Sb(0,(q&0xff)|(r<<8));
}
function wc(b) {
var a,q,r;
a=(za[0]<<16)>>16;
b=(b<<24)>>24;
if(b==0)vc(0);
q=(a/b)&-1;
if(((q<<24)>>24)!=q)vc(0);
r=(a%b);
Sb(0,(q&0xff)|(r<<8));
}
function xc(b) {
var a,q,r;
a=(za[2]<<16)|(za[0]&0xffff);
b&=0xffff;
if((a>>>16)>=b)vc(0);
q=(a/b)&-1;
r=(a%b);
Sb(0,q);
Sb(2,r);
}
function yc(b) {
var a,q,r;
a=(za[2]<<16)|(za[0]&0xffff);
b=(b<<16)>>16;
if(b==0)vc(0);
q=(a/b)&-1;
if(((q<<16)>>16)!=q)vc(0);
r=(a%b);
Sb(0,q);
Sb(2,r);
}
function zc(Ac,Bc,b) {
var a,i,Cc;
Ac=Ac>>>0;
Bc=Bc>>>0;
b=b>>>0;
if(Ac>=b) {
vc(0);
}
if(Ac>=0&&Ac<=0x200000) {
a=Ac*4294967296+Bc;
Oa=(a%b)&-1;
return(a/b)&-1;
} else {
for(i=0; i<32; i++) {
Cc=Ac>>31;
Ac=((Ac<<1)|(Bc>>>31))>>>0;
if(Cc||Ac>=b) {
Ac=Ac-b;
Bc=(Bc<<1)|1;
} else {
Bc=Bc<<1;
}
}
Oa=Ac&-1;
return Bc;
}
}
function Dc(Ac,Bc,b) {
var Ec,Fc,q;
if(Ac<0) {
Ec=1;
Ac=~Ac;
Bc=(-Bc)&-1;
if(Bc==0)Ac=(Ac+1)&-1;
} else {
Ec=0;
}
if(b<0) {
b=-b&-1;
Fc=1;
} else {
Fc=0;
}
q=zc(Ac,Bc,b);
Fc^=Ec;
if(Fc) {
if((q>>>0)>0x80000000)vc(0);
q=(-q)&-1;
} else {
if((q>>>0)>=0x80000000)vc(0);
}
if(Ec) {
Oa=(-Oa)&-1;
}
return q;
}
function Gc(a,b) {
a&=0xff;
b&=0xff;
Ba=(za[0]&0xff)*(b&0xff);
Aa=Ba>>8;
Ca=21;
return Ba;
}
function Hc(a,b) {
a=(a<<24)>>24;
b=(b<<24)>>24;
Ba=(a*b)&-1;
Aa=(Ba!=((Ba<<24)>>24))>>0;
Ca=21;
return Ba;
}
function Ic(a,b) {
Ba=((a&0xffff)*(b&0xffff))&-1;
Aa=Ba>>>16;
Ca=22;
return Ba;
}
function Jc(a,b) {
a=(a<<16)>>16;
b=(b<<16)>>16;
Ba=(a*b)&-1;
Aa=(Ba!=((Ba<<16)>>16))>>0;
Ca=22;
return Ba;
}
function Kc(a,b) {
var r,Bc,Ac,Lc,Mc,m;
a=a>>>0;
b=b>>>0;
r=a*b;
if(r<=0xffffffff) {
Oa=0;
r&=-1;
} else {
Bc=a&0xffff;
Ac=a>>>16;
Lc=b&0xffff;
Mc=b>>>16;
r=Bc*Lc;
Oa=Ac*Mc;
m=Bc*Mc;
r+=(((m&0xffff)<<16)>>>0);
Oa+=(m>>>16);
if(r>=4294967296) {
r-=4294967296;
Oa++;
}
m=Ac*Lc;
r+=(((m&0xffff)<<16)>>>0);
Oa+=(m>>>16);
if(r>=4294967296) {
r-=4294967296;
Oa++;
}
r&=-1;
Oa&=-1;
}
return r;
}
function Nc(a,b) {
Ba=Kc(a,b);
Aa=Oa;
Ca=23;
return Ba;
}
function Oc(a,b) {
var s,r;
s=0;
if(a<0) {
a=-a;
s=1;
}
if(b<0) {
b=-b;
s^=1;
}
r=Kc(a,b);
if(s) {
Oa=~Oa;
r=(-r)&-1;
if(r==0) {
Oa=(Oa+1)&-1;
}
}
Ba=r;
Aa=(Oa-(r>>31))&-1;
Ca=23;
return r;
}
function Pc(Ca) {
var Ub,Qc;
switch(Ca) {
case 0:
Qc=(Ba&0xff)<(Aa&0xff);
break;
case 1:
Qc=(Ba&0xffff)<(Aa&0xffff);
break;
case 2:
Qc=(Ba>>>0)<(Aa>>>0);
break;
case 3:
Qc=(Ba&0xff)<=(Aa&0xff);
break;
case 4:
Qc=(Ba&0xffff)<=(Aa&0xffff);
break;
case 5:
Qc=(Ba>>>0)<=(Aa>>>0);
break;
case 6:
Qc=((Ba+Aa)&0xff)<(Aa&0xff);
break;
case 7:
Qc=((Ba+Aa)&0xffff)<(Aa&0xffff);
break;
case 8:
Qc=((Ba+Aa)>>>0)<(Aa>>>0);
break;
case 9:
Ub=(Ba+Aa+1)&0xff;
Qc=Ub<=(Aa&0xff);
break;
case 10:
Ub=(Ba+Aa+1)&0xffff;
Qc=Ub<=(Aa&0xffff);
break;
case 11:
Ub=(Ba+Aa+1)>>>0;
Qc=Ub<=(Aa>>>0);
break;
case 12:
case 13:
case 14:
Qc=0;
break;
case 15:
Qc=(Aa>>7)&1;
break;
case 16:
Qc=(Aa>>15)&1;
break;
case 17:
Qc=(Aa>>31)&1;
break;
case 18:
case 19:
case 20:
Qc=Aa&1;
break;
case 21:
case 22:
case 23:
Qc=Aa!=0;
break;
case 24:
Qc=Aa&1;
break;
default:
throw"GET_CARRY: unsupported cc_op="+Ca;
}
return Qc;
}
function Xb(Rc) {
var Qc,Ub;
switch(Rc>>1) {
case 0:
switch(Ca) {
case 0:
Ub=(Ba-Aa)&-1;
Qc=(((Ub^Aa^-1)&(Ub^Ba))>>7)&1;
break;
case 1:
Ub=(Ba-Aa)&-1;
Qc=(((Ub^Aa^-1)&(Ub^Ba))>>15)&1;
break;
case 2:
Ub=(Ba-Aa)&-1;
Qc=(((Ub^Aa^-1)&(Ub^Ba))>>31)&1;
break;
case 3:
Ub=(Ba-Aa-1)&-1;
Qc=(((Ub^Aa^-1)&(Ub^Ba))>>7)&1;
break;
case 4:
Ub=(Ba-Aa-1)&-1;
Qc=(((Ub^Aa^-1)&(Ub^Ba))>>15)&1;
break;
case 5:
Ub=(Ba-Aa-1)&-1;
Qc=(((Ub^Aa^-1)&(Ub^Ba))>>31)&1;
break;
case 6:
Ub=(Ba+Aa)&-1;
Qc=(((Ub^Aa)&(Ub^Ba))>>7)&1;
break;
case 7:
Ub=(Ba+Aa)&-1;
Qc=(((Ub^Aa)&(Ub^Ba))>>15)&1;
break;
case 8:
Ub=(Ba+Aa)&-1;
Qc=(((Ub^Aa)&(Ub^Ba))>>31)&1;
break;
case 9:
Ub=(Ba+Aa+1)&-1;
Qc=(((Ub^Aa)&(Ub^Ba))>>7)&1;
break;
case 10:
Ub=(Ba+Aa+1)&-1;
Qc=(((Ub^Aa)&(Ub^Ba))>>15)&1;
break;
case 11:
Ub=(Ba+Aa+1)&-1;
Qc=(((Ub^Aa)&(Ub^Ba))>>31)&1;
break;
case 12:
case 13:
case 14:
Qc=0;
break;
case 15:
case 18:
Qc=((Aa^Ba)>>7)&1;
break;
case 16:
case 19:
Qc=((Aa^Ba)>>15)&1;
break;
case 17:
case 20:
Qc=((Aa^Ba)>>31)&1;
break;
case 21:
case 22:
case 23:
Qc=Aa!=0;
break;
case 24:
Qc=(Aa>>11)&1;
break;
case 25:
Qc=(Ea&0xff)==0x80;
break;
case 26:
Qc=(Ea&0xffff)==0x8000;
break;
case 27:
Qc=(Ea==-2147483648);
break;
case 28:
Qc=(Ea&0xff)==0x7f;
break;
case 29:
Qc=(Ea&0xffff)==0x7fff;
break;
case 30:
Qc=Ea==0x7fffffff;
break;
default:
throw"JO: unsupported cc_op="+Ca;
}
break;
case 1:
if(Ca>=25) {
Qc=Pc(Da);
} else {
Qc=Pc(Ca);
}
break;
case 2:
switch(Ca) {
case 0:
case 3:
case 6:
case 9:
case 12:
case 15:
case 18:
case 21:
Qc=(Ba&0xff)==0;
break;
case 1:
case 4:
case 7:
case 10:
case 13:
case 16:
case 19:
case 22:
Qc=(Ba&0xffff)==0;
break;
case 2:
case 5:
case 8:
case 11:
case 14:
case 17:
case 20:
case 23:
Qc=Ba==0;
break;
case 24:
Qc=(Aa>>6)&1;
break;
case 25:
case 28:
Qc=(Ea&0xff)==0;
break;
case 26:
case 29:
Qc=(Ea&0xffff)==0;
break;
case 27:
case 30:
Qc=Ea==0;
break;
default:
throw"JZ: unsupported cc_op="+Ca;
};
break;
case 3:
switch(Ca) {
case 6:
Qc=((Ba+Aa)&0xff)<=(Aa&0xff);
break;
case 7:
Qc=((Ba+Aa)&0xffff)<=(Aa&0xffff);
break;
case 8:
Qc=((Ba+Aa)>>>0)<=(Aa>>>0);
break;
case 24:
Qc=(Aa&(0x0040|0x0001))!=0;
break;
default:
Qc=Xb(2)|Xb(4);
break;
}
break;
case 4:
switch(Ca) {
case 0:
case 3:
case 6:
case 9:
case 12:
case 15:
case 18:
case 21:
Qc=(Ba>>7)&1;
break;
case 1:
case 4:
case 7:
case 10:
case 13:
case 16:
case 19:
case 22:
Qc=(Ba>>15)&1;
break;
case 2:
case 5:
case 8:
case 11:
case 14:
case 17:
case 20:
case 23:
Qc=Ba<0;
break;
case 24:
Qc=(Aa>>7)&1;
break;
case 25:
case 28:
Qc=(Ea>>7)&1;
break;
case 26:
case 29:
Qc=(Ea>>15)&1;
break;
case 27:
case 30:
Qc=Ea<0;
break;
default:
throw"JS: unsupported cc_op="+Ca;
}
break;
case 5:
switch(Ca) {
case 0:
case 3:
case 6:
case 9:
case 12:
case 15:
case 18:
case 21:
case 1:
case 4:
case 7:
case 10:
case 13:
case 16:
case 19:
case 22:
case 2:
case 5:
case 8:
case 11:
case 14:
case 17:
case 20:
case 23:
Qc=ba[Ba&0xff];
break;
case 24:
Qc=(Aa>>2)&1;
break;
case 25:
case 28:
case 26:
case 29:
case 27:
case 30:
Qc=ba[Ea&0xff];
break;
default:
throw"JP: unsupported cc_op="+Ca;
}
break;
case 6:
switch(Ca) {
case 6:
Qc=((Ba+Aa)<<24)<(Aa<<24);
break;
case 7:
Qc=((Ba+Aa)<<16)<(Aa<<16);
break;
case 8:
Qc=((Ba+Aa)&-1)<Aa;
break;
case 12:
Qc=(Ba<<24)<0;
break;
case 13:
Qc=(Ba<<16)<0;
break;
case 14:
Qc=Ba<0;
break;
case 24:
Qc=((Aa>>7)^(Aa>>11))&1;
break;
case 25:
case 28:
Qc=(Ea<<24)<0;
break;
case 26:
case 29:
Qc=(Ea<<16)<0;
break;
case 27:
case 30:
Qc=Ea<0;
break;
default:
Qc=Xb(8)^Xb(0);
break;
}
break;
case 7:
switch(Ca) {
case 6:
Qc=((Ba+Aa)<<24)<=(Aa<<24);
break;
case 7:
Qc=((Ba+Aa)<<16)<=(Aa<<16);
break;
case 8:
Qc=((Ba+Aa)&-1)<=Aa;
break;
case 12:
Qc=(Ba<<24)<=0;
break;
case 13:
Qc=(Ba<<16)<=0;
break;
case 14:
Qc=Ba<=0;
break;
case 24:
Qc=(((Aa>>7)^(Aa>>11))|(Aa>>6))&1;
break;
case 25:
case 28:
Qc=(Ea<<24)<=0;
break;
case 26:
case 29:
Qc=(Ea<<16)<=0;
break;
case 27:
case 30:
Qc=Ea<=0;
break;
default:
Qc=(Xb(8)^Xb(0))|Xb(4);
break;
}
break;
default:
throw"unsupported cond: "+Rc;
}
return Qc^(Rc&1);
}
function ic() {
return(Xb(2)<<0)|(Xb(10)<<2)|(Xb(4)<<6)|(Xb(8)<<7)|(Xb(0)<<11);
}
function Sc() {
var Tc;
Tc=ic();
Tc|=ya.df&0x00000400;
Tc|=ya.eflags;
return Tc;
}
function Uc(Tc,Vc) {
Ca=24;
Aa=Tc&(0x0800|0x0080|0x0040|0x0010|0x0004|0x0001);
ya.df=1-(2*((Tc>>10)&1));
ya.eflags=(ya.eflags&~Vc)|(Tc&Vc);
}
function Wc() {
return ya.cycle_count+(xa-Ma);
}
function Xc(va) {
throw"CPU abort: "+va;
}
function Yc() {
ya.eip=Ib;
ya.cc_src=Aa;
ya.cc_dst=Ba;
ya.cc_op=Ca;
ya.cc_op2=Da;
ya.cc_dst2=Ea;
ya.dump();
}
function Zc(intno,error_code) {
throw {intno:
intno,error_code:
error_code};
}
function vc(intno) {
Zc(intno,0);
}
function ad(bd) {
ya.cpl=bd;
if(ya.cpl==3) {
Za=Xa;
ab=Ya;
} else {
Za=Va;
ab=Wa;
}
}
function cd(ha,dd) {
var cb;
if(dd) {
cb=ab[ha>>>12];
} else {
cb=Za[ha>>>12];
}
if(cb==-1) {
db(ha,dd,ya.cpl==3);
if(dd) {
cb=ab[ha>>>12];
} else {
cb=Za[ha>>>12];
}
}
return cb^ha;
}
function ed() {
var fd,l,gd,hd,i,id;
fd=za[1]>>>0;
l=(4096-(za[6]&0xfff))>>2;
if(fd>l)fd=l;
l=(4096-(za[7]&0xfff))>>2;
if(fd>l)fd=l;
if(fd) {
gd=cd(za[6],0);
hd=cd(za[7],1);
hd>>=2;
gd>>=2;
for(i=0; i<fd; i++)Ta[hd+i]=Ta[gd+i];
id=fd<<2;
za[6]=(za[6]+id)&-1;
za[7]=(za[7]+id)&-1;
za[1]=(za[1]-fd)&-1;
return true;
}
return false;
}
function jd() {
var fd,l,hd,i,id,ia;
fd=za[1]>>>0;
l=(4096-(za[7]&0xfff))>>2;
if(fd>l)fd=l;
if(fd) {
hd=cd(za[7],1);
hd>>=2;
ia=za[0];
for(i=0; i<fd; i++)Ta[hd+i]=ia;
id=fd<<2;
za[7]=(za[7]+id)&-1;
za[1]=(za[1]-fd)&-1;
return true;
}
return false;
}
function db(kd,ld,la) {
var md,nd,error_code,od,pd,qd,rd,dd,sd;
if(!(ya.cr0&(1<<31))) {
ya.tlb_set_page(kd&-4096,kd&-4096,1);
} else {
md=(ya.cr3&-4096)+((kd>>20)&0xffc);
nd=ya.ld32_phys(md);
if(!(nd&0x00000001)) {
error_code=0;
} else {
if(!(nd&0x00000020)) {
nd|=0x00000020;
ya.st32_phys(md,nd);
}
od=(nd&-4096)+((kd>>10)&0xffc);
pd=ya.ld32_phys(od);
if(!(pd&0x00000001)) {
error_code=0;
} else {
qd=pd&nd;
if(la&&!(qd&0x00000004)) {
error_code=0x01;
} else if(ld&&!(qd&0x00000002)) {
error_code=0x01;
} else {
rd=(ld&&!(pd&0x00000040));
if(!(pd&0x00000020)||rd) {
pd|=0x00000020;
if(rd)pd|=0x00000040;
ya.st32_phys(od,pd);
}
dd=0;
if((pd&0x00000040)&&(qd&0x00000002))dd=1;
sd=0;
if(qd&0x00000004)sd=1;
ya.tlb_set_page(kd&-4096,pd&-4096,dd,sd);
return;
}
}
}
error_code|=ld<<1;
if(la)error_code|=0x04;
ya.cr2=kd;
Zc(14,error_code);
}
}
function td(ud) {
if(!(ud&(1<<0)))Xc("real mode not supported");
if((ud&((1<<31)|(1<<16)|(1<<0)))!=(ya.cr0&((1<<31)|(1<<16)|(1<<0)))) {
ya.tlb_flush_all();
}
ya.cr0=ud|(1<<4);
}
function vd(wd) {
ya.cr3=wd;
if(ya.cr0&(1<<31)) {
ya.tlb_flush_all();
}
}
function xd(yd) {
ya.cr4=yd;
}
function zd(Ad) {
if(Ad&(1<<22))return-1;
else return 0xffff;
}
function Bd(selector) {
var ua,Pb,Cd,Ad;
if(selector&0x4)ua=ya.ldt;
else ua=ya.gdt;
Pb=selector&~7;
if((Pb+7)>ua.limit)return null;
ha=ua.base+Pb;
Cd=Ab();
ha+=4;
Ad=Ab();
return[Cd,Ad];
}
function Dd(Cd,Ad) {
var limit;
limit=(Cd&0xffff)|(Ad&0x000f0000);
if(Ad&(1<<23))limit=(limit<<12)|0xfff;
return limit;
}
function Ed(Cd,Ad) {
return(((Cd>>>16)|((Ad&0xff)<<16)|(Ad&0xff000000)))&-1;
}
function Fd(ua,Cd,Ad) {
ua.base=Ed(Cd,Ad);
ua.limit=Dd(Cd,Ad);
ua.flags=Ad;
}
function Gd(Hd,selector,base,limit,flags) {
ya.segs[Hd]= {selector:
selector,base:
base,limit:
limit,flags:
flags};
}
function Id(Jd) {
var Kd,Pb,Ld,Md,Nd;
if(!(ya.tr.flags&(1<<15)))Xc("invalid tss");
Kd=(ya.tr.flags>>8)&0xf;
if((Kd&7)!=1)Xc("invalid tss type");
Ld=Kd>>3;
Pb=(Jd*4+2)<<Ld;
if(Pb+(4<<Ld)-1>ya.tr.limit)Zc(10,ya.tr.selector&0xfffc);
ha=(ya.tr.base+Pb)&-1;
if(Ld==0) {
Nd=yb();
ha+=2;
} else {
Nd=Ab();
ha+=4;
}
Md=yb();
return[Md,Nd];
}
function Od(intno,Pd,error_code,Qd,Rd) {
var ua,Sd,Kd,Jd,selector,Td,Ud;
var Vd,Wd,Ld;
var e,Cd,Ad,Xd,Md,Nd,Yd,Zd;
var ae,be;
if(intno==0x06) {
var ce=Ib;
va="do_interrupt: intno="+sa(intno)+" error_code="+ra(error_code)+" EIP="+ra(ce)+" ESP="+ra(za[4])+" EAX="+ra(za[0])+" EBX="+ra(za[3])+" ECX="+ra(za[1]);
if(intno==0x0e) {
va+=" CR2="+ra(ya.cr2);
}
console.log(va);
if(intno==0x06) {
var va,i,n;
va="Code:";
n=4096-(ce&0xfff);
if(n>15)n=15;
for(i=0; i<n; i++) {
ha=(ce+i)&-1;
va+=" "+sa(eb());
}
console.log(va);
}
}
Vd=0;
if(!Pd&&!Rd) {
switch(intno) {
case 8:
case 10:
case 11:
case 12:
case 13:
case 14:
case 17:
Vd=1;
break;
}
}
if(Pd)ae=Qd;
else ae=Ib;
ua=ya.idt;
if(intno*8+7>ua.limit)Zc(13,intno*8+2);
ha=(ua.base+intno*8)&-1;
Cd=Ab();
ha+=4;
Ad=Ab();
Kd=(Ad>>8)&0x1f;
switch(Kd) {
case 5:
case 7:
case 6:
throw"unsupported task gate";
case 14:
case 15:
break;
default:
Zc(13,intno*8+2);
break;
}
Jd=(Ad>>13)&3;
Ud=ya.cpl;
if(Pd&&Jd<Ud)Zc(13,intno*8+2);
if(!(Ad&(1<<15)))Zc(11,intno*8+2);
selector=Cd>>16;
Xd=(Ad&-65536)|(Cd&0x0000ffff);
if((selector&0xfffc)==0)Zc(13,0);
e=Bd(selector);
if(!e)Zc(13,selector&0xfffc);
Cd=e[0];
Ad=e[1];
if(!(Ad&(1<<12))||!(Ad&((1<<11))))Zc(13,selector&0xfffc);
Jd=(Ad>>13)&3;
if(Jd>Ud)Zc(13,selector&0xfffc);
if(!(Ad&(1<<15)))Zc(11,selector&0xfffc);
if(!(Ad&(1<<10))&&Jd<Ud) {
e=Id(Jd);
Md=e[0];
Nd=e[1];
if((Md&0xfffc)==0)Zc(10,Md&0xfffc);
if((Md&3)!=Jd)Zc(10,Md&0xfffc);
e=Bd(Md);
if(!e)Zc(10,Md&0xfffc);
Yd=e[0];
Zd=e[1];
Td=(Zd>>13)&3;
if(Td!=Jd)Zc(10,Md&0xfffc);
if(!(Zd&(1<<12))||(Zd&(1<<11))||!(Zd&(1<<9)))Zc(10,Md&0xfffc);
if(!(Zd&(1<<15)))Zc(10,Md&0xfffc);
Wd=1;
be=zd(Zd);
Sd=Ed(Yd,Zd);
} else if((Ad&(1<<10))||Jd==Ud) {
if(ya.eflags&0x00020000)Zc(13,selector&0xfffc);
Wd=0;
be=zd(ya.segs[2].flags);
Sd=ya.segs[2].base;
Nd=za[4];
Jd=Ud;
} else {
Zc(13,selector&0xfffc);
Wd=0;
be=0;
Sd=0;
Nd=0;
}
Ld=Kd>>3;
if(Wd) {
if(ya.eflags&0x00020000) {{
Nd=(Nd-4)&-1;
ha=(Sd+(Nd&be))&-1;
Gb(ya.segs[5].selector);
};
{
Nd=(Nd-4)&-1;
ha=(Sd+(Nd&be))&-1;
Gb(ya.segs[4].selector);
};
{
Nd=(Nd-4)&-1;
ha=(Sd+(Nd&be))&-1;
Gb(ya.segs[3].selector);
};
{
Nd=(Nd-4)&-1;
ha=(Sd+(Nd&be))&-1;
Gb(ya.segs[0].selector);
};
}{
Nd=(Nd-4)&-1;
ha=(Sd+(Nd&be))&-1;
Gb(ya.segs[2].selector);
};
{
Nd=(Nd-4)&-1;
ha=(Sd+(Nd&be))&-1;
Gb(za[4]);
};
}{
Nd=(Nd-4)&-1;
ha=(Sd+(Nd&be))&-1;
Gb(Sc());
};
{
Nd=(Nd-4)&-1;
ha=(Sd+(Nd&be))&-1;
Gb(ya.segs[1].selector);
};
{
Nd=(Nd-4)&-1;
ha=(Sd+(Nd&be))&-1;
Gb(ae);
};
if(Vd) {{
Nd=(Nd-4)&-1;
ha=(Sd+(Nd&be))&-1;
Gb(error_code);
};
}
if(Wd) {
if(ya.eflags&0x00020000) {
Gd(0,0,0,0,0);
Gd(3,0,0,0,0);
Gd(4,0,0,0,0);
Gd(5,0,0,0,0);
}
Md=(Md&~3)|Jd;
Gd(2,Md,Sd,Dd(Yd,Zd),Zd);
}
za[4]=(za[4]&~(be))|((Nd)&(be));
selector=(selector&~3)|Jd;
Gd(1,selector,Ed(Cd,Ad),Dd(Cd,Ad),Ad);
ad(Jd);
Hb=Xd;
if((Kd&1)==0) {
ya.eflags&=~0x00000200;
}
ya.eflags&=~(0x00000100|0x00020000|0x00010000|0x00004000);
}
function de(selector) {
var ua,Cd,Ad,Pb,ee;
selector&=0xffff;
if((selector&0xfffc)==0) {
ya.ldt.base=0;
ya.ldt.limit=0;
} else {
if(selector&0x4)Zc(13,selector&0xfffc);
ua=ya.gdt;
Pb=selector&~7;
ee=7;
if((Pb+ee)>ua.limit)Zc(13,selector&0xfffc);
ha=(ua.base+Pb)&-1;
Cd=Ab();
ha+=4;
Ad=Ab();
if((Ad&(1<<12))||((Ad>>8)&0xf)!=2)Zc(13,selector&0xfffc);
if(!(Ad&(1<<15)))Zc(11,selector&0xfffc);
Fd(ya.ldt,Cd,Ad);
}
ya.ldt.selector=selector;
}
function fe(selector) {
var ua,Cd,Ad,Pb,Kd,ee;
selector&=0xffff;
if((selector&0xfffc)==0) {
ya.tr.base=0;
ya.tr.limit=0;
ya.tr.flags=0;
} else {
if(selector&0x4)Zc(13,selector&0xfffc);
ua=ya.gdt;
Pb=selector&~7;
ee=7;
if((Pb+ee)>ua.limit)Zc(13,selector&0xfffc);
ha=(ua.base+Pb)&-1;
Cd=Ab();
ha+=4;
Ad=Ab();
Kd=(Ad>>8)&0xf;
if((Ad&(1<<12))||(Kd!=1&&Kd!=9))Zc(13,selector&0xfffc);
if(!(Ad&(1<<15)))Zc(11,selector&0xfffc);
Fd(ya.tr,Cd,Ad);
Ad|=(1<<9);
Gb(Ad);
}
ya.tr.selector=selector;
}
function ge(he,selector) {
var Cd,Ad,Ud,Jd,ie,ua,Pb;
selector&=0xffff;
Ud=ya.cpl;
if((selector&0xfffc)==0) {
if(he==2)Zc(13,0);
Gd(he,selector,0,0,0);
} else {
if(selector&0x4)ua=ya.ldt;
else ua=ya.gdt;
Pb=selector&~7;
if((Pb+7)>ua.limit)Zc(13,selector&0xfffc);
ha=(ua.base+Pb)&-1;
Cd=Ab();
ha+=4;
Ad=Ab();
if(!(Ad&(1<<12)))Zc(13,selector&0xfffc);
ie=selector&3;
Jd=(Ad>>13)&3;
if(he==2) {
if((Ad&(1<<11))||!(Ad&(1<<9)))Zc(13,selector&0xfffc);
if(ie!=Ud||Jd!=Ud)Zc(13,selector&0xfffc);
} else {
if((Ad&((1<<11)|(1<<9)))==(1<<11))Zc(13,selector&0xfffc);
if(!(Ad&(1<<11))||!(Ad&(1<<10))) {
if(Jd<Ud||Jd<ie)Zc(13,selector&0xfffc);
}
}
if(!(Ad&(1<<15))) {
if(he==2)Zc(12,selector&0xfffc);
else Zc(11,selector&0xfffc);
}
if(!(Ad&(1<<8))) {
Ad|=(1<<8);
Gb(Ad);
}
Gd(he,selector,Ed(Cd,Ad),Dd(Cd,Ad),Ad);
}
}
function je(ke,le) {
var me,Kd,Cd,Ad,Ud,Jd,ie,limit,e;
if((ke&0xfffc)==0)Zc(13,0);
e=Bd(ke);
if(!e)Zc(13,ke&0xfffc);
Cd=e[0];
Ad=e[1];
Ud=ya.cpl;
if(Ad&(1<<12)) {
if(!(Ad&(1<<11)))Zc(13,ke&0xfffc);
Jd=(Ad>>13)&3;
if(Ad&(1<<10)) {
if(Jd>Ud)Zc(13,ke&0xfffc);
} else {
ie=ke&3;
if(ie>Ud)Zc(13,ke&0xfffc);
if(Jd!=Ud)Zc(13,ke&0xfffc);
}
if(!(Ad&(1<<15)))Zc(11,ke&0xfffc);
limit=Dd(Cd,Ad);
if((le>>>0)>(limit>>>0))Zc(13,ke&0xfffc);
Gd(1,(ke&0xfffc)|Ud,Ed(Cd,Ad),limit,Ad);
Hb=le;
} else {
Xc("unsupported jump to call or task gate");
}
}
function ne(he,Ud) {
var Jd,Ad;
if((he==4||he==5)&&(ya.segs[he].selector&0xfffc)==0)return;
Ad=ya.segs[he].flags;
Jd=(Ad>>13)&3;
if(!(Ad&(1<<11))||!(Ad&(1<<10))) {
if(Jd<Ud) {
Gd(he,0,0,0,0);
}
}
}
function oe(Ld,pe,qe) {
var ke,re,se;
var te,ue,ve,we;
var e,Cd,Ad,Yd,Zd;
var Ud,Jd,ie,xe,ye;
var Sd,ze,le,Ae,be;
be=zd(ya.segs[2].flags);
ze=za[4];
Sd=ya.segs[2].base;
re=0;
if(Ld==1) {{
ha=(Sd+(ze&be))&-1;
le=ib();
ze=(ze+4)&-1;
};
{
ha=(Sd+(ze&be))&-1;
ke=ib();
ze=(ze+4)&-1;
};
ke&=0xffff;
if(pe) {{
ha=(Sd+(ze&be))&-1;
re=ib();
ze=(ze+4)&-1;
};
if(re&0x00020000)throw"VM86 unsupported";
}
} else {
throw"unsupported";
}
if((ke&0xfffc)==0)Zc(13,ke&0xfffc);
e=Bd(ke);
if(!e)Zc(13,ke&0xfffc);
Cd=e[0];
Ad=e[1];
if(!(Ad&(1<<12))||!(Ad&(1<<11)))Zc(13,ke&0xfffc);
Ud=ya.cpl;
ie=ke&3;
if(ie<Ud)Zc(13,ke&0xfffc);
Jd=(Ad>>13)&3;
if(Ad&(1<<10)) {
if(Jd>ie)Zc(13,ke&0xfffc);
} else {
if(Jd!=ie)Zc(13,ke&0xfffc);
}
if(!(Ad&(1<<15)))Zc(11,ke&0xfffc);
ze=(ze+qe)&-1;
if(ie==Ud) {
Gd(1,ke,Ed(Cd,Ad),Dd(Cd,Ad),Ad);
} else {
if(Ld==1) {{
ha=(Sd+(ze&be))&-1;
Ae=ib();
ze=(ze+4)&-1;
};
{
ha=(Sd+(ze&be))&-1;
se=ib();
ze=(ze+4)&-1;
};
se&=0xffff;
} else {
throw"unsupported";
}
if((se&0xfffc)==0) {
Zc(13,0);
} else {
if((se&3)!=ie)Zc(13,se&0xfffc);
e=Bd(se);
if(!e)Zc(13,se&0xfffc);
Yd=e[0];
Zd=e[1];
if(!(Zd&(1<<12))||(Zd&(1<<11))||!(Zd&(1<<9)))Zc(13,se&0xfffc);
Jd=(Zd>>13)&3;
if(Jd!=ie)Zc(13,se&0xfffc);
if(!(Zd&(1<<15)))Zc(11,se&0xfffc);
Gd(2,se,Ed(Yd,Zd),Dd(Yd,Zd),Zd);
}
Gd(1,ke,Ed(Cd,Ad),Dd(Cd,Ad),Ad);
ad(ie);
ze=Ae;
be=zd(Zd);
ne(0,ie);
ne(3,ie);
ne(4,ie);
ne(5,ie);
ze=(ze+qe)&-1;
}
za[4]=(za[4]&~(be))|((ze)&(be));
Hb=le;
if(pe) {
xe=0x00000100|0x00040000|0x00200000|0x00010000|0x00004000;
if(Ud==0)xe|=0x00003000;
ye=(ya.eflags>>12)&3;
if(Ud<=ye)xe|=0x00000200;
if(Ld==0)xe&=0xffff;
Uc(re,xe);
}
}
function Be(Ld) {
if(ya.eflags&0x00004000) {
Zc(13,0);
} else {
oe(Ld,1,0);
}
}
function Ce() {
var Pb;
Pb=za[0];
switch(Pb) {
case 0:
za[0]=1;
za[3]=0x756e6547&-1;
za[2]=0x49656e69&-1;
za[1]=0x6c65746e&-1;
break;
case 1:
default:
za[0]=(5<<8)|(4<<4)|3;
za[3]=8<<8;
za[1]=0;
za[2]=(1<<4);
break;
}
}
ya=this;
Ra=this.phys_mem8;
Sa=this.phys_mem16;
Ta=this.phys_mem32;
Xa=this.tlb_read_user;
Ya=this.tlb_write_user;
Va=this.tlb_read_kernel;
Wa=this.tlb_write_kernel;
if(ya.cpl==3) {
Za=Xa;
ab=Ya;
} else {
Za=Va;
ab=Wa;
}
if(ya.halted) {
if(ya.hard_irq!=0&&(ya.eflags&0x00000200)) {
ya.halted=0;
} else {
return 257;
}
}
za=this.regs;
Aa=this.cc_src;
Ba=this.cc_dst;
Ca=this.cc_op;
Da=this.cc_op2;
Ea=this.cc_dst2;
Hb=this.eip;
Na=256;
Ma=xa;
Qa=-1;
while(Ma) {
try {
if(Qa>=0) {
Ib=Hb;
Od(Qa,0,0,0,1);
Qa=-1;
}
if(ya.hard_irq!=0&&(ya.eflags&0x00000200)) {
Qa=ya.get_hard_intno();
Ib=Hb;
Od(Qa,0,0,0,1);
Qa=-1;
}
De:
do {
Ib=Hb;
Fa=0;
b=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if(0) {
console.log("exec: EIP="+ra(Ib)+" OPCODE="+ra(b));
}
Ee:
for(;;) {
switch(b) {
case 0x66:
Fa|=0x0100;
b=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
b|=(Fa&0x0100);
break;
case 0xf0:
Fa|=0x0040;
b=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
b|=(Fa&0x0100);
break;
case 0xf2:
Fa|=0x0020;
b=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
b|=(Fa&0x0100);
break;
case 0xf3:
Fa|=0x0010;
b=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
b|=(Fa&0x0100);
break;
case 0x64:
Fa=(Fa&~0x000f)|(4+1);
b=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
b|=(Fa&0x0100);;
break;
case 0x65:
Fa=(Fa&~0x000f)|(5+1);
b=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
b|=(Fa&0x0100);;
break;
case 0xb0:
case 0xb1:
case 0xb2:
case 0xb3:
case 0xb4:
case 0xb5:
case 0xb6:
case 0xb7:
ia=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Rb(b&7,ia);
break Ee;
case 0xb8:
case 0xb9:
case 0xba:
case 0xbb:
case 0xbc:
case 0xbd:
case 0xbe:
case 0xbf:
ia=Lb();
za[b&7]=ia;
break Ee;
case 0x88:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
ia=((za[Ia&3]>>((Ia&4)<<1))&0xff);
if((Ga>>6)==3) {
Rb(Ga&7,ia);
} else {
ha=Mb(Ga);
{
Ua=ab[ha>>>12];
if(Ua==-1) {
pb(ia);
} else {
Ra[ha^Ua]=ia;
}
};
}
break Ee;
case 0x89:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ia=za[(Ga>>3)&7];
if((Ga>>6)==3) {
za[Ga&7]=ia;
} else {
ha=Mb(Ga);
{
Ua=ab[ha>>>12];
if((Ua|ha)&3) {
tb(ia);
} else {
Ta[(ha^Ua)>>2]=ia;
}
};
}
break Ee;
case 0x8a:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>6)==3) {
Ha=Ga&7;
ia=((za[Ha&3]>>((Ha&4)<<1))&0xff);
} else {
ha=Mb(Ga);
ia=(((Ua=Za[ha>>>12])==-1)?bb():Ra[ha^Ua]);
}
Rb((Ga>>3)&7,ia);
break Ee;
case 0x8b:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=(((Ua=Za[ha>>>12])|ha)&3?hb():Ta[(ha^Ua)>>2]);
}
za[(Ga>>3)&7]=ia;
break Ee;
case 0xa0:
ha=Qb();
ia=eb();
Rb(0,ia);
break Ee;
case 0xa1:
ha=Qb();
ia=ib();
za[0]=ia;
break Ee;
case 0xa2:
ha=Qb();
qb(za[0]);
break Ee;
case 0xa3:
ha=Qb();
ub(za[0]);
break Ee;
case 0xc6:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>6)==3) {
ia=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Rb(Ga&7,ia);
} else {
ha=Mb(Ga);
ia=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
qb(ia);
}
break Ee;
case 0xc7:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>6)==3) {
ia=Lb();
za[Ga&7]=ia;
} else {
ha=Mb(Ga);
ia=Lb();
ub(ia);
}
break Ee;
case 0x91:
case 0x92:
case 0x93:
case 0x94:
case 0x95:
case 0x96:
case 0x97:
Ia=b&7;
ia=za[0];
za[0]=za[Ia];
za[Ia]=ia;
break Ee;
case 0x86:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
ia=((za[Ha&3]>>((Ha&4)<<1))&0xff);
Rb(Ha,((za[Ia&3]>>((Ia&4)<<1))&0xff));
} else {
ha=Mb(Ga);
ia=kb();
qb(((za[Ia&3]>>((Ia&4)<<1))&0xff));
}
Rb(Ia,ia);
break Ee;
case 0x87:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
ia=za[Ha];
za[Ha]=za[Ia];
} else {
ha=Mb(Ga);
ia=ob();
ub(za[Ia]);
}
za[Ia]=ia;
break Ee;
case 0x8e:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if(Ia>=6||Ia==1)vc(6);
if((Ga>>6)==3) {
ia=za[Ga&7]&0xffff;
} else {
ha=Mb(Ga);
ia=gb();
}
ge(Ia,ia);
break Ee;
case 0x8c:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if(Ia>=6)vc(6);
ia=ya.segs[Ia].selector;
if((Ga>>6)==3) {
za[Ga&7]=ia;
} else {
ha=Mb(Ga);
sb(ia);
}
break Ee;
case 0xc4: {
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>3)==3)vc(6);
ha=Mb(Ga);
ia=ib();
ha+=4;
Ja=gb();
ge(0,Ja);
za[(Ga>>3)&7]=ia;
};
break Ee;
case 0xc5: {
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>3)==3)vc(6);
ha=Mb(Ga);
ia=ib();
ha+=4;
Ja=gb();
ge(3,Ja);
za[(Ga>>3)&7]=ia;
};
break Ee;
case 0x00:
case 0x08:
case 0x10:
case 0x18:
case 0x20:
case 0x28:
case 0x30:
case 0x38:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=b>>3;
Ia=(Ga>>3)&7;
Ja=((za[Ia&3]>>((Ia&4)<<1))&0xff);
if((Ga>>6)==3) {
Ha=Ga&7;
Rb(Ha,Tb(La,((za[Ha&3]>>((Ha&4)<<1))&0xff),Ja));
} else {
ha=Mb(Ga);
if(La!=7) {
ia=kb();
ia=Tb(La,ia,Ja);
qb(ia);
} else {
ia=eb();
Tb(7,ia,Ja);
}
}
break Ee;
case 0x01:
case 0x09:
case 0x11:
case 0x19:
case 0x21:
case 0x29:
case 0x31:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=b>>3;
Ja=za[(Ga>>3)&7];
if((Ga>>6)==3) {
Ha=Ga&7;
za[Ha]=dc(La,za[Ha],Ja);
} else {
ha=Mb(Ga);
ia=ob();
ia=dc(La,ia,Ja);
ub(ia);
}
break Ee;
case 0x39:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=b>>3;
Ja=za[(Ga>>3)&7];
if((Ga>>6)==3) {
Ha=Ga&7;
{
Aa=Ja;
Ba=(za[Ha]-Aa)&-1;
Ca=8;
};
} else {
ha=Mb(Ga);
ia=ib();
{
Aa=Ja;
Ba=(ia-Aa)&-1;
Ca=8;
};
}
break Ee;
case 0x02:
case 0x0a:
case 0x12:
case 0x1a:
case 0x22:
case 0x2a:
case 0x32:
case 0x3a:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=b>>3;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
Ja=((za[Ha&3]>>((Ha&4)<<1))&0xff);
} else {
ha=Mb(Ga);
Ja=eb();
}
Rb(Ia,Tb(La,((za[Ia&3]>>((Ia&4)<<1))&0xff),Ja));
break Ee;
case 0x03:
case 0x0b:
case 0x13:
case 0x1b:
case 0x23:
case 0x2b:
case 0x33:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=b>>3;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ja=za[Ga&7];
} else {
ha=Mb(Ga);
Ja=ib();
}
za[Ia]=dc(La,za[Ia],Ja);
break Ee;
case 0x3b:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=b>>3;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ja=za[Ga&7];
} else {
ha=Mb(Ga);
Ja=ib();
}{
Aa=Ja;
Ba=(za[Ia]-Aa)&-1;
Ca=8;
};
break Ee;
case 0x04:
case 0x0c:
case 0x14:
case 0x1c:
case 0x24:
case 0x2c:
case 0x34:
case 0x3c:
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=b>>3;
Rb(0,Tb(La,za[0]&0xff,Ja));
break Ee;
case 0x05:
case 0x0d:
case 0x15:
case 0x1d:
case 0x25:
case 0x2d:
case 0x35:
case 0x3d:
Ja=Lb();
La=b>>3;
za[0]=dc(La,za[0],Ja);
break Ee;
case 0x80:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Rb(Ha,Tb(La,((za[Ha&3]>>((Ha&4)<<1))&0xff),Ja));
} else {
ha=Mb(Ga);
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if(La!=7) {
ia=kb();
ia=Tb(La,ia,Ja);
qb(ia);
} else {
ia=eb();
Tb(7,ia,Ja);
}
}
break Ee;
case 0x81:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
Ja=Lb();
za[Ha]=dc(La,za[Ha],Ja);
} else {
ha=Mb(Ga);
Ja=Lb();
if(La!=7) {
ia=ob();
ia=dc(La,ia,Ja);
ub(ia);
} else {
ia=ib();
dc(7,ia,Ja);
}
}
break Ee;
case 0x83:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
Ja=((((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua])<<24)>>24;
Hb++;;
za[Ha]=dc(La,za[Ha],Ja);
} else {
ha=Mb(Ga);
Ja=((((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua])<<24)>>24;
Hb++;;
if(La!=7) {
ia=ob();
ia=dc(La,ia,Ja);
ub(ia);
} else {
ia=ib();
dc(7,ia,Ja);
}
}
break Ee;
case 0x40:
case 0x41:
case 0x42:
case 0x43:
case 0x44:
case 0x45:
case 0x46:
case 0x47:
Ia=b&7;
{
if(Ca<25) {
Da=Ca;
}
za[Ia]=Ea=(za[Ia]+1)&-1;
Ca=27;
};
break Ee;
case 0x48:
case 0x49:
case 0x4a:
case 0x4b:
case 0x4c:
case 0x4d:
case 0x4e:
case 0x4f:
Ia=b&7;
{
if(Ca<25) {
Da=Ca;
}
za[Ia]=Ea=(za[Ia]-1)&-1;
Ca=30;
};
break Ee;
case 0x6b:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ja=za[Ga&7];
} else {
ha=Mb(Ga);
Ja=ib();
}
Ka=((((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua])<<24)>>24;
Hb++;;
za[Ia]=Oc(Ja,Ka);
break Ee;
case 0x69:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ja=za[Ga&7];
} else {
ha=Mb(Ga);
Ja=ib();
}
Ka=Lb();
za[Ia]=Oc(Ja,Ka);
break Ee;
case 0x84:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>6)==3) {
Ha=Ga&7;
ia=((za[Ha&3]>>((Ha&4)<<1))&0xff);
} else {
ha=Mb(Ga);
ia=eb();
}
Ia=(Ga>>3)&7;
Ja=((za[Ia&3]>>((Ia&4)<<1))&0xff);
Ba=ia&Ja;
Ca=12;
break Ee;
case 0x85:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=ib();
}
Ja=za[(Ga>>3)&7];
Ba=ia&Ja;
Ca=14;
break Ee;
case 0xa8:
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ba=za[0]&Ja;
Ca=12;
break Ee;
case 0xa9:
Ja=Lb();
Ba=za[0]&Ja;
Ca=14;
break Ee;
case 0xf6:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
switch(La) {
case 0:
if((Ga>>6)==3) {
Ha=Ga&7;
ia=((za[Ha&3]>>((Ha&4)<<1))&0xff);
} else {
ha=Mb(Ga);
ia=eb();
}
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ba=ia&Ja;
Ca=12;
break;
case 2:
if((Ga>>6)==3) {
Ha=Ga&7;
Rb(Ha,~((za[Ha&3]>>((Ha&4)<<1))&0xff));
} else {
ha=Mb(Ga);
ia=kb();
ia=~ia;
qb(ia);
}
break;
case 3:
if((Ga>>6)==3) {
Ha=Ga&7;
Rb(Ha,Tb(5,0,((za[Ha&3]>>((Ha&4)<<1))&0xff)));
} else {
ha=Mb(Ga);
ia=kb();
ia=Tb(5,0,ia);
qb(ia);
}
break;
case 4:
if((Ga>>6)==3) {
Ha=Ga&7;
ia=((za[Ha&3]>>((Ha&4)<<1))&0xff);
} else {
ha=Mb(Ga);
ia=eb();
}
Sb(0,Gc(za[0],ia));
break;
case 5:
if((Ga>>6)==3) {
Ha=Ga&7;
ia=((za[Ha&3]>>((Ha&4)<<1))&0xff);
} else {
ha=Mb(Ga);
ia=eb();
}
Sb(0,Hc(za[0],ia));
break;
case 6:
if((Ga>>6)==3) {
Ha=Ga&7;
ia=((za[Ha&3]>>((Ha&4)<<1))&0xff);
} else {
ha=Mb(Ga);
ia=eb();
}
uc(ia);
break;
case 7:
if((Ga>>6)==3) {
Ha=Ga&7;
ia=((za[Ha&3]>>((Ha&4)<<1))&0xff);
} else {
ha=Mb(Ga);
ia=eb();
}
wc(ia);
break;
default:
vc(6);
}
break Ee;
case 0xf7:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
switch(La) {
case 0:
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=ib();
}
Ja=Lb();
Ba=ia&Ja;
Ca=14;
break;
case 2:
if((Ga>>6)==3) {
Ha=Ga&7;
za[Ha]=~za[Ha];
} else {
ha=Mb(Ga);
ia=ob();
ia=~ia;
ub(ia);
}
break;
case 3:
if((Ga>>6)==3) {
Ha=Ga&7;
za[Ha]=dc(5,0,za[Ha]);
} else {
ha=Mb(Ga);
ia=ob();
ia=dc(5,0,ia);
ub(ia);
}
break;
case 4:
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=ib();
}
za[0]=Nc(za[0],ia);
za[2]=Oa;
break;
case 5:
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=ib();
}
za[0]=Oc(za[0],ia);
za[2]=Oa;
break;
case 6:
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=ib();
}
za[0]=zc(za[2],za[0],ia);
za[2]=Oa;
break;
case 7:
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=ib();
}
za[0]=Dc(za[2],za[0],ia);
za[2]=Oa;
break;
default:
vc(6);
}
break Ee;
case 0xc0:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
if((Ga>>6)==3) {
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ha=Ga&7;
Rb(Ha,gc(La,((za[Ha&3]>>((Ha&4)<<1))&0xff),Ja));
} else {
ha=Mb(Ga);
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ia=kb();
ia=gc(La,ia,Ja);
qb(ia);
}
break Ee;
case 0xc1:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
if((Ga>>6)==3) {
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ha=Ga&7;
za[Ha]=kc(La,za[Ha],Ja);
} else {
ha=Mb(Ga);
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ia=ob();
ia=kc(La,ia,Ja);
ub(ia);
}
break Ee;
case 0xd0:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
Rb(Ha,gc(La,((za[Ha&3]>>((Ha&4)<<1))&0xff),1));
} else {
ha=Mb(Ga);
ia=kb();
ia=gc(La,ia,1);
qb(ia);
}
break Ee;
case 0xd1:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
za[Ha]=kc(La,za[Ha],1);
} else {
ha=Mb(Ga);
ia=ob();
ia=kc(La,ia,1);
ub(ia);
}
break Ee;
case 0xd2:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
Ja=za[1]&0xff;
if((Ga>>6)==3) {
Ha=Ga&7;
Rb(Ha,gc(La,((za[Ha&3]>>((Ha&4)<<1))&0xff),Ja));
} else {
ha=Mb(Ga);
ia=kb();
ia=gc(La,ia,Ja);
qb(ia);
}
break Ee;
case 0xd3:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
Ja=za[1]&0xff;
if((Ga>>6)==3) {
Ha=Ga&7;
za[Ha]=kc(La,za[Ha],Ja);
} else {
ha=Mb(Ga);
ia=ob();
ia=kc(La,ia,Ja);
ub(ia);
}
break Ee;
case 0x98:
za[0]=(za[0]<<16)>>16;
break Ee;
case 0x99:
za[2]=za[0]>>31;
break Ee;
case 0x50:
case 0x51:
case 0x52:
case 0x53:
case 0x54:
case 0x55:
case 0x56:
case 0x57:
ia=za[b&7];
ha=(za[4]-4)&-1;
{
Ua=ab[ha>>>12];
if((Ua|ha)&3) {
tb(ia);
} else {
Ta[(ha^Ua)>>2]=ia;
}
};
za[4]=ha;
break Ee;
case 0x58:
case 0x59:
case 0x5a:
case 0x5b:
case 0x5c:
case 0x5d:
case 0x5e:
case 0x5f:
ha=za[4];
ia=(((Ua=Za[ha>>>12])|ha)&3?hb():Ta[(ha^Ua)>>2]);
za[4]=(ha+4)&-1;
za[b&7]=ia;
break Ee;
case 0x60:
ha=(za[4]-32)&-1;
Ja=ha;
for(Ia=7; Ia>=0; Ia--) {
ia=za[Ia];
{
Ua=ab[ha>>>12];
if((Ua|ha)&3) {
tb(ia);
} else {
Ta[(ha^Ua)>>2]=ia;
}
};
ha=(ha+4)&-1;
}
za[4]=Ja;
break Ee;
case 0x61:
ha=za[4];
for(Ia=7; Ia>=0; Ia--) {
if(Ia!=4) {
za[Ia]=(((Ua=Za[ha>>>12])|ha)&3?hb():Ta[(ha^Ua)>>2]);
}
ha=(ha+4)&-1;
}
za[4]=ha;
break Ee;
case 0x8f:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>6)==3) {
ha=za[4];
ia=ib();
za[4]=(ha+4)&-1;
za[Ga&7]=ia;
} else {
ha=za[4];
ia=ib();
ha=Mb(Ga,4);
ub(ia);
za[4]=(za[4]+4)&-1;
}
break Ee;
case 0x68:
ia=Lb();
ha=(za[4]-4)&-1;
ub(ia);
za[4]=ha;
break Ee;
case 0x6a:
ia=((((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua])<<24)>>24;
Hb++;;
ha=(za[4]-4)&-1;
ub(ia);
za[4]=ha;
break Ee;
case 0xc9:
ha=za[5];
ia=ib();
za[5]=ia;
za[4]=(ha+4)&-1;
break Ee;
case 0x9c:
ia=Sc();
ha=(za[4]-4)&-1;
ub(ia);
za[4]=ha;
break Ee;
case 0x9d:
ha=za[4];
ia=ib();
za[4]=(ha+4)&-1;
if(ya.cpl==0) {
Uc(ia,(0x00000100|0x00040000|0x00200000|0x00004000|0x00000200|0x00003000));
{
if(ya.hard_irq!=0&&(ya.eflags&0x00000200))break De;
};
} else {
var ye;
ye=(ya.eflags>>12)&3;
if(ya.cpl<=ye) {
Uc(ia,(0x00000100|0x00040000|0x00200000|0x00004000|0x00000200));
{
if(ya.hard_irq!=0&&(ya.eflags&0x00000200))break De;
};
} else {
Uc(ia,(0x00000100|0x00040000|0x00200000|0x00004000));
}
}
break Ee;
case 0x06: {
ia=ya.segs[0].selector;
ha=(za[4]-4)&-1;
ub(ia);
za[4]=ha;
};
break Ee;
case 0x0e: {
ia=ya.segs[1].selector;
ha=(za[4]-4)&-1;
ub(ia);
za[4]=ha;
};
break Ee;
case 0x16: {
ia=ya.segs[2].selector;
ha=(za[4]-4)&-1;
ub(ia);
za[4]=ha;
};
break Ee;
case 0x1e: {
ia=ya.segs[3].selector;
ha=(za[4]-4)&-1;
ub(ia);
za[4]=ha;
};
break Ee;
case 0x07: {
ha=za[4];
ia=ib();
ge(0,ia&0xffff);
za[4]=(za[4]+4)&-1;
};
break Ee;
case 0x17: {
ha=za[4];
ia=ib();
ge(2,ia&0xffff);
za[4]=(za[4]+4)&-1;
};
break Ee;
case 0x1f: {
ha=za[4];
ia=ib();
ge(3,ia&0xffff);
za[4]=(za[4]+4)&-1;
};
break Ee;
case 0x8d:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>6)==3)vc(6);
za[(Ga>>3)&7]=Mb(Ga);
break Ee;
case 0xfe:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
switch(La) {
case 0:
if((Ga>>6)==3) {
Ha=Ga&7;
Rb(Ha,Yb(((za[Ha&3]>>((Ha&4)<<1))&0xff)));
} else {
ha=Mb(Ga);
ia=kb();
ia=Yb(ia);
qb(ia);
}
break;
case 1:
if((Ga>>6)==3) {
Ha=Ga&7;
Rb(Ha,Zb(((za[Ha&3]>>((Ha&4)<<1))&0xff)));
} else {
ha=Mb(Ga);
ia=kb();
ia=Zb(ia);
qb(ia);
}
break;
default:
vc(6);
}
break Ee;
case 0xff:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
switch(La) {
case 0:
if((Ga>>6)==3) {
Ha=Ga&7;
{
if(Ca<25) {
Da=Ca;
}
za[Ha]=Ea=(za[Ha]+1)&-1;
Ca=27;
};
} else {
ha=Mb(Ga);
ia=ob();
{
if(Ca<25) {
Da=Ca;
}
ia=Ea=(ia+1)&-1;
Ca=27;
};
ub(ia);
}
break;
case 1:
if((Ga>>6)==3) {
Ha=Ga&7;
{
if(Ca<25) {
Da=Ca;
}
za[Ha]=Ea=(za[Ha]-1)&-1;
Ca=30;
};
} else {
ha=Mb(Ga);
ia=ob();
{
if(Ca<25) {
Da=Ca;
}
ia=Ea=(ia-1)&-1;
Ca=30;
};
ub(ia);
}
break;
case 2:
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=ib();
}
ha=(za[4]-4)&-1;
ub(Hb);
za[4]=ha;
Hb=ia;
break;
case 4:
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=ib();
}
Hb=ia;
break;
case 6:
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=ib();
}
ha=(za[4]-4)&-1;
ub(ia);
za[4]=ha;
break;
case 3:
case 5:
default:
throw"GRP5";
}
break Ee;
case 0xeb:
ia=((((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua])<<24)>>24;
Hb++;;
Hb=(Hb+ia)>>0;
break Ee;
case 0xe9:
ia=Lb();
Hb=(Hb+ia)>>0;
break Ee;
case 0xea:
ia=Lb();
Ja=Kb();
je(Ja,ia);
break Ee;
case 0x70:
case 0x71:
case 0x72:
case 0x73:
case 0x76:
case 0x77:
case 0x78:
case 0x79:
case 0x7a:
case 0x7b:
case 0x7c:
case 0x7d:
case 0x7e:
case 0x7f:
if(Xb(b&0xf)) {
ia=((((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua])<<24)>>24;
Hb++;;
Hb=(Hb+ia)>>0;
} else {
Hb=(Hb+1)>>0;
}
break Ee;
case 0x74:
switch(Ca) {
case 0:
case 3:
case 6:
case 9:
case 12:
case 15:
case 18:
case 21:
Ja=(Ba&0xff)==0;
break;
case 1:
case 4:
case 7:
case 10:
case 13:
case 16:
case 19:
case 22:
Ja=(Ba&0xffff)==0;
break;
case 2:
case 5:
case 8:
case 11:
case 14:
case 17:
case 20:
case 23:
Ja=Ba==0;
break;
case 24:
Ja=(Aa>>6)&1;
break;
case 25:
case 28:
Ja=(Ea&0xff)==0;
break;
case 26:
case 29:
Ja=(Ea&0xffff)==0;
break;
case 27:
case 30:
Ja=Ea==0;
break;
default:
throw"JZ: unsupported cc_op="+Ca;
};
if(Ja) {
ia=((((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua])<<24)>>24;
Hb++;;
Hb=(Hb+ia)>>0;
} else {
Hb=(Hb+1)>>0;
}
break Ee;
case 0x75:
switch(Ca) {
case 0:
case 3:
case 6:
case 9:
case 12:
case 15:
case 18:
case 21:
Ja=(Ba&0xff)==0;
break;
case 1:
case 4:
case 7:
case 10:
case 13:
case 16:
case 19:
case 22:
Ja=(Ba&0xffff)==0;
break;
case 2:
case 5:
case 8:
case 11:
case 14:
case 17:
case 20:
case 23:
Ja=Ba==0;
break;
case 24:
Ja=(Aa>>6)&1;
break;
case 25:
case 28:
Ja=(Ea&0xff)==0;
break;
case 26:
case 29:
Ja=(Ea&0xffff)==0;
break;
case 27:
case 30:
Ja=Ea==0;
break;
default:
throw"JZ: unsupported cc_op="+Ca;
};
if(!Ja) {
ia=((((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua])<<24)>>24;
Hb++;;
Hb=(Hb+ia)>>0;
} else {
Hb=(Hb+1)>>0;
}
break Ee;
case 0xe2:
ia=((((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua])<<24)>>24;
Hb++;;
za[1]=(za[1]-1)&-1;
if(za[1])Hb=(Hb+ia)>>0;
break Ee;
case 0xe3:
ia=((((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua])<<24)>>24;
Hb++;;
if(za[1]==0)Hb=(Hb+ia)>>0;
break Ee;
case 0xc2:
Ja=(Kb()<<16)>>16;
ha=za[4];
ia=ib();
za[4]=(za[4]+4+Ja)&-1;
Hb=ia;
break Ee;
case 0xc3:
ha=za[4];
ia=ib();
za[4]=(za[4]+4)&-1;
Hb=ia;
break Ee;
case 0xe8:
ia=Lb();
ha=(za[4]-4)&-1;
ub(Hb);
za[4]=ha;
Hb=(Hb+ia)>>0;
break Ee;
case 0x90:
break Ee;
case 0xcc:
Ja=Hb;
Od(3,1,0,Ja,0);
break Ee;
case 0xcd:
ia=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ja=Hb;
Od(ia,1,0,Ja,0);
break Ee;
case 0xce:
if(Xb(0)) {
Ja=Hb;
Od(4,1,0,Ja,0);
}
break Ee;
case 0xcf:
Be(1);
{
if(ya.hard_irq!=0&&(ya.eflags&0x00000200))break De;
};
break Ee;
case 0xf5:
Aa=ic()^0x0001;
Ca=24;
break Ee;
case 0xf8:
Aa=ic()&~0x0001;
Ca=24;
break Ee;
case 0xf9:
Aa=ic()|0x0001;
Ca=24;
break Ee;
case 0xfc:
ya.df=1;
break Ee;
case 0xfd:
ya.df=-1;
break Ee;
case 0xfa:
ye=(ya.eflags>>12)&3;
if(ya.cpl>ye)vc(13);
ya.eflags&=~0x00000200;
break Ee;
case 0xfb:
ye=(ya.eflags>>12)&3;
if(ya.cpl>ye)vc(13);
ya.eflags|=0x00000200;
{
if(ya.hard_irq!=0&&(ya.eflags&0x00000200))break De;
};
break Ee;
case 0x9e:
ia=((za[0]>>8)&(0x0080|0x0040|0x0010|0x0004|0x0001))|(Xb(0)<<11);
Aa=ia;
Ca=24;
break Ee;
case 0x9f:
ia=Sc();
Rb(4,ia);
break Ee;
case 0xf4:
if(ya.cpl!=0)vc(13);
ya.halted=1;
Na=257;
break De;
case 0xa4:
if(Fa&(0x0010|0x0020)) {
if(za[1]) {
if(8===32&&(za[1]>>>0)>=4&&ya.df==1&&((za[6]|za[7])&3)==0&&ed()) {} else {
ha=za[6];
ia=eb();
ha=za[7];
qb(ia);
za[6]=(za[6]+(ya.df<<0))&-1;
za[7]=(za[7]+(ya.df<<0))&-1;
za[1]=(za[1]-1)&-1;
}
Hb=Ib;
}
} else {
ha=za[6];
ia=eb();
ha=za[7];
qb(ia);
za[6]=(za[6]+(ya.df<<0))&-1;
za[7]=(za[7]+(ya.df<<0))&-1;
};
break Ee;
case 0xa5:
if(Fa&(0x0010|0x0020)) {
if(za[1]) {
if(32===32&&(za[1]>>>0)>=4&&ya.df==1&&((za[6]|za[7])&3)==0&&ed()) {} else {
ha=za[6];
ia=ib();
ha=za[7];
ub(ia);
za[6]=(za[6]+(ya.df<<2))&-1;
za[7]=(za[7]+(ya.df<<2))&-1;
za[1]=(za[1]-1)&-1;
}
Hb=Ib;
}
} else {
ha=za[6];
ia=ib();
ha=za[7];
ub(ia);
za[6]=(za[6]+(ya.df<<2))&-1;
za[7]=(za[7]+(ya.df<<2))&-1;
};
break Ee;
case 0xaa:
if(Fa&(0x0010|0x0020)) {
if(za[1]) {
if(8===32&&(za[1]>>>0)>=4&&ya.df==1&&(za[7]&3)==0&&jd()) {} else {
ha=za[7];
qb(za[0]);
za[7]=(ha+(ya.df<<0))&-1;
za[1]=(za[1]-1)&-1;
}
Hb=Ib;
}
} else {
ha=za[7];
qb(za[0]);
za[7]=(ha+(ya.df<<0))&-1;
};
break Ee;
case 0xab:
if(Fa&(0x0010|0x0020)) {
if(za[1]) {
if(32===32&&(za[1]>>>0)>=4&&ya.df==1&&(za[7]&3)==0&&jd()) {} else {
ha=za[7];
ub(za[0]);
za[7]=(ha+(ya.df<<2))&-1;
za[1]=(za[1]-1)&-1;
}
Hb=Ib;
}
} else {
ha=za[7];
ub(za[0]);
za[7]=(ha+(ya.df<<2))&-1;
};
break Ee;
case 0xa6:
if(Fa&(0x0010|0x0020)) {
if(za[1]) {
ha=za[6];
ia=eb();
ha=za[7];
Ja=eb();
Tb(7,ia,Ja);
za[6]=(za[6]+(ya.df<<0))&-1;
za[7]=(za[7]+(ya.df<<0))&-1;
za[1]=(za[1]-1)&-1;
if(Fa&0x0010) {
if(!Xb(4))break Ee;
} else {
if(Xb(4))break Ee;
}
Hb=Ib;
}
} else {
ha=za[6];
ia=eb();
ha=za[7];
Ja=eb();
Tb(7,ia,Ja);
za[6]=(za[6]+(ya.df<<0))&-1;
za[7]=(za[7]+(ya.df<<0))&-1;
};
break Ee;
case 0xa7:
if(Fa&(0x0010|0x0020)) {
if(za[1]) {
ha=za[6];
ia=ib();
ha=za[7];
Ja=ib();
dc(7,ia,Ja);
za[6]=(za[6]+(ya.df<<2))&-1;
za[7]=(za[7]+(ya.df<<2))&-1;
za[1]=(za[1]-1)&-1;
if(Fa&0x0010) {
if(!Xb(4))break Ee;
} else {
if(Xb(4))break Ee;
}
Hb=Ib;
}
} else {
ha=za[6];
ia=ib();
ha=za[7];
Ja=ib();
dc(7,ia,Ja);
za[6]=(za[6]+(ya.df<<2))&-1;
za[7]=(za[7]+(ya.df<<2))&-1;
};
break Ee;
case 0xac:
if(Fa&(0x0010|0x0020)) {
if(za[1]) {
ha=za[6];
if(8==32)za[0]=ib();
else Rb(0,eb());
za[6]=(ha+(ya.df<<0))&-1;
za[1]=(za[1]-1)&-1;
Hb=Ib;
}
} else {
ha=za[6];
if(8==32)za[0]=ib();
else Rb(0,eb());
za[6]=(ha+(ya.df<<0))&-1;
};
break Ee;
case 0xad:
if(Fa&(0x0010|0x0020)) {
if(za[1]) {
ha=za[6];
if(32==32)za[0]=ib();
else Fe(0,ib());
za[6]=(ha+(ya.df<<2))&-1;
za[1]=(za[1]-1)&-1;
Hb=Ib;
}
} else {
ha=za[6];
if(32==32)za[0]=ib();
else Fe(0,ib());
za[6]=(ha+(ya.df<<2))&-1;
};
break Ee;
case 0xae:
if(Fa&(0x0010|0x0020)) {
if(za[1]) {
ha=za[7];
ia=eb();
Tb(7,za[0],ia);
za[7]=(za[7]+(ya.df<<0))&-1;
za[1]=(za[1]-1)&-1;
if(Fa&0x0010) {
if(!Xb(4))break Ee;
} else {
if(Xb(4))break Ee;
}
Hb=Ib;
}
} else {
ha=za[7];
ia=eb();
Tb(7,za[0],ia);
za[7]=(za[7]+(ya.df<<0))&-1;
};
break Ee;
case 0xaf:
if(Fa&(0x0010|0x0020)) {
if(za[1]) {
ha=za[7];
ia=ib();
dc(7,za[0],ia);
za[7]=(za[7]+(ya.df<<2))&-1;
za[1]=(za[1]-1)&-1;
if(Fa&0x0010) {
if(!Xb(4))break Ee;
} else {
if(Xb(4))break Ee;
}
Hb=Ib;
}
} else {
ha=za[7];
ia=ib();
dc(7,za[0],ia);
za[7]=(za[7]+(ya.df<<2))&-1;
};
break Ee;
case 0xd8:
case 0xd9:
case 0xda:
case 0xdb:
case 0xdc:
case 0xdd:
case 0xde:
case 0xdf:
if(ya.cr0&((1<<2)|(1<<3))) {
vc(7);
}
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
Ha=Ga&7;
La=((b&7)<<3)|((Ga>>3)&7);
Sb(0,0xffff);
if((Ga>>6)==3) {} else {
ha=Mb(Ga);
}
break Ee;
case 0x9b:
break Ee;
case 0xe4:
ye=(ya.eflags>>12)&3;
if(ya.cpl>ye)vc(13);
ia=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Rb(0,ya.ld8_port(ia));
{
if(ya.hard_irq!=0&&(ya.eflags&0x00000200))break De;
};
break Ee;
case 0xe5:
ye=(ya.eflags>>12)&3;
if(ya.cpl>ye)vc(13);
ia=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
za[0]=ya.ld32_port(ia);
{
if(ya.hard_irq!=0&&(ya.eflags&0x00000200))break De;
};
break Ee;
case 0xe6:
ye=(ya.eflags>>12)&3;
if(ya.cpl>ye)vc(13);
ia=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ya.st8_port(ia,za[0]&0xff);
{
if(ya.hard_irq!=0&&(ya.eflags&0x00000200))break De;
};
break Ee;
case 0xe7:
ye=(ya.eflags>>12)&3;
if(ya.cpl>ye)vc(13);
ia=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ya.st32_port(ia,za[0]);
{
if(ya.hard_irq!=0&&(ya.eflags&0x00000200))break De;
};
break Ee;
case 0xec:
ye=(ya.eflags>>12)&3;
if(ya.cpl>ye)vc(13);
Rb(0,ya.ld8_port(za[2]&0xffff));
{
if(ya.hard_irq!=0&&(ya.eflags&0x00000200))break De;
};
break Ee;
case 0xed:
ye=(ya.eflags>>12)&3;
if(ya.cpl>ye)vc(13);
za[0]=ya.ld32_port(za[2]&0xffff);
{
if(ya.hard_irq!=0&&(ya.eflags&0x00000200))break De;
};
break Ee;
case 0xee:
ye=(ya.eflags>>12)&3;
if(ya.cpl>ye)vc(13);
ya.st8_port(za[2]&0xffff,za[0]&0xff);
{
if(ya.hard_irq!=0&&(ya.eflags&0x00000200))break De;
};
break Ee;
case 0xef:
ye=(ya.eflags>>12)&3;
if(ya.cpl>ye)vc(13);
ya.st32_port(za[2]&0xffff,za[0]);
{
if(ya.hard_irq!=0&&(ya.eflags&0x00000200))break De;
};
break Ee;
case 0x26:
case 0x27:
case 0x2e:
case 0x2f:
case 0x36:
case 0x37:
case 0x3e:
case 0x3f:
case 0x62:
case 0x63:
case 0x67:
case 0x6c:
case 0x6d:
case 0x6e:
case 0x6f:
case 0x82:
case 0x9a:
case 0xc8:
case 0xca:
case 0xcb:
case 0xd4:
case 0xd5:
case 0xd6:
case 0xd7:
case 0xe0:
case 0xe1:
case 0xf1:
vc(6);
break;
case 0x0f:
b=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
switch(b) {
case 0x80:
case 0x81:
case 0x82:
case 0x83:
case 0x84:
case 0x85:
case 0x86:
case 0x87:
case 0x88:
case 0x89:
case 0x8a:
case 0x8b:
case 0x8c:
case 0x8d:
case 0x8e:
case 0x8f:
Ja=Xb(b&0xf);
ia=Lb();
if(Ja)Hb=(Hb+ia)>>0;
break Ee;
case 0x90:
case 0x91:
case 0x92:
case 0x93:
case 0x94:
case 0x95:
case 0x96:
case 0x97:
case 0x98:
case 0x99:
case 0x9a:
case 0x9b:
case 0x9c:
case 0x9d:
case 0x9e:
case 0x9f:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ia=Xb(b&0xf);
if((Ga>>6)==3) {
Rb(Ga&7,ia);
} else {
ha=Mb(Ga);
qb(ia);
}
break Ee;
case 0x40:
case 0x41:
case 0x42:
case 0x43:
case 0x44:
case 0x45:
case 0x46:
case 0x47:
case 0x48:
case 0x49:
case 0x4a:
case 0x4b:
case 0x4c:
case 0x4d:
case 0x4e:
case 0x4f:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=ib();
}
if(Xb(b&0xf))za[(Ga>>3)&7]=ia;
break Ee;
case 0xb6:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
ia=((za[Ha&3]>>((Ha&4)<<1))&0xff);
} else {
ha=Mb(Ga);
ia=eb();
}
za[Ia]=ia;
break Ee;
case 0xb7:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=gb();
}
za[Ia]=ia&0xffff;
break Ee;
case 0xbe:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
ia=((za[Ha&3]>>((Ha&4)<<1))&0xff);
} else {
ha=Mb(Ga);
ia=eb();
}
za[Ia]=(ia<<24)>>24;
break Ee;
case 0xbf:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=gb();
}
za[Ia]=(ia<<16)>>16;
break Ee;
case 0x00:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
switch(La) {
case 0:
case 1:
if(La==0)ia=ya.ldt.selector;
else ia=ya.tr.selector;
if((Ga>>6)==3) {
Sb(Ga&7,ia);
} else {
ha=Mb(Ga);
sb(ia);
}
break;
case 2:
if(ya.cpl!=0)vc(13);
if((Ga>>6)==3) {
ia=za[Ga&7]&0xffff;
} else {
ha=Mb(Ga);
ia=gb();
}
de(ia);
break;
case 3:
if(ya.cpl!=0)vc(13);
if((Ga>>6)==3) {
ia=za[Ga&7]&0xffff;
} else {
ha=Mb(Ga);
ia=gb();
}
fe(ia);
break;
default:
vc(6);
}
break Ee;
case 0x01:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
switch(La) {
case 2:
case 3:
if((Ga>>6)==3)vc(6);
if(this.cpl!=0)vc(13);
ha=Mb(Ga);
ia=gb();
ha+=2;
Ja=ib();
if(La==2) {
this.gdt.base=Ja;
this.gdt.limit=ia;
} else {
this.idt.base=Ja;
this.idt.limit=ia;
}
break;
case 7:
if(this.cpl!=0)vc(13);
if((Ga>>6)==3)vc(6);
ha=Mb(Ga);
ya.tlb_flush_page(ha&-4096);
break;
default:
vc(6);
}
break Ee;
case 0x20:
if(ya.cpl!=0)vc(13);
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>6)!=3)vc(6);
Ia=(Ga>>3)&7;
switch(Ia) {
case 0:
ia=ya.cr0;
break;
case 2:
ia=ya.cr2;
break;
case 3:
ia=ya.cr3;
break;
case 4:
ia=ya.cr4;
break;
default:
vc(6);
}
za[Ga&7]=ia;
break Ee;
case 0x22:
if(ya.cpl!=0)vc(13);
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>6)!=3)vc(6);
Ia=(Ga>>3)&7;
ia=za[Ga&7];
switch(Ia) {
case 0:
td(ia);
break;
case 2:
ya.cr2=ia;
break;
case 3:
vd(ia);
break;
case 4:
xd(ia);
break;
default:
vc(6);
}
break Ee;
case 0x06:
if(ya.cpl!=0)vc(13);
td(ya.cr0&~(1<<3));
break Ee;
case 0x23:
if(ya.cpl!=0)vc(13);
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>6)!=3)vc(6);
Ia=(Ga>>3)&7;
ia=za[Ga&7];
if(Ia==4||Ia==5)vc(6);
break Ee;
case 0xb2: {
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>3)==3)vc(6);
ha=Mb(Ga);
ia=ib();
ha+=4;
Ja=gb();
ge(2,Ja);
za[(Ga>>3)&7]=ia;
};
break Ee;
case 0xb4: {
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>3)==3)vc(6);
ha=Mb(Ga);
ia=ib();
ha+=4;
Ja=gb();
ge(4,Ja);
za[(Ga>>3)&7]=ia;
};
break Ee;
case 0xb5: {
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>3)==3)vc(6);
ha=Mb(Ga);
ia=ib();
ha+=4;
Ja=gb();
ge(5,Ja);
za[(Ga>>3)&7]=ia;
};
break Ee;
case 0xa2:
Ce();
break Ee;
case 0xa4:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ja=za[(Ga>>3)&7];
if((Ga>>6)==3) {
Ka=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ha=Ga&7;
za[Ha]=lc(za[Ha],Ja,Ka);
} else {
ha=Mb(Ga);
Ka=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ia=ob();
ia=lc(La,ia,Ja,Ka);
ub(ia);
}
break Ee;
case 0xa5:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ja=za[(Ga>>3)&7];
Ka=za[1];
if((Ga>>6)==3) {
Ha=Ga&7;
za[Ha]=lc(za[Ha],Ja,Ka);
} else {
ha=Mb(Ga);
ia=ob();
ia=lc(La,ia,Ja,Ka);
ub(ia);
}
break Ee;
case 0xac:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ja=za[(Ga>>3)&7];
if((Ga>>6)==3) {
Ka=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ha=Ga&7;
za[Ha]=nc(za[Ha],Ja,Ka);
} else {
ha=Mb(Ga);
Ka=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ia=ob();
ia=nc(La,ia,Ja,Ka);
ub(ia);
}
break Ee;
case 0xad:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ja=za[(Ga>>3)&7];
Ka=za[1];
if((Ga>>6)==3) {
Ha=Ga&7;
za[Ha]=nc(za[Ha],Ja,Ka);
} else {
ha=Mb(Ga);
ia=ob();
ia=nc(La,ia,Ja,Ka);
ub(ia);
}
break Ee;
case 0xba:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
switch(La) {
case 4:
if((Ga>>6)==3) {
ia=za[Ga&7];
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
} else {
ha=Mb(Ga);
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ia=ob();
}
oc(ia,Ja);
break;
case 5:
if((Ga>>6)==3) {
Ha=Ga&7;
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
za[Ha]=pc(za[Ha],Ja);
} else {
ha=Mb(Ga);
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ia=ob();
ia=pc(ia,Ja);
ub(ia);
};
break;
case 6:
if((Ga>>6)==3) {
Ha=Ga&7;
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
za[Ha]=qc(za[Ha],Ja);
} else {
ha=Mb(Ga);
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ia=ob();
ia=qc(ia,Ja);
ub(ia);
};
break;
case 7:
if((Ga>>6)==3) {
Ha=Ga&7;
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
za[Ha]=rc(za[Ha],Ja);
} else {
ha=Mb(Ga);
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ia=ob();
ia=rc(ia,Ja);
ub(ia);
};
break;
default:
vc(6);
}
break Ee;
case 0xa3:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ja=za[(Ga>>3)&7];
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ha=(ha+((Ja>>5)<<2))&-1;
ia=ib();
}
oc(ia,Ja);
break Ee;
case 0xab:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ja=za[(Ga>>3)&7];
if((Ga>>6)==3) {
Ha=Ga&7;
za[Ha]=pc(za[Ha],Ja);
} else {
ha=Mb(Ga);
ha=(ha+((Ja>>5)<<2))&-1;
ia=ob();
ia=pc(ia,Ja);
ub(ia);
}
break Ee;
case 0xb3:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ja=za[(Ga>>3)&7];
if((Ga>>6)==3) {
Ha=Ga&7;
za[Ha]=qc(za[Ha],Ja);
} else {
ha=Mb(Ga);
ha=(ha+((Ja>>5)<<2))&-1;
ia=ob();
ia=qc(ia,Ja);
ub(ia);
}
break Ee;
case 0xbb:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ja=za[(Ga>>3)&7];
if((Ga>>6)==3) {
Ha=Ga&7;
za[Ha]=rc(za[Ha],Ja);
} else {
ha=Mb(Ga);
ha=(ha+((Ja>>5)<<2))&-1;
ia=ob();
ia=rc(ia,Ja);
ub(ia);
}
break Ee;
case 0xbc:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ja=za[Ga&7];
} else {
ha=Mb(Ga);
Ja=ib();
}
za[Ia]=sc(za[Ia],Ja);
break Ee;
case 0xbd:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ja=za[Ga&7];
} else {
ha=Mb(Ga);
Ja=ib();
}
za[Ia]=tc(za[Ia],Ja);
break Ee;
case 0xaf:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ja=za[Ga&7];
} else {
ha=Mb(Ga);
Ja=ib();
}
za[Ia]=Oc(za[Ia],Ja);
break Ee;
case 0x31:
if((ya.cr4&(1<<2))&&ya.cpl!=0)vc(13);
ia=Wc();
za[0]=ia>>>0;
za[2]=(ia/0x100000000)>>>0;
break Ee;
case 0xc0:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
ia=((za[Ha&3]>>((Ha&4)<<1))&0xff);
Ja=Tb(0,ia,((za[Ia&3]>>((Ia&4)<<1))&0xff));
Rb(Ia,ia);
Rb(Ha,Ja);
} else {
ha=Mb(Ga);
ia=kb();
Ja=Tb(0,ia,((za[Ia&3]>>((Ia&4)<<1))&0xff));
qb(Ja);
Rb(Ia,ia);
}
break Ee;
case 0xc1:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
ia=za[Ha];
Ja=dc(0,ia,za[Ia]);
za[Ia]=ia;
za[Ha]=Ja;
} else {
ha=Mb(Ga);
ia=ob();
Ja=dc(0,ia,za[Ia]);
ub(Ja);
za[Ia]=ia;
}
break Ee;
case 0xb1:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
ia=za[Ha];
Ja=dc(5,za[0],ia);
if(Ja==0) {
za[Ha]=za[Ia];
} else {
za[0]=ia;
}
} else {
ha=Mb(Ga);
ia=ob();
Ja=dc(5,za[0],ia);
if(Ja==0) {
ub(za[Ia]);
} else {
za[0]=ia;
}
}
break Ee;
case 0xa0: {
ia=ya.segs[4].selector;
ha=(za[4]-4)&-1;
ub(ia);
za[4]=ha;
};
break Ee;
case 0xa8: {
ia=ya.segs[5].selector;
ha=(za[4]-4)&-1;
ub(ia);
za[4]=ha;
};
break Ee;
case 0xa1: {
ha=za[4];
ia=ib();
ge(4,ia&0xffff);
za[4]=(za[4]+4)&-1;
};
break Ee;
case 0xa9: {
ha=za[4];
ia=ib();
ge(5,ia&0xffff);
za[4]=(za[4]+4)&-1;
};
break Ee;
case 0xc8:
case 0xc9:
case 0xca:
case 0xcb:
case 0xcc:
case 0xcd:
case 0xce:
case 0xcf:
Ia=b&7;
ia=za[Ia];
ia=(ia>>>24)|((ia>>8)&0x0000ff00)|((ia<<8)&0x00ff0000)|(ia<<24);
za[Ia]=ia;
break Ee;
case 0x02:
case 0x03:
case 0x04:
case 0x05:
case 0x07:
case 0x08:
case 0x09:
case 0x0a:
case 0x0b:
case 0x0c:
case 0x0d:
case 0x0e:
case 0x0f:
case 0x10:
case 0x11:
case 0x12:
case 0x13:
case 0x14:
case 0x15:
case 0x16:
case 0x17:
case 0x18:
case 0x19:
case 0x1a:
case 0x1b:
case 0x1c:
case 0x1d:
case 0x1e:
case 0x1f:
case 0x21:
case 0x24:
case 0x25:
case 0x26:
case 0x27:
case 0x28:
case 0x29:
case 0x2a:
case 0x2b:
case 0x2c:
case 0x2d:
case 0x2e:
case 0x2f:
case 0x30:
case 0x32:
case 0x33:
case 0x34:
case 0x35:
case 0x36:
case 0x37:
case 0x38:
case 0x39:
case 0x3a:
case 0x3b:
case 0x3c:
case 0x3d:
case 0x3e:
case 0x3f:
case 0x50:
case 0x51:
case 0x52:
case 0x53:
case 0x54:
case 0x55:
case 0x56:
case 0x57:
case 0x58:
case 0x59:
case 0x5a:
case 0x5b:
case 0x5c:
case 0x5d:
case 0x5e:
case 0x5f:
case 0x60:
case 0x61:
case 0x62:
case 0x63:
case 0x64:
case 0x65:
case 0x66:
case 0x67:
case 0x68:
case 0x69:
case 0x6a:
case 0x6b:
case 0x6c:
case 0x6d:
case 0x6e:
case 0x6f:
case 0x70:
case 0x71:
case 0x72:
case 0x73:
case 0x74:
case 0x75:
case 0x76:
case 0x77:
case 0x78:
case 0x79:
case 0x7a:
case 0x7b:
case 0x7c:
case 0x7d:
case 0x7e:
case 0x7f:
case 0xa6:
case 0xa7:
case 0xaa:
case 0xae:
case 0xb0:
case 0xb8:
case 0xb9:
case 0xc2:
case 0xc3:
case 0xc4:
case 0xc5:
case 0xc6:
case 0xc7:
case 0xd0:
case 0xd1:
case 0xd2:
case 0xd3:
case 0xd4:
case 0xd5:
case 0xd6:
case 0xd7:
case 0xd8:
case 0xd9:
case 0xda:
case 0xdb:
case 0xdc:
case 0xdd:
case 0xde:
case 0xdf:
case 0xe0:
case 0xe1:
case 0xe2:
case 0xe3:
case 0xe4:
case 0xe5:
case 0xe6:
case 0xe7:
case 0xe8:
case 0xe9:
case 0xea:
case 0xeb:
case 0xec:
case 0xed:
case 0xee:
case 0xef:
case 0xf0:
case 0xf1:
case 0xf2:
case 0xf3:
case 0xf4:
case 0xf5:
case 0xf6:
case 0xf7:
case 0xf8:
case 0xf9:
case 0xfa:
case 0xfb:
case 0xfc:
case 0xfd:
case 0xfe:
case 0xff:
default:
vc(6);
}
break;
default:
switch(b) {
case 0x166:
Fa|=0x0100;
b=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
b|=(Fa&0x0100);
break;
case 0x1f0:
Fa|=0x0040;
b=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
b|=(Fa&0x0100);
break;
case 0x1f2:
Fa|=0x0020;
b=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
b|=(Fa&0x0100);
break;
case 0x1f3:
Fa|=0x0010;
b=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
b|=(Fa&0x0100);
break;
case 0x164:
Fa=(Fa&~0x000f)|(4+1);
b=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
b|=(Fa&0x0100);;
break;
case 0x165:
Fa=(Fa&~0x000f)|(5+1);
b=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
b|=(Fa&0x0100);;
break;
case 0x189:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ia=za[(Ga>>3)&7];
if((Ga>>6)==3) {
Sb(Ga&7,ia);
} else {
ha=Mb(Ga);
sb(ia);
}
break Ee;
case 0x18b:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=gb();
}
Sb((Ga>>3)&7,ia);
break Ee;
case 0x1b8:
case 0x1b9:
case 0x1ba:
case 0x1bb:
case 0x1bc:
case 0x1bd:
case 0x1be:
case 0x1bf:
Sb(b&7,Kb());
break Ee;
case 0x1a1:
ha=Qb();
ia=gb();
Sb(0,ia);
break Ee;
case 0x1a3:
ha=Qb();
sb(za[0]);
break Ee;
case 0x1c7:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>6)==3) {
ia=Kb();
Sb(Ga&7,ia);
} else {
ha=Mb(Ga);
ia=Kb();
sb(ia);
}
break Ee;
case 0x191:
case 0x192:
case 0x193:
case 0x194:
case 0x195:
case 0x196:
case 0x197:
Ia=b&7;
ia=za[0];
Sb(0,za[Ia]);
Sb(Ia,ia);
break Ee;
case 0x187:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
ia=za[Ha];
Sb(Ha,za[Ia]);
} else {
ha=Mb(Ga);
ia=mb();
sb(za[Ia]);
}
Sb(Ia,ia);
break Ee;
case 0x101:
case 0x109:
case 0x111:
case 0x119:
case 0x121:
case 0x129:
case 0x131:
case 0x139:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(b>>3)&7;
Ja=za[(Ga>>3)&7];
if((Ga>>6)==3) {
Ha=Ga&7;
Sb(Ha,ac(La,za[Ha],Ja));
} else {
ha=Mb(Ga);
if(La!=7) {
ia=mb();
ia=ac(La,ia,Ja);
sb(ia);
} else {
ia=gb();
ac(7,ia,Ja);
}
}
break Ee;
case 0x103:
case 0x10b:
case 0x113:
case 0x11b:
case 0x123:
case 0x12b:
case 0x133:
case 0x13b:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(b>>3)&7;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ja=za[Ga&7];
} else {
ha=Mb(Ga);
Ja=gb();
}
Sb(Ia,ac(La,za[Ia],Ja));
break Ee;
case 0x105:
case 0x10d:
case 0x115:
case 0x11d:
case 0x125:
case 0x12d:
case 0x135:
case 0x13d:
Ja=Kb();
La=(b>>3)&7;
Sb(0,ac(La,za[0],Ja));
break Ee;
case 0x181:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
Ja=Kb();
za[Ha]=ac(La,za[Ha],Ja);
} else {
ha=Mb(Ga);
Ja=Kb();
if(La!=7) {
ia=mb();
ia=ac(La,ia,Ja);
sb(ia);
} else {
ia=gb();
ac(7,ia,Ja);
}
}
break Ee;
case 0x183:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
Ja=((((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua])<<24)>>24;
Hb++;;
Sb(Ha,ac(La,za[Ha],Ja));
} else {
ha=Mb(Ga);
Ja=((((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua])<<24)>>24;
Hb++;;
if(La!=7) {
ia=mb();
ia=ac(La,ia,Ja);
sb(ia);
} else {
ia=gb();
ac(7,ia,Ja);
}
}
break Ee;
case 0x140:
case 0x141:
case 0x142:
case 0x143:
case 0x144:
case 0x145:
case 0x146:
case 0x147:
Ia=b&7;
Sb(Ia,bc(za[Ia]));
break Ee;
case 0x148:
case 0x149:
case 0x14a:
case 0x14b:
case 0x14c:
case 0x14d:
case 0x14e:
case 0x14f:
Ia=b&7;
Sb(Ia,cc(za[Ia]));
break Ee;
case 0x16b:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ja=za[Ga&7];
} else {
ha=Mb(Ga);
Ja=gb();
}
Ka=((((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua])<<24)>>24;
Hb++;;
Sb(Ia,Jc(Ja,Ka));
break Ee;
case 0x169:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ja=za[Ga&7];
} else {
ha=Mb(Ga);
Ja=gb();
}
Ka=Kb();
Sb(Ia,Jc(Ja,Ka));
break Ee;
case 0x185:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=gb();
}
Ja=za[(Ga>>3)&7];
Ba=ia&Ja;
Ca=13;
break Ee;
case 0x1a9:
Ja=Kb();
Ba=za[0]&Ja;
Ca=13;
break Ee;
case 0x1f7:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
switch(La) {
case 0:
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=gb();
}
Ja=Kb();
Ba=ia&Ja;
Ca=13;
break;
case 2:
if((Ga>>6)==3) {
Ha=Ga&7;
Sb(Ha,~za[Ha]);
} else {
ha=Mb(Ga);
ia=mb();
ia=~ia;
sb(ia);
}
break;
case 3:
if((Ga>>6)==3) {
Ha=Ga&7;
Sb(Ha,ac(5,0,za[Ha]));
} else {
ha=Mb(Ga);
ia=mb();
ia=ac(5,0,ia);
sb(ia);
}
break;
case 4:
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=gb();
}
ia=Ic(za[0],ia);
Sb(0,ia);
Sb(2,ia>>16);
break;
case 5:
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=gb();
}
ia=Jc(za[0],ia);
Sb(0,ia);
Sb(2,ia>>16);
break;
case 6:
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=gb();
}
xc(ia);
break;
case 7:
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=gb();
}
yc(ia);
break;
default:
vc(6);
}
break Ee;
case 0x1c1:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
if((Ga>>6)==3) {
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ha=Ga&7;
Sb(Ha,jc(La,za[Ha],Ja));
} else {
ha=Mb(Ga);
Ja=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ia=mb();
ia=jc(La,ia,Ja);
sb(ia);
}
break Ee;
case 0x1d1:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
Sb(Ha,jc(La,za[Ha],1));
} else {
ha=Mb(Ga);
ia=mb();
ia=jc(La,ia,1);
sb(ia);
}
break Ee;
case 0x1d3:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
Ja=za[1]&0xff;
if((Ga>>6)==3) {
Ha=Ga&7;
Sb(Ha,jc(La,za[Ha],Ja));
} else {
ha=Mb(Ga);
ia=mb();
ia=jc(La,ia,Ja);
sb(ia);
}
break Ee;
case 0x198:
Sb(0,(za[0]<<24)>>24);
break Ee;
case 0x199:
Sb(2,(za[0]<<16)>>31);
break Ee;
case 0x1ff:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
La=(Ga>>3)&7;
switch(La) {
case 0:
if((Ga>>6)==3) {
Ha=Ga&7;
Sb(Ha,bc(za[Ha]));
} else {
ha=Mb(Ga);
ia=mb();
ia=bc(ia);
sb(ia);
}
break;
case 1:
if((Ga>>6)==3) {
Ha=Ga&7;
Sb(Ha,cc(za[Ha]));
} else {
ha=Mb(Ga);
ia=mb();
ia=cc(ia);
sb(ia);
}
break;
case 2:
case 4:
case 6:
case 3:
case 5:
default:
throw"GRP5";
}
break Ee;
case 0x190:
break Ee;
case 0x1a5:
if(Fa&(0x0010|0x0020)) {
if(za[1]) {
if(16===32&&(za[1]>>>0)>=4&&ya.df==1&&((za[6]|za[7])&3)==0&&ed()) {} else {
ha=za[6];
ia=gb();
ha=za[7];
sb(ia);
za[6]=(za[6]+(ya.df<<1))&-1;
za[7]=(za[7]+(ya.df<<1))&-1;
za[1]=(za[1]-1)&-1;
}
Hb=Ib;
}
} else {
ha=za[6];
ia=gb();
ha=za[7];
sb(ia);
za[6]=(za[6]+(ya.df<<1))&-1;
za[7]=(za[7]+(ya.df<<1))&-1;
};
break Ee;
case 0x1a7:
if(Fa&(0x0010|0x0020)) {
if(za[1]) {
ha=za[6];
ia=gb();
ha=za[7];
Ja=gb();
ac(7,ia,Ja);
za[6]=(za[6]+(ya.df<<1))&-1;
za[7]=(za[7]+(ya.df<<1))&-1;
za[1]=(za[1]-1)&-1;
if(Fa&0x0010) {
if(!Xb(4))break Ee;
} else {
if(Xb(4))break Ee;
}
Hb=Ib;
}
} else {
ha=za[6];
ia=gb();
ha=za[7];
Ja=gb();
ac(7,ia,Ja);
za[6]=(za[6]+(ya.df<<1))&-1;
za[7]=(za[7]+(ya.df<<1))&-1;
};
break Ee;
case 0x1ad:
if(Fa&(0x0010|0x0020)) {
if(za[1]) {
ha=za[6];
if(16==32)za[0]=ib();
else Sb(0,gb());
za[6]=(ha+(ya.df<<1))&-1;
za[1]=(za[1]-1)&-1;
Hb=Ib;
}
} else {
ha=za[6];
if(16==32)za[0]=ib();
else Sb(0,gb());
za[6]=(ha+(ya.df<<1))&-1;
};
break Ee;
case 0x1af:
if(Fa&(0x0010|0x0020)) {
if(za[1]) {
ha=za[7];
ia=gb();
ac(7,za[0],ia);
za[7]=(za[7]+(ya.df<<1))&-1;
za[1]=(za[1]-1)&-1;
if(Fa&0x0010) {
if(!Xb(4))break Ee;
} else {
if(Xb(4))break Ee;
}
Hb=Ib;
}
} else {
ha=za[7];
ia=gb();
ac(7,za[0],ia);
za[7]=(za[7]+(ya.df<<1))&-1;
};
break Ee;
case 0x1ab:
if(Fa&(0x0010|0x0020)) {
if(za[1]) {
if(16===32&&(za[1]>>>0)>=4&&ya.df==1&&(za[7]&3)==0&&jd()) {} else {
ha=za[7];
sb(za[0]);
za[7]=(ha+(ya.df<<1))&-1;
za[1]=(za[1]-1)&-1;
}
Hb=Ib;
}
} else {
ha=za[7];
sb(za[0]);
za[7]=(ha+(ya.df<<1))&-1;
};
break Ee;
case 0x1d8:
case 0x1d9:
case 0x1da:
case 0x1db:
case 0x1dc:
case 0x1dd:
case 0x1de:
case 0x1df:
b&=0xff;
break;
case 0x1e5:
ye=(ya.eflags>>12)&3;
if(ya.cpl>ye)vc(13);
ia=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Sb(0,ya.ld16_port(ia));
{
if(ya.hard_irq!=0&&(ya.eflags&0x00000200))break De;
};
break Ee;
case 0x1e7:
ye=(ya.eflags>>12)&3;
if(ya.cpl>ye)vc(13);
ia=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
ya.st16_port(ia,za[0]&0xffff);
{
if(ya.hard_irq!=0&&(ya.eflags&0x00000200))break De;
};
break Ee;
case 0x1ed:
ye=(ya.eflags>>12)&3;
if(ya.cpl>ye)vc(13);
Sb(0,ya.ld16_port(za[2]&0xffff));
{
if(ya.hard_irq!=0&&(ya.eflags&0x00000200))break De;
};
break Ee;
case 0x1ef:
ye=(ya.eflags>>12)&3;
if(ya.cpl>ye)vc(13);
ya.st16_port(za[2]&0xffff,za[0]&0xffff);
{
if(ya.hard_irq!=0&&(ya.eflags&0x00000200))break De;
};
break Ee;
case 0x100:
case 0x102:
case 0x104:
case 0x106:
case 0x107:
case 0x108:
case 0x10a:
case 0x10c:
case 0x10e:
case 0x110:
case 0x112:
case 0x114:
case 0x116:
case 0x117:
case 0x118:
case 0x11a:
case 0x11c:
case 0x11e:
case 0x11f:
case 0x120:
case 0x122:
case 0x124:
case 0x126:
case 0x127:
case 0x128:
case 0x12a:
case 0x12c:
case 0x12e:
case 0x12f:
case 0x130:
case 0x132:
case 0x134:
case 0x136:
case 0x137:
case 0x138:
case 0x13a:
case 0x13c:
case 0x13e:
case 0x13f:
case 0x150:
case 0x151:
case 0x152:
case 0x153:
case 0x154:
case 0x155:
case 0x156:
case 0x157:
case 0x158:
case 0x159:
case 0x15a:
case 0x15b:
case 0x15c:
case 0x15d:
case 0x15e:
case 0x15f:
case 0x160:
case 0x161:
case 0x162:
case 0x163:
case 0x167:
case 0x168:
case 0x16a:
case 0x16c:
case 0x16d:
case 0x16e:
case 0x16f:
case 0x170:
case 0x171:
case 0x172:
case 0x173:
case 0x174:
case 0x175:
case 0x176:
case 0x177:
case 0x178:
case 0x179:
case 0x17a:
case 0x17b:
case 0x17c:
case 0x17d:
case 0x17e:
case 0x17f:
case 0x180:
case 0x182:
case 0x184:
case 0x186:
case 0x188:
case 0x18a:
case 0x18c:
case 0x18d:
case 0x18e:
case 0x18f:
case 0x19a:
case 0x19b:
case 0x19c:
case 0x19d:
case 0x19e:
case 0x19f:
case 0x1a0:
case 0x1a2:
case 0x1a4:
case 0x1a6:
case 0x1a8:
case 0x1aa:
case 0x1ac:
case 0x1ae:
case 0x1b0:
case 0x1b1:
case 0x1b2:
case 0x1b3:
case 0x1b4:
case 0x1b5:
case 0x1b6:
case 0x1b7:
case 0x1c0:
case 0x1c2:
case 0x1c3:
case 0x1c4:
case 0x1c5:
case 0x1c6:
case 0x1c8:
case 0x1c9:
case 0x1ca:
case 0x1cb:
case 0x1cc:
case 0x1cd:
case 0x1ce:
case 0x1cf:
case 0x1d0:
case 0x1d2:
case 0x1d4:
case 0x1d5:
case 0x1d6:
case 0x1d7:
case 0x1e0:
case 0x1e1:
case 0x1e2:
case 0x1e3:
case 0x1e4:
case 0x1e6:
case 0x1e8:
case 0x1e9:
case 0x1ea:
case 0x1eb:
case 0x1ec:
case 0x1ee:
case 0x1f1:
case 0x1f4:
case 0x1f5:
case 0x1f6:
case 0x1f8:
case 0x1f9:
case 0x1fa:
case 0x1fb:
case 0x1fc:
case 0x1fd:
case 0x1fe:
default:
vc(6);
case 0x10f:
b=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
b|=0x0100;
switch(b) {
case 0x140:
case 0x141:
case 0x142:
case 0x143:
case 0x144:
case 0x145:
case 0x146:
case 0x147:
case 0x148:
case 0x149:
case 0x14a:
case 0x14b:
case 0x14c:
case 0x14d:
case 0x14e:
case 0x14f:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
if((Ga>>6)==3) {
ia=za[Ga&7];
} else {
ha=Mb(Ga);
ia=gb();
}
if(Xb(b&0xf))Sb((Ga>>3)&7,ia);
break Ee;
case 0x1b6:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
ia=((za[Ha&3]>>((Ha&4)<<1))&0xff);
} else {
ha=Mb(Ga);
ia=eb();
}
Sb(Ia,ia);
break Ee;
case 0x1be:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
ia=((za[Ha&3]>>((Ha&4)<<1))&0xff);
} else {
ha=Mb(Ga);
ia=eb();
}
Sb(Ia,(ia<<24)>>24);
break Ee;
case 0x1af:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ja=za[Ga&7];
} else {
ha=Mb(Ga);
Ja=gb();
}
Sb(Ia,Jc(za[Ia],Ja));
break Ee;
case 0x1c1:
Ga=((Ua=Za[Hb>>>12])==-1)?Jb(Hb):Ra[Hb^Ua];
Hb++;;
Ia=(Ga>>3)&7;
if((Ga>>6)==3) {
Ha=Ga&7;
ia=za[Ha];
Ja=ac(0,ia,za[Ia]);
Sb(Ia,ia);
Sb(Ha,Ja);
} else {
ha=Mb(Ga);
ia=mb();
Ja=ac(0,ia,za[Ia]);
sb(Ja);
Sb(Ia,ia);
}
break Ee;
case 0x100:
case 0x101:
case 0x102:
case 0x103:
case 0x104:
case 0x105:
case 0x106:
case 0x107:
case 0x108:
case 0x109:
case 0x10a:
case 0x10b:
case 0x10c:
case 0x10d:
case 0x10e:
case 0x10f:
case 0x110:
case 0x111:
case 0x112:
case 0x113:
case 0x114:
case 0x115:
case 0x116:
case 0x117:
case 0x118:
case 0x119:
case 0x11a:
case 0x11b:
case 0x11c:
case 0x11d:
case 0x11e:
case 0x11f:
case 0x120:
case 0x121:
case 0x122:
case 0x123:
case 0x124:
case 0x125:
case 0x126:
case 0x127:
case 0x128:
case 0x129:
case 0x12a:
case 0x12b:
case 0x12c:
case 0x12d:
case 0x12e:
case 0x12f:
case 0x130:
case 0x131:
case 0x132:
case 0x133:
case 0x134:
case 0x135:
case 0x136:
case 0x137:
case 0x138:
case 0x139:
case 0x13a:
case 0x13b:
case 0x13c:
case 0x13d:
case 0x13e:
case 0x13f:
case 0x150:
case 0x151:
case 0x152:
case 0x153:
case 0x154:
case 0x155:
case 0x156:
case 0x157:
case 0x158:
case 0x159:
case 0x15a:
case 0x15b:
case 0x15c:
case 0x15d:
case 0x15e:
case 0x15f:
case 0x160:
case 0x161:
case 0x162:
case 0x163:
case 0x164:
case 0x165:
case 0x166:
case 0x167:
case 0x168:
case 0x169:
case 0x16a:
case 0x16b:
case 0x16c:
case 0x16d:
case 0x16e:
case 0x16f:
case 0x170:
case 0x171:
case 0x172:
case 0x173:
case 0x174:
case 0x175:
case 0x176:
case 0x177:
case 0x178:
case 0x179:
case 0x17a:
case 0x17b:
case 0x17c:
case 0x17d:
case 0x17e:
case 0x17f:
case 0x180:
case 0x181:
case 0x182:
case 0x183:
case 0x184:
case 0x185:
case 0x186:
case 0x187:
case 0x188:
case 0x189:
case 0x18a:
case 0x18b:
case 0x18c:
case 0x18d:
case 0x18e:
case 0x18f:
case 0x190:
case 0x191:
case 0x192:
case 0x193:
case 0x194:
case 0x195:
case 0x196:
case 0x197:
case 0x198:
case 0x199:
case 0x19a:
case 0x19b:
case 0x19c:
case 0x19d:
case 0x19e:
case 0x19f:
case 0x1a0:
case 0x1a1:
case 0x1a2:
case 0x1a3:
case 0x1a4:
case 0x1a5:
case 0x1a6:
case 0x1a7:
case 0x1a8:
case 0x1a9:
case 0x1aa:
case 0x1ab:
case 0x1ac:
case 0x1ad:
case 0x1ae:
case 0x1b0:
case 0x1b1:
case 0x1b2:
case 0x1b3:
case 0x1b4:
case 0x1b5:
case 0x1b7:
case 0x1b8:
case 0x1b9:
case 0x1ba:
case 0x1bb:
case 0x1bc:
case 0x1bd:
case 0x1bf:
case 0x1c0:
default:
vc(6);
}
break;
}
}
}
} while(--Ma);
} catch(Ge) {
var He;
He=0;
for(Pa=0;; Pa++) {
try {
if(Ge.hasOwnProperty("intno")) {
Od(Ge.intno,0,Ge.error_code,0,0);
} else {
He=-1;
}
break;
} catch(Ie) {
Ge=Ie;
}
}
if(!He)continue;
else throw Ge;
}
break;
}
this.cycle_count+=(xa-Ma);
this.eip=Hb;
this.cc_src=Aa;
this.cc_dst=Ba;
this.cc_op=Ca;
this.cc_op2=Da;
this.cc_dst2=Ea;
return Na;
};
ea.prototype.load_binary=function Je(Ke,ha) {
var Le,Me,fd,i,Ne;
Le=new XMLHttpRequest();
Le.open('GET',Ke,false);
if('mozResponseType'in Le) {
Le.mozResponseType='arraybuffer';
} else if('responseType'in Le) {
Le.responseType='arraybuffer';
} else {
Le.overrideMimeType('text/plain; charset=x-user-defined');
}
Le.send(null);
if(Le.status!=200&&Le.status!=0) {
throw"Error while loading "+Ke;
}
if('mozResponse'in Le) {
Me=Le.mozResponse;
} else if(Le.mozResponseArrayBuffer) {
Me=Le.mozResponseArrayBuffer;
} else if('responseType'in Le) {
Me=Le.response;
} else {
Me=Le.responseText;
}
fd=Me.byteLength;
Ne=new Uint8Array(Me,0,fd);
for(i=0; i<fd; i++) {
this.st8_phys(ha+i,Ne[i]);
}
return fd;
};
function Oe(a) {
return((a/10)<<4)|(a%10);
}
function Pe(Qe) {
var Re,d;
Re=new Uint8Array(128);
this.cmos_data=Re;
this.cmos_index=0;
d=new Date();
Re[0]=Oe(d.getUTCSeconds());
Re[2]=Oe(d.getUTCMinutes());
Re[4]=Oe(d.getUTCHours());
Re[6]=Oe(d.getUTCDay());
Re[7]=Oe(d.getUTCDate());
Re[8]=Oe(d.getUTCMonth()+1);
Re[9]=Oe(d.getUTCFullYear()%100);
Re[10]=0x26;
Re[11]=0x02;
Re[12]=0x00;
Re[13]=0x80;
Re[0x14]=0x02;
Qe.register_ioport_write(0x70,2,this.ioport_write.bind(this));
Qe.register_ioport_read(0x70,2,this.ioport_read.bind(this));
}
Pe.prototype.ioport_write=function(ha,Me) {
if(ha==0x70) {
this.cmos_index=Me&0x7f;
}
};
Pe.prototype.ioport_read=function(ha) {
var He;
if(ha==0x70) {
return 0xff;
} else {
He=this.cmos_data[this.cmos_index];
if(this.cmos_index==10)this.cmos_data[10]^=0x80;
else if(this.cmos_index==12)this.cmos_data[12]=0x00;
return He;
}
};
function Se(Qe,Te) {
Qe.register_ioport_write(Te,2,this.ioport_write.bind(this));
Qe.register_ioport_read(Te,2,this.ioport_read.bind(this));
this.reset();
}
Se.prototype.reset=function() {
this.last_irr=0;
this.irr=0;
this.imr=0;
this.isr=0;
this.priority_add=0;
this.irq_base=0;
this.read_reg_select=0;
this.special_mask=0;
this.init_state=0;
this.auto_eoi=0;
this.rotate_on_autoeoi=0;
this.init4=0;
this.elcr=0;
this.elcr_mask=0;
};
Se.prototype.set_irq1=function(Ue,Ve) {
var We;
We=1<<Ue;
if(Ve) {
if((this.last_irr&We)==0)this.irr|=We;
this.last_irr|=We;
} else {
this.last_irr&=~We;
}
};
Se.prototype.get_priority=function(We) {
var Xe;
if(We==0)return-1;
Xe=7;
while((We&(1<<((Xe+this.priority_add)&7)))==0)Xe--;
return Xe;
};
Se.prototype.get_irq=function() {
var We,Ye,Xe;
We=this.irr&~this.imr;
Xe=this.get_priority(We);
if(Xe<0)return-1;
Ye=this.get_priority(this.isr);
if(Xe>Ye) {
return Xe;
} else {
return-1;
}
};
Se.prototype.intack=function(Ue) {
if(this.auto_eoi) {
if(this.rotate_on_auto_eoi)this.priority_add=(Ue+1)&7;
} else {
this.isr|=(1<<Ue);
}
if(!(this.elcr&(1<<Ue)))this.irr&=~(1<<Ue);
};
Se.prototype.ioport_write=function(ha,ia) {
var Xe;
ha&=1;
if(ha==0) {
if(ia&0x10) {
this.reset();
this.init_state=1;
this.init4=ia&1;
if(ia&0x02)throw"single mode not supported";
if(ia&0x08)throw"level sensitive irq not supported";
} else if(ia&0x08) {
if(ia&0x02)this.read_reg_select=ia&1;
if(ia&0x40)this.special_mask=(ia>>5)&1;
} else {
switch(ia) {
case 0x00:
case 0x80:
this.rotate_on_autoeoi=ia>>7;
break;
case 0x20:
case 0xa0:
Xe=this.get_priority(this.isr);
if(Xe>=0) {
this.isr&=~(1<<((Xe+this.priority_add)&7));
}
if(ia==0xa0)this.priority_add=(this.priority_add+1)&7;
break;
case 0x60:
case 0x61:
case 0x62:
case 0x63:
case 0x64:
case 0x65:
case 0x66:
case 0x67:
Xe=ia&7;
this.isr&=~(1<<Xe);
break;
case 0xc0:
case 0xc1:
case 0xc2:
case 0xc3:
case 0xc4:
case 0xc5:
case 0xc6:
case 0xc7:
this.priority_add=(ia+1)&7;
break;
case 0xe0:
case 0xe1:
case 0xe2:
case 0xe3:
case 0xe4:
case 0xe5:
case 0xe6:
case 0xe7:
Xe=ia&7;
this.isr&=~(1<<Xe);
this.priority_add=(Xe+1)&7;
break;
}
}
} else {
switch(this.init_state) {
case 0:
this.imr=ia;
this.update_irq();
break;
case 1:
this.irq_base=ia&0xf8;
this.init_state=2;
break;
case 2:
if(this.init4) {
this.init_state=3;
} else {
this.init_state=0;
}
break;
case 3:
this.auto_eoi=(ia>>1)&1;
this.init_state=0;
break;
}
}
};
Se.prototype.ioport_read=function(Ze) {
var ha,He;
ha=Ze&1;
if(ha==0) {
if(this.read_reg_select)He=this.isr;
else He=this.irr;
} else {
He=this.imr;
}
return He;
};
function af(Qe,bf,Ze,cf) {
this.pics=new Array();
this.pics[0]=new Se(Qe,bf);
this.pics[1]=new Se(Qe,Ze);
this.pics[0].elcr_mask=0xf8;
this.pics[1].elcr_mask=0xde;
this.irq_requested=0;
this.cpu_set_irq=cf;
this.pics[0].update_irq=this.update_irq.bind(this);
this.pics[1].update_irq=this.update_irq.bind(this);
}
af.prototype.update_irq=function() {
var df,Ue;
df=this.pics[1].get_irq();
if(df>=0) {
this.pics[0].set_irq1(2,1);
this.pics[0].set_irq1(2,0);
}
Ue=this.pics[0].get_irq();
if(Ue>=0) {
this.cpu_set_irq(1);
} else {
this.cpu_set_irq(0);
}
};
af.prototype.set_irq=function(Ue,Ve) {
this.pics[Ue>>3].set_irq1(Ue&7,Ve);
this.update_irq();
};
af.prototype.get_hard_intno=function() {
var Ue,df,intno;
Ue=this.pics[0].get_irq();
if(Ue>=0) {
this.pics[0].intack(Ue);
if(Ue==2) {
df=this.pics[1].get_irq();
if(df>=0) {
this.pics[1].intack(df);
} else {
df=7;
}
intno=this.pics[1].irq_base+df;
Ue=df+8;
} else {
intno=this.pics[0].irq_base+Ue;
}
} else {
Ue=7;
intno=this.pics[0].irq_base+Ue;
}
this.update_irq();
return intno;
};
function ef() {
return ya.cycle_count;
}
function ff(Qe,gf) {
var s,i;
this.pit_channels=new Array();
for(i=0; i<3; i++) {
s=new hf();
this.pit_channels[i]=s;
s.mode=3;
s.gate=(i!=2)>>0;
s.pit_load_count(0);
}
this.speaker_data_on=0;
this.set_irq=gf;
Qe.register_ioport_write(0x40,4,this.ioport_write.bind(this));
Qe.register_ioport_read(0x40,3,this.ioport_read.bind(this));
Qe.register_ioport_read(0x61,1,this.speaker_ioport_read.bind(this));
Qe.register_ioport_write(0x61,1,this.speaker_ioport_write.bind(this));
}
function hf() {
this.count=0;
this.latched_count=0;
this.rw_state=0;
this.mode=0;
this.bcd=0;
this.gate=0;
this.count_load_time=0;
this.pit_time_unit=1193182/2000000;
}
hf.prototype.get_time=function() {
return Math.floor(ef()*this.pit_time_unit);
};
hf.prototype.pit_get_count=function() {
var d,jf;
d=this.get_time()-this.count_load_time;
switch(this.mode) {
case 0:
case 1:
case 4:
case 5:
jf=(this.count-d)&0xffff;
break;
default:
jf=this.count-(d%this.count);
break;
}
return jf;
};
hf.prototype.pit_get_out=function() {
var d,kf;
d=this.get_time()-this.count_load_time;
switch(this.mode) {
default:
case 0:
kf=(d>=this.count)>>0;
break;
case 1:
kf=(d<this.count)>>0;
break;
case 2:
if((d%this.count)==0&&d!=0)kf=1;
else kf=0;
break;
case 3:
kf=((d%this.count)<(this.count>>1))>>0;
break;
case 4:
case 5:
kf=(d==this.count)>>0;
break;
}
return kf;
};
hf.prototype.get_next_transition_time=function() {
var d,lf,base,mf;
d=this.get_time()-this.count_load_time;
switch(this.mode) {
default:
case 0:
case 1:
if(d<this.count)lf=this.count;
else return-1;
break;
case 2:
base=(d/this.count)*this.count;
if((d-base)==0&&d!=0)lf=base+this.count;
else lf=base+this.count+1;
break;
case 3:
base=(d/this.count)*this.count;
mf=((this.count+1)>>1);
if((d-base)<mf)lf=base+mf;
else lf=base+this.count;
break;
case 4:
case 5:
if(d<this.count)lf=this.count;
else if(d==this.count)lf=this.count+1;
else return-1;
break;
}
lf=this.count_load_time+lf;
return lf;
};
hf.prototype.pit_load_count=function(ia) {
if(ia==0)ia=0x10000;
this.count_load_time=this.get_time();
this.count=ia;
};
ff.prototype.ioport_write=function(ha,ia) {
var nf,of,s;
ha&=3;
if(ha==3) {
nf=ia>>6;
if(nf==3)return;
s=this.pit_channels[nf];
of=(ia>>4)&3;
switch(of) {
case 0:
s.latched_count=s.pit_get_count();
s.rw_state=4;
break;
default:
s.mode=(ia>>1)&7;
s.bcd=ia&1;
s.rw_state=of-1+0;
break;
}
} else {
s=this.pit_channels[ha];
switch(s.rw_state) {
case 0:
s.pit_load_count(ia);
break;
case 1:
s.pit_load_count(ia<<8);
break;
case 2:
case 3:
if(s.rw_state&1) {
s.pit_load_count((s.latched_count&0xff)|(ia<<8));
} else {
s.latched_count=ia;
}
s.rw_state^=1;
break;
}
}
};
ff.prototype.ioport_read=function(ha) {
var He,oa,s;
ha&=3;
s=this.pit_channels[ha];
switch(s.rw_state) {
case 0:
case 1:
case 2:
case 3:
oa=s.pit_get_count();
if(s.rw_state&1)He=(oa>>8)&0xff;
else He=oa&0xff;
if(s.rw_state&2)s.rw_state^=1;
break;
default:
case 4:
case 5:
if(s.rw_state&1)He=s.latched_count>>8;
else He=s.latched_count&0xff;
s.rw_state^=1;
break;
}
return He;
};
ff.prototype.speaker_ioport_write=function(ha,ia) {
this.speaker_data_on=(ia>>1)&1;
this.pit_channels[2].gate=ia&1;
};
ff.prototype.speaker_ioport_read=function(ha) {
var kf,s,ia;
s=this.pit_channels[2];
kf=s.pit_get_out();
ia=(this.speaker_data_on<<1)|s.gate|(kf<<5);
return ia;
};
ff.prototype.update_irq=function() {
this.set_irq(1);
this.set_irq(0);
};
function pf(Qe,ha,qf) {
this.divider=0;
this.rbr=0;
this.ier=0;
this.iir=0x01;
this.lcr=0;
this.mcr;
this.lsr=0x40|0x20;
this.msr=0;
this.scr=0;
this.set_irq_func=qf;
this.receive_fifo="";
Qe.register_ioport_write(0x3f8,8,this.ioport_write.bind(this));
Qe.register_ioport_read(0x3f8,8,this.ioport_read.bind(this));
}
pf.prototype.update_irq=function() {
if((this.lsr&0x01)&&(this.ier&0x01)) {
this.iir=0x04;
} else if((this.lsr&0x20)&&(this.ier&0x02)) {
this.iir=0x02;
} else {
this.iir=0x01;
}
if(this.iir!=0x01) {
this.set_irq_func(1);
} else {
this.set_irq_func(0);
}
};
pf.prototype.ioport_write=function(ha,ia) {
ha&=7;
switch(ha) {
default:
case 0:
if(this.lcr&0x80) {
this.divider=(this.divider&0xff00)|ia;
} else {
this.lsr&=~0x20;
this.update_irq();
aa.write(String.fromCharCode(ia));
this.lsr|=0x20;
this.lsr|=0x40;
this.update_irq();
}
break;
case 1:
if(this.lcr&0x80) {
this.divider=(this.divider&0x00ff)|(ia<<8);
} else {
this.ier=ia;
this.update_irq();
}
break;
case 2:
break;
case 3:
this.lcr=ia;
break;
case 4:
this.mcr=ia;
break;
case 5:
break;
case 6:
this.msr=ia;
break;
case 7:
this.scr=ia;
break;
}
};
pf.prototype.ioport_read=function(ha) {
var He;
ha&=7;
switch(ha) {
default:
case 0:
if(this.lcr&0x80) {
He=this.divider&0xff;
} else {
He=this.rbr;
this.lsr&=~(0x01|0x10);
this.update_irq();
this.send_char_from_fifo();
}
break;
case 1:
if(this.lcr&0x80) {
He=(this.divider>>8)&0xff;
} else {
He=this.ier;
}
break;
case 2:
He=this.iir;
break;
case 3:
He=this.lcr;
break;
case 4:
He=this.mcr;
break;
case 5:
He=this.lsr;
break;
case 6:
He=this.msr;
break;
case 7:
He=this.scr;
break;
}
return He;
};
pf.prototype.send_break=function() {
this.rbr=0;
this.lsr|=0x10|0x01;
this.update_irq();
};
pf.prototype.send_char=function(rf) {
this.rbr=rf;
this.lsr|=0x01;
this.update_irq();
};
pf.prototype.send_char_from_fifo=function() {
var sf;
sf=this.receive_fifo;
if(sf!=""&&!(this.lsr&0x01)) {
this.send_char(sf.charCodeAt(0));
this.receive_fifo=sf.substr(1,sf.length-1);
}
};
pf.prototype.send_chars=function(va) {
this.receive_fifo+=va;
this.send_char_from_fifo();
};
function tf(Qe,uf) {
Qe.register_ioport_read(0x64,1,this.read_status.bind(this));
Qe.register_ioport_write(0x64,1,this.write_command.bind(this));
this.reset_request=uf;
}
tf.prototype.read_status=function(ha) {
return 0;
};
tf.prototype.write_command=function(ha,ia) {
switch(ia) {
case 0xfe:
this.reset_request();
break;
default:
break;
}
};
function cf(Ve) {
this.hard_irq=Ve;
}
function vf() {
this.init_ioports();
this.register_ioport_write(0x80,1,this.ioport80_write);
this.pic=new af(this,0x20,0xa0,cf.bind(ya));
this.pit=new ff(this,this.pic.set_irq.bind(this.pic,0));
this.cmos=new Pe(this);
this.serial=new pf(this,0x3f8,this.pic.set_irq.bind(this.pic,4));
this.kbd=new tf(this,this.reset.bind(this));
this.reset_request=0;
}
vf.prototype.init_ioports=function() {
var i;
this.ioport_readb_table=new Array();
this.ioport_writeb_table=new Array();
for(i=0; i<1024; i++) {
this.ioport_readb_table[i]=this.default_ioport_readb;
this.ioport_writeb_table[i]=this.default_ioport_writeb;
}
};
vf.prototype.default_ioport_readb=function(Te) {
var ia;
ia=0xff;
return ia;
};
vf.prototype.default_ioport_writeb=function(Te,ia) {};
vf.prototype.ld8_port=function(Te) {
var ia;
ia=this.ioport_readb_table[Te&(1024-1)](Te);
return ia;
};
vf.prototype.ld16_port=function(Te) {
var ia;
ia=this.ld8_port(Te);
ia|=this.ld8_port((Te+1)&0xffff)<<8;
return ia;
};
vf.prototype.ld32_port=function(Te) {
var ia;
ia=-1;
return ia;
};
vf.prototype.st8_port=function(Te,ia) {
this.ioport_writeb_table[Te&(1024-1)](Te,ia);
};
vf.prototype.st16_port=function(Te,ia) {
this.st8_port(Te,ia&0xff);
this.st8_port((Te+1)&0xffff,(ia>>8)&0xff);
};
vf.prototype.st32_port=function(Te,ia) {};
vf.prototype.register_ioport_read=function(start,fd,wf) {
var i;
for(i=start; i<start+fd; i++) {
this.ioport_readb_table[i]=wf;
}
};
vf.prototype.register_ioport_write=function(start,fd,wf) {
var i;
for(i=start; i<start+fd; i++) {
this.ioport_writeb_table[i]=wf;
}
};
vf.prototype.ioport80_write=function(ha,Me) {};
vf.prototype.reset=function() {
this.request_request=1;
};
var ya,xf,Qe;
function yf() {
var Na,zf,Af,Bf,Cf;
Af=ya.cycle_count+100000;
Bf=false;
Cf=false;
Df:
while(ya.cycle_count<Af) {
Qe.pit.update_irq();
Na=ya.exec(Af-ya.cycle_count);
if(Na==256) {
if(Qe.reset_request) {
Bf=true;
break;
}
} else if(Na==257) {
Cf=true;
break;
} else {
Bf=true;
break;
}
}
if(!Bf) {
if(Cf) {
setTimeout(yf,10);
} else {
setTimeout(yf,0);
}
}
}
function Ef() {
aa=new Term(80,30,Ff);
aa.open();
}
function Ff(va) {
Qe.serial.send_chars(va);
}
function Gf() {
return(window.Uint8Array&&window.Uint16Array&&window.Int32Array&&window.ArrayBuffer);
}
function start() {
var Hf,i,start,If,Jf;
if(!Gf()) {
aa.writeln("");
aa.writeln("Your browser does not support the W3C Typed Arrays and this version of JS/Linux needs them.\n");
aa.writeln("If you really want to try out JS/Linux, you can use the following browsers:");
aa.writeln("- Firefox 4.x");
aa.writeln("- Google Chrome 11");
return;
}
ya=new ea();
Qe=new vf();
If=32*1024*1024;
ya.phys_mem_resize(If);
ya.load_binary("vmlinux26.bin",0x00100000);
Jf=ya.load_binary("root.bin",0x00400000);
start=0x10000;
ya.load_binary("linuxstart.bin",start);
ya.eip=start;
ya.regs[0]=If;
ya.regs[3]=Jf;
ya.cycle_count=0;
ya.ld8_port=Qe.ld8_port.bind(Qe);
ya.ld16_port=Qe.ld16_port.bind(Qe);
ya.ld32_port=Qe.ld32_port.bind(Qe);
ya.st8_port=Qe.st8_port.bind(Qe);
ya.st16_port=Qe.st16_port.bind(Qe);
ya.st32_port=Qe.st32_port.bind(Qe);
ya.get_hard_intno=Qe.pic.get_hard_intno.bind(Qe.pic);
xf=Date.now();
setTimeout(yf,10);
}
Ef();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment