Supoprt for tape images in the Absolute Loader format has been moved to the RAM component, so that those images can be preloaded into RAM in the same way that raw bootstrap images can; the RAM component now provides Absolute Loader image parsing as a service to other components that need it (specifically, the PC11 tape reader)

This commit is contained in:
Jeff Parsons 2016-10-19 11:10:38 -07:00 committed by Jeff Parsons
commit 13a1dedbc7
21 changed files with 800 additions and 693 deletions

View file

@ -656,7 +656,7 @@ function zp(a,b){var c=0,d,e=!0;b||(b=[0,0,128,Array(9),0,0,0,[]]);a.hb=b[c++];c
n[t++];g.eb=n[t++];g.pb=null;g.za||(g.Oe="");var A=n[t++];102==A&&(A=!1);"boolean"==typeof A?(q=n[t++],n=n[t],A?(t=k.A[m],Ep(k,m,!0,!0),t.bf=!0,m=new Lo(k,t,"preload"),k.pj(t,m,q,n,!0)):Gp(k,m,q,n,!0)?g.za&&n&&Hp(k,q,n,g.za):xb(k,!1)):void 0!==A&&g.za&&0>g.za.restore(A)&&(h=!1);h&&g.za&&void 0!==g.eb&&(g.pb=g.za.seek(g.Qb,g.kb,g.xb));h||(e=!1)}a.W=b[c++]||0;a.jc=b[c]||0;return e}
function Fp(a){var b=0,c=[];c[b++]=a.hb;c[b++]=0;c[b++]=a.ma;c[b++]=a.V;c[b++]=a.L;c[b++]=a.C;c[b++]=a.aa;for(var d=b++,e=0,f=[],g=0;g<a.A.length;g++){var h=e++,k=a.A[g],m=0,n=[];n[m++]=k.Cb;n[m++]=[k.name,k.Bb,k.ub,k.lb,k.Va,k.cf,k.Fg,k.Qf,k.Rf];n[m++]=k.kb;n[m++]=k.ee+100;n[m++]=k.Qb;n[m++]=k.xb;n[m++]=k.fe;n[m++]=k.Hb;n[m++]=k.eb;n[m++]=k.bf;n[m++]=k.Tk;n[m]=k.Oe;f[h]=n}c[d]=f;d=b++;for(e=0;e<a.A.length;e++)f=a.A[e],f.za&&Ip(a,f.Oe,f.za);c[d]=a.B;c[b++]=a.W;c[b]=a.jc;return c}
l.mj=function(a){var b;a=this.A[a];if(void 0!==a){b={};for(var c in a)b[c]=a[c]}return b};l.Uk=function(a,b,c){if(a.za){var d=a.za.info(),e=d[2],f=d[1]*e;if(b+c<=d[0]*f)return a.Qb=Math.floor(b/f),b%=f,a.kb=Math.floor(b/e),a.xb=b%e+1,a.Hb=c*d[3],a.Cb=0,!0}return!1};
function Dp(a,b){b||(a.ea=0);if(a.U)for(var c in a.U){var d=a.U[c],e=d.path,f;if(!(f=d.name))a:{if((f=a.qa.listDisks)&&f.options)for(var g=0;g<f.options.length;g++){var h=f.options[g];if(h.value==e){f=h.text;break a}}f=ja(e,!0)}if(e&&f&&(g=c.charCodeAt(0)-65,0<=g&&g<a.A.length)){!Gp(a,g,f,e,!0)&&b&&xb(a,!1);continue}a.Na("Incorrect auto-mount settings for drive "+c+" ("+JSON.stringify(d)+")")}return!!a.ea}
function Dp(a,b){b||(a.ea=0);if(a.U)for(var c in a.U){var d=a.U[c],e=d.path||"",f;if(!(f=d.name))a:{if((f=a.qa.listDisks)&&f.options)for(var g=0;g<f.options.length;g++){var h=f.options[g];if(h.value==e){f=h.text;break a}}f=ja(e,!0)}if(e&&f&&(g=c.charCodeAt(0)-65,0<=g&&g<a.A.length)){!Gp(a,g,f,e,!0)&&b&&xb(a,!1);continue}a.Na("Incorrect auto-mount settings for drive "+c+" ("+JSON.stringify(d)+")")}return!!a.ea}
function yp(a,b,c,d){var e,f=a.qa.listDrives;if(f&&!isNaN(e=ea(f.value,10))&&0<=e&&e<a.A.length)if(c)if("?"==c)a.Na('Use "Choose File" and "Mount" to select and load a local disk.');else{if("??"==c){c=window.prompt("Enter the URL of a remote disk image.","")||"";if(!c)return;b=ja(c)}for(;0>Gp(a,e,b,c,!1,d)&&window.confirm("Click OK to reload the original disk.\n(WARNING: All disk changes will be discarded)");){var f=a,g=c,h;for(h=0;h<f.B.length;h++)if(f.B[h][1]==g){f.B.splice(h,1);break}Ep(a,e,!1,
!0)}}else Ep(a,e);else a.Na("Unable to load the selected drive")}function Gp(a,b,c,d,e,f){var g=a.A[b];if(d&&(d=d.replace("/disks/pc/","/disks/pcx86/"),g.Oe.toLowerCase()!=d.toLowerCase())){Ep(a,b,e,!0);if(g.$e)return a.Na("Drive "+b+" busy"),0;g.$e=!0;e&&(g.Ce=!0,a.ea++,z(a)&&y(a,"loading diskette '"+c+"'"));g.bf=!!f;return(new Lo(a,g,"preload")).load(c,d,f,a.pj)?1:0}return-1}
l.pj=function(a,b,c,d,e){var f;a.$e=!1;b&&(f=b.info(),b&&f[0]>a.Bb||f[1]>a.ub)&&(this.Na('Diskette "'+c+'" too large for drive '+String.fromCharCode(65+a.hb)),b=null);b?(a.za=b,a.Tk=c,a.Oe=d,Hp(this,c,d,b),f=b.info(),this.W|=128,this.Na('Mounted diskette "'+c+'" in drive '+String.fromCharCode(65+a.hb),a.Ce||e),a.Fg=f[0],a.Qf=f[1],a.Rf=f[2],this.X&&this.X.wd()):a.bf=!1;a.Ce&&(a.Ce=!1,--this.ea||xb(this));xp(this,a.hb)};

View file

@ -604,7 +604,7 @@ function xm(a,b){var c=0,d,e=!0;b||(b=[0,0,128,Array(9),0,0,0,[]]);a.Qa=b[c++];c
80;g.eb=9;break;case 1200:g.ib=80;g.eb=15;break;case 1440:g.ib=80,g.eb=18}}var k=a,m=d,q=f[d],y=0;h=!0;g.Qa=m;g.ne=g.pe=!1;q||(q=[192,!0,0,2,0]);"boolean"==typeof q[1]&&(q[1]=["Floppy Drive",g.ib||40,g.jb||q[3],g.eb||9,g.nb||512,q[1],g.Nf,g.Xe,g.Ye]);g.kb=q[y++];var w=q[y++];g.name=w[0];g.ib=w[1];g.jb=w[2];g.eb=w[3];g.nb=w[4];g.qe=w[5];(g.Nf=w[6])?(g.Xe=w[7],g.Ye=w[8]):(g.Nf=g.ib,g.Xe=g.jb,g.Ye=g.eb);g.Ya=q[y++];g.ud=q[y++];g.wb=q[y++];g.ud=100<=g.ud?g.ud-100:g.ud-g.wb;g.mb=q[y++];g.vd=q[y++];g.vb=
q[y++];g.Ua=q[y++];g.Wa=null;g.ta||(g.Xd="");var z=q[y++];102==z&&(z=!1);"boolean"==typeof z?(w=q[y++],q=q[y],z?(y=k.B[m],Cm(k,m,!0,!0),y.pe=!0,m=new cm(k,y,"preload"),k.oi(y,m,w,q,!0)):Em(k,m,w,q,!0)?g.ta&&q&&Fm(k,w,q,g.ta):t(k,!1)):void 0!==z&&g.ta&&0>g.ta.restore(z)&&(h=!1);h&&g.ta&&void 0!==g.Ua&&(g.Wa=g.ta.seek(g.wb,g.Ya,g.mb));h||(e=!1)}a.L=b[c++]||0;a.H=b[c]||0;return e}
function Dm(a){var b=0,c=[];c[b++]=a.Qa;c[b++]=0;c[b++]=a.aa;c[b++]=a.I;c[b++]=a.G;c[b++]=a.D;c[b++]=a.P;for(var d=b++,e=0,f=[],g=0;g<a.B.length;g++){var h=e++,k=a.B[g],m=0,q=[];q[m++]=k.kb;q[m++]=[k.name,k.ib,k.jb,k.eb,k.nb,k.qe,k.Nf,k.Xe,k.Ye];q[m++]=k.Ya;q[m++]=k.ud+100;q[m++]=k.wb;q[m++]=k.mb;q[m++]=k.vd;q[m++]=k.vb;q[m++]=k.Ua;q[m++]=k.pe;q[m++]=k.Jj;q[m]=k.Xd;f[h]=q}c[d]=f;d=b++;for(e=0;e<a.B.length;e++)f=a.B[e],f.ta&&Gm(a,f.Xd,f.ta);c[d]=a.C;c[b++]=a.L;c[b]=a.H;return c}
function Bm(a,b){b||(a.R=0);if(a.K)for(var c in a.K){var d=a.K[c],e=d.path,f;if(!(f=d.name))a:{if((f=a.la.listDisks)&&f.options)for(var g=0;g<f.options.length;g++){var h=f.options[g];if(h.value==e){f=h.text;break a}}f=ga(e,!0)}if(e&&f&&(g=c.charCodeAt(0)-65,0<=g&&g<a.B.length)){!Em(a,g,f,e,!0)&&b&&t(a,!1);continue}a.Ba("Incorrect auto-mount settings for drive "+c+" ("+JSON.stringify(d)+")")}return!!a.R}
function Bm(a,b){b||(a.R=0);if(a.K)for(var c in a.K){var d=a.K[c],e=d.path||"",f;if(!(f=d.name))a:{if((f=a.la.listDisks)&&f.options)for(var g=0;g<f.options.length;g++){var h=f.options[g];if(h.value==e){f=h.text;break a}}f=ga(e,!0)}if(e&&f&&(g=c.charCodeAt(0)-65,0<=g&&g<a.B.length)){!Em(a,g,f,e,!0)&&b&&t(a,!1);continue}a.Ba("Incorrect auto-mount settings for drive "+c+" ("+JSON.stringify(d)+")")}return!!a.R}
function wm(a,b,c,d){var e,f=a.la.listDrives;if(f&&!isNaN(e=ea(f.value,10))&&0<=e&&e<a.B.length)if(c)if("?"==c)a.Ba('Use "Choose File" and "Mount" to select and load a local disk.');else{if("??"==c){c=window.prompt("Enter the URL of a remote disk image.","")||"";if(!c)return;b=ga(c)}for(;0>Em(a,e,b,c,!1,d)&&window.confirm("Click OK to reload the original disk.\n(WARNING: All disk changes will be discarded)");){var f=a,g=c,h;for(h=0;h<f.C.length;h++)if(f.C[h][1]==g){f.C.splice(h,1);break}Cm(a,e,!1,
!0)}}else Cm(a,e);else a.Ba("Unable to load the selected drive")}function Em(a,b,c,d,e,f){var g=a.B[b];if(d&&(d=d.replace("/disks/pc/","/disks/pcx86/"),g.Xd.toLowerCase()!=d.toLowerCase())){Cm(a,b,e,!0);if(g.ne)return a.Ba("Drive "+b+" busy"),0;g.ne=!0;e&&(g.Od=!0,a.R++);g.pe=!!f;return(new cm(a,g,"preload")).load(c,d,f,a.oi)?1:0}return-1}
l.oi=function(a,b,c,d,e){var f;a.ne=!1;b&&(f=b.info(),b&&f[0]>a.ib||f[1]>a.jb)&&(this.Ba('Diskette "'+c+'" too large for drive '+String.fromCharCode(65+a.Qa)),b=null);b?(a.ta=b,a.Jj=c,a.Xd=d,Fm(this,c,d,b),f=b.info(),this.L|=128,this.Ba('Mounted diskette "'+c+'" in drive '+String.fromCharCode(65+a.Qa),a.Od||e),a.Nf=f[0],a.Xe=f[1],a.Ye=f[2],this.ba&&xc(this.ba)):a.pe=!1;a.Od&&(a.Od=!1,--this.R||t(this));vm(this,a.Qa)};