home *** CD-ROM | disk | FTP | other *** search
-
- /*********************************************************
- * *
- * Fmon V1.8 - fmon.c: main program *
- * *
- * (c) 1991 Michael Schröder *
- * *
- * This program is freely distributable as long as *
- * the above copyright message is left intact *
- * *
- *********************************************************/
-
-
- #include "libraries/dosextens.h"
- #include "intuition/intuition.h"
- #include "exec/memory.h"
- #include "exec/io.h"
- #include "exec/execbase.h"
- #include "devices/input.h"
- #include "devices/trackdisk.h"
- #include "exec/interrupts.h"
- #include "graphics/gfxbase.h"
- #include "proto/exec.h"
- #include "proto/dos.h"
- #include "proto/intuition.h"
- #include "fmon.h"
-
-
- char *Allocabs(long,char *);
- #pragma syscall Allocabs cc 9002
- ULONG typeofmem(char *);
- #pragma syscall typeofmem 216 901
-
-
- #define ERROR {serr();break;}
-
- #define SHIFT 3
- #define CONT 8
- #define CAPS 4
- #define TD_HUNT CMD_INVALID
- #define TD_RAW TD_SEEK
-
- char fmonid[]="Fmon";
- char fontid[]="topaz.font";
- extern char windid[];
- struct TextAttr teat={0,TOPAZ_EIGHTY,0,0}; /* MUST be an 8x8 font */
- struct NewScreen ns={0,0,XXX*8,VOFF+YYY*8+2+1,1,0,1,SCREENPARA,CUSTOMSCREEN,0,0,0,0};
- struct NewWindow nw={0,WOFF,XXX*8,VOFF-WOFF+YYY*8+2+1,-1,-1,0,SMART_REFRESH|ACTIVATE|NOCAREREFRESH|BORDERLESS,0,0,0,0,0,0,0,0,0,CUSTOMSCREEN};
-
-
- UBYTE st[120];
- UWORD sp;
-
-
- void jump(),jumpe(),pos(),serr(),insertl(),clearl(),wril(),put(),wri(),wric(),hwric(),ofhwric();
- void wrilc(),hwril(),putofh(),load(),copy(),clearcs(),erasedisp(),regclear(),reginit();
- void fill(),sav(),hunt(),verify();
- void __regargs app(UBYTE);
- void __regargs addlx(ULONG);
- void __regargs addax(ULONG);
- void __regargs addwx(UWORD);
- void __regargs addbx(UBYTE);
- void __regargs addd(LONG);
- void __regargs adddt(void *);
- void __regargs addwb(UWORD);
- void __regargs addlb(ULONG);
- void __regargs adds(char *);
- void __regargs addsc(char *);
- void __regargs addblk(ULONG,int);
- void __regargs pril(char *);
- void __regargs print(char *);
- void __regargs eprint(char *,char *);
- int __regargs cmpsbs(char *,long);
- void __regargs cnoprint(char *);
- void __regargs cnopen(char *);
- void __regargs addbname(long);
- void __regargs addbname4(long);
- int __regargs getbytes(char *);
- void __regargs dumpmem(char *);
- void __regargs dumpasc(char *,int);
- void __regargs addc(char);
- int __regargs setcd(char *);
- void __regargs binfoh(char *);
- ULONG blchk();
- ULONG __regargs bochk(char *);
- ULONG __regargs hash(char *);
- int __regargs inidev(char *);
- struct DeviceList * __regargs finddev(char *);
- void __regargs copypara(char *);
-
- int freemem(),exe(),inputline(),get(),dopkt(),doraw(),frmval(),frmval2(),frmval3(),chq(),chqc();
- UBYTE gcl(),gcla(),*getadr(),*geteadr(),*getdevnam(),*getnam(),*getnam2();
-
- void handler();
- UWORD qual;
- struct Interrupt hands;
-
- struct IntuitionBase *IntuitionBase;
- struct GfxBase *GfxBase;
- struct Screen *sc;
- struct Window *wi;
- extern struct InfoData infd;
- extern struct FileInfoBlock fib;
- extern UBYTE bootbl[];
- struct Process *proc;
- UBYTE *bpl0,*charbuf,*scrbuf;
-
- struct MsgPort monp,crqp;
- struct IOStdReq irq,rq,crq,trq;
-
- ULONG fh,ofh;
- UWORD em;
-
- short cx=0,cy=0;
-
- UBYTE cl[XXX+1];
- UWORD ps;
-
- UBYTE dayn[7][7]={'S','u','n',0,0,0,0,'M','o','n',0,0,0,0,'T','u','e','s',0,0,0,
- 'W','e','d','n','e','s',0,'T','h','u','r','s',0,0,
- 'F','r','i',0,0,0,0,'S','a','t','u','r',0,0};
-
- UBYTE dnl[4][5]={'d','f','0',':',0,'d','f','1',':',0,'d','f','2',':',0,'d','f','3',':',0};
-
- UWORD rpc[4]={0,140,280,560};
- char rps[7][15]={'1','-','P','r','e','c','o','m','p',':',000,000,000,000,000,
- '2','-','M','F','M',' ','p','r','e','c','o','m','p',':',000,
- '3','-','W','o','r','d','s','y','n','c',':',000,000,000,000,
- '4','-','S','y','n','c','w','o','r','d',':',000,000,000,000,
- '5','-','M','S','B','s','y','n','c',':',000,000,000,000,000,
- '6','-','F','a','s','t',':',000,000,000,000,000,000,000,000,
- '7','-','I','n','d','e','x',':',000,000,000,000,000,000,000};
-
- UBYTE rpsh[7]={0,12,10,0,9,8,0};
-
- ULONG regs[20];
- WORD trpv;
- UBYTE *stack;
- ULONG ssize;
- UBYTE rl1[21]="ddddddddaaaaaaaapsit";
- UBYTE rl2[21]="0123456701234567crdd";
-
- UWORD rsyn=0x4489,rpar=0x9500;
-
- char *bbuf,*abuf;
- ULONG unit=0,device=0,flags=0,bsize=512,bsize4=128,heads=2,bptrack=11,bpcyl=22,lowbl=0,highbl=1760,root=880,memtyp=3;
- ULONG cbl;
- BYTE notd= -1;
- UBYTE hj='*',huc=0;
- int anz;
- BYTE bf;
- UBYTE state;
- char nobuf[]="No buffer!";
- char oddsp[]="!!! Odd stackpointer !!!";
- char file[]="file";
- char cnas[]="Could not alloc signal ";
- char intuiname[]="intuition.library";
- char gfxname[]="graphics.library";
- char inpname[]="input.device";
- char conname[]="console.device";
- char iins[]="No Start End Length";
- char nomembuf[]="No memory for buffer";
- char sold[]="Old: $";
- char snow[]=" Now: $";
- char snoseg[]="Not a segment pointer";
- extern char snotd[];
-
- void binfo(),shi(),shhunt(),showsr(),showregs(),gottrap();
- ULONG loadseg();
-
-
- void
- min()
- {
- register UBYTE c;
- register LONG x,y,z;
- UBYTE c1,*dsta,*dena,*getadr(),*geteadr();
- register UBYTE *sta,*ena,*nam,*zad;
- ULONG lo,a,b,e,f;
- LONG xx;
- extern struct DosLibrary *DOSBase;
- struct DeviceList *dl;
- struct Node *ln;
- struct MemHeader *mh;
- APTR owi;
- struct TextFont *font;
-
- proc=(struct Process *)FindTask(0);
-
- if ((IntuitionBase=(struct IntuitionBase *)OpenLibrary(intuiname,0))==0)
- {cnoprint(intuiname);goto fin;}
-
- if ((GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0))==0)
- {cnoprint(gfxname);goto fin;}
-
- teat.ta_Name=fontid;ns.Font=&teat;ns.DefaultTitle=windid;
- if ((sc=(struct Screen *)OpenScreen(&ns))==0) {cnoprint("screen");goto fin;}
- nw.Screen=sc;
- if ((wi=(struct Window *)OpenWindow(&nw))==0) {cnoprint("window");goto fin;}
-
- if ((scrbuf=AllocMem(XXX*8,0x3))==0)
- {print("Could not alloc CharBuf\n");goto fin;}
- if ((charbuf=AllocMem(8*256,0x1))==0)
- {print("Could not alloc CharBuf\n");goto fin;}
-
- font=wi->RPort->Font;
- for (x=0;x<256;x++)
- {
- y=x;c=0;
- if (x<32||(x>=128&&x<128+32)) {y+=64;c=255;}
- if (y<font->tf_LoChar||y>font->tf_HiChar) y=font->tf_HiChar-font->tf_LoChar+1;
- y-=font->tf_LoChar;
- for (z=0;z<8;z++)
- {
- charbuf[8*x+z]=(*((UBYTE *)font->tf_CharData+(*(UWORD *)((UBYTE *)font->tf_CharLoc+y*4)>>3)+font->tf_Modulo*z))^c;
- }
- }
-
- bpl0=wi->RPort->BitMap->Planes[0]+VOFF*XXX;
-
- if ((monp.mp_SigBit=AllocSignal(-1))==-1) {eprint(cnas,"1");goto fin;}
- monp.mp_SigTask=(struct Task *)proc;
- if ((crqp.mp_SigBit=AllocSignal(-1))==-1) {eprint(cnas,"2");goto fin;}
- crqp.mp_SigTask=(struct Task *)proc;
-
- trq.io_Message.mn_ReplyPort=rq.io_Message.mn_ReplyPort=irq.io_Message.mn_ReplyPort=&monp;
- crq.io_Message.mn_ReplyPort=&crqp;
- trq.io_Message.mn_Node.ln_Type=crq.io_Message.mn_Node.ln_Type=rq.io_Message.mn_Node.ln_Type=irq.io_Message.mn_Node.ln_Type=NT_MESSAGE;
-
- rq.io_Data=(APTR)wi;
- rq.io_Length=sizeof(struct Window);
-
- if (OpenDevice(conname,0,(struct IORequest *)&rq,0)) {cnoprint(conname);goto fin;}
- crq.io_Device=rq.io_Device;crq.io_Unit=rq.io_Unit;
- for (x= -XXX;x<7*XXX;x+=XXX) *(bpl0+x)=0; /* Clear Cursor */
- for (x=0;x<XXX;x++) bpl0[(YYY*8+1)*XXX+x]=255; /* Draw Line */
-
- if (OpenDevice(inpname,0,(struct IORequest *)&irq,0)) {cnoprint(inpname);goto fin;}
-
- owi=proc->pr_WindowPtr;
- proc->pr_WindowPtr=(APTR)wi;
- ssize=((struct CommandLineInterface *)BADDR(proc->pr_CLI))->cli_DefaultStack << 2;
- if (ssize<1600) ssize=1600;
-
- irq.io_Data=(APTR)&hands;
- irq.io_Command=IND_ADDHANDLER;
- hands.is_Node.ln_Type=NT_INTERRUPT;
- hands.is_Node.ln_Pri=60;
- hands.is_Node.ln_Name=fmonid;
- hands.is_Code=handler;
- DoIO((struct IORequest *)&irq);
-
- regclear();wri(12);
- if (inidev(dnl[0])) pril("Warning: no device selected");
- bf=0;
- for(;;)
- {
- if (bf==0) wri('.');
- else if (bf!=-1) {ofhwric();put(13);cx=0;wri('.');wri(bf);put(8);cx--;}
- bf=0;
- if ((c=inputline())==0) hwric();
- else if (c=='x')
- {
- if (gcla()) serr(); else break;
- }
- else switch (c)
- {
- case ('p'):
- c=gcla();hwric();
- if (c=='t')
- {
- if (ofh==0) {pril("No output enabled");break;}
- sp=0;adds("\033[1m\033[6w");adds(cl+ps);adds("\033[5w\033[22m\n");
- putofh();break;
- }
- if (ofh) {Close(ofh);ofh=0;}
- if (c=='e')
- {
- if ((ofh=Open("prt:",MODE_NEWFILE))==0) {cnopen("printer");break;}
- wri('O');wri('n');hwric();
- }
- else pril("Off");
- break;
- case ('o'):
- if ((c=gcl())=='+') ps++;
- nam=getnam2();if (gcla()) ERROR;
- if (ofh) {Close(ofh);ofh=0;}
- hwric();
- if (nam)
- {
- if ((ofh=Open(nam,(c=='+')?MODE_READWRITE:MODE_NEWFILE))==0) {cnopen(file);break;}
- if (c=='+') Seek(ofh,0,OFFSET_END);
- }
- wri('O');wri('K');hwric();
- break;
- case ('h'):
- c=gcla();
- if (c=='j')
- {
- y=hj;
- for(;;)
- {
- while ((c=gcla())==' ');
- if (c==0) break;
- if (c=='\"')
- {
- if ((x=gcla())==0) {serr();goto hj1;};
- if (gcla()!='\"') {serr();goto hj1;}
- }
- else
- {
- ps--;x=(LONG)getadr();
- if (x<0||x>255) {serr();goto hj1;}
- }
- if (hj!=x) y=x;
- }
- hwric();hj=y;
- sp=0;adds(".hj ");
- if ((hj&127)>31) {app('\"');app(hj);adds("\" ");}
- addbx(hj);wrilc();
- hj1: break;
- }
- if (c=='u'||c=='l')
- {
- if (gcla()) ERROR;
- hwric();huc=c^'l';
- if (huc) pril("UC==lc"); else pril("UC!=lc");
- break;
- }
- y=0;
- if (c=='r') z=2;
- else for (ps--,z=0;;)
- {
- c=gcl();
- if (c=='c'&&y==0) {ps++;y=-1;}
- else if (c=='e'&&z==0) {ps++;z=1;}
- else break;
- }
- if ((LONG)(sta=getadr())<0) ERROR;
- if ((LONG)(ena=getadr())<0) ERROR;
- if (z==2)
- {
- if ((LONG)(zad=getadr())<0) ERROR;
- hwric();sp=0;adds("hunting relative for $");addax((ULONG)zad);wrilc();
- if ((LONG)sta<(LONG)zad-32768) sta=zad-32768;
- if ((LONG)ena>(LONG)zad+32767) ena=zad+32767;
- }
- else
- {
- x=getbytes(cl);
- c=gcla();if (x==0) ERROR;
- zad=0;
- if (y)
- {
- if (c==0) ERROR;
- zad=cl+x;y=getbytes(zad);c=gcla();if (x!=y) ERROR;
- }
- if (c) ERROR;
- hwric();sp=0;shhunt(x);
- }
- hunt(sta,ena+1,cl,x,z,zad);
- break;
- case ('a'):
- if ((LONG)(sta=geteadr())<0) ERROR;
- if (gcl()==0) {hwric();break;}
- for (y=0;cl[y];y++);
- while (--y>10)
- {
- c=cl[y];
- if (c>='0'&&c<='9') continue;
- if (c>='a'&&c<='f') continue;
- if (c==' ')
- {
- if (cl[y-1]!=' ') continue;
- while (cl[y]==' ') y--;
- cl[y+1]=0;
- }
- break;
- }
- a=10;if (gcl()==':')
- {
- a=37;
- for (y=ps;cl[y];y++)
- {
- if (cl[y-1]==' '&&cl[y]==' ')
- {
- while ((c=cl[y])==' ') y++;
- if (c) ps=y;
- break;
- }
- }
- }
- if ((x=assem(sta))==0) ERROR;
- clearl();for (y=0;y<XXX&&(c=cl[y]);y++) st[y]=c;
- z=XXX-1-5*(x/2);cx=0;put(13);if (y>z-1) {sp=y;wrilc();insertl();clearl();}
- sp=z;for (y=0;y<x;y+=2) {sp++;addwx(*(UWORD *)(sta+y));}
- sta+=x;wrilc();
- sp=0;adds(".a ");addax((ULONG)sta);hwril();cx=a;pos();bf=-1;
- break;
- case ('#'):
- if ((nam=getdevnam())==0) ERROR;
- hwric();
- x=bsize;
- if (inidev(nam)) break;
- if (abuf!=0)
- if (x!=bsize||(typeofmem(abuf)&memtyp)!=memtyp)
- {
- if (abuf=bbuf) bbuf=0;
- FreeMem(abuf,x);abuf=0;
- }
- proc->pr_WindowPtr=(APTR)-1;
- if (setcd(nam)) pril("Warning: Could not set CD");
- proc->pr_WindowPtr=(APTR)wi;
- break;
- case ('b'):
- if ((LONG)(sta=geteadr())<0) ERROR;
- if (gcla()) ERROR;
- hwric();sp=0;adds(sold);addlx(((ULONG *)sta)[1]);
- adds(snow);addlx(((ULONG *)sta)[1]=bochk(sta));
- wrilc();break;
- case ('>'):
- case ('<'):
- c=(c=='<')?CMD_READ:CMD_WRITE;
- switch (gcla())
- {
- case ('c'):
- if (gcla()) ERROR;
- hwric();
- trackbl(0,0,CMD_CLEAR);
- break;
- case ('s'):
- if ((LONG)(sta=geteadr())<0) ERROR;
- if (frmval(&a)==-1) ERROR;
- if (a<0) ERROR;
- if (frmval(&b)==-1) ERROR;
- if (b<0||b>=heads) ERROR;
- if (frmval(&e)==-1) ERROR;
- if (e<0||e>=bptrack) ERROR;
- xx=1;
- if (gcl())
- {
- if (frmval3(&xx)) ERROR;
- if (xx<0) ERROR;
- }
- e+=a*bpcyl+b*bptrack;hwric();
- if (xx) etrackbl(e,sta,c,1,xx);
- break;
- case ('t'):
- if ((LONG)(sta=geteadr())<0) ERROR;
- if ((x=frmval(&a))==-1) ERROR;
- if (a<0) ERROR;
- if (x)
- {
- if (frmval3(&b)) ERROR;
- if (b<0) ERROR;
- }
- else b=a;
- hwric();
- x=(b-a+1)*bptrack;if (x<=0) break;
- etrackbl(a*bptrack,sta,c,1,x);
- break;
- case('r'):
- if ((LONG)(sta=geteadr())<0) ERROR;
- if ((x=(LONG)getadr())<=0) ERROR;
- if (frmval3(&a)) ERROR;
- if (a<0) ERROR;
- hwric();
- if (notd) {pril(snotd);break;}
- if (x>0x7fff) {pril("Length must be <= $7fff");break;}
- etrackbl(a*11,sta,TD_RAW,0x7f^((a&1)<<2)^(8<<unit)^((c==CMD_WRITE)?256:0),x);
- break;
- case('f'):
- if (c==CMD_READ) ERROR;
- if ((LONG)(sta=geteadr())<0) ERROR;
- if ((x=frmval(&a))==-1) ERROR;
- if (a<0) ERROR;
- if (x)
- {
- if (frmval3(&b)) ERROR;
- if (b<0) ERROR;
- }
- else b=a;
- hwric();
- x=(b-a+1)*bptrack;if (x<=0) break;
- etrackbl(a*bptrack,sta,TD_FORMAT,bptrack,x);
- break;
- case('i'):
- if (x=gcl()) {if ((LONG)(sta=geteadr())<0) ERROR;}
- hwric();if (notd) {pril(snotd);break;}
- if (x==0)
- {
- if ((sta=AllocMem(1024,0x10000|memtyp))==0) {pril(nomembuf);break;}
- for(y=0;y<50;y++) sta[y]=bootbl[y];
- }
- if (c==CMD_WRITE) {*(ULONG *)sta=0x444f5300;*(ULONG *)(sta+4)=bochk(sta);}
- if (etrackbl(0,sta,c,1,2)==0) if (c==CMD_READ)
- {
- if (*(ULONG *)sta!=0x444f5300||*(ULONG*)(sta+4)!=bochk(sta)) pril("Not a valid bootblock");
- else
- {
- for (y=12;y<50;y++) if (sta[y]!=bootbl[y]) break;
- if (y==50) pril("Standard bootblock");
- else pril("Unknown bootblock");
- }
- if (x==0) for(y=((1024%(XXX-1)<12)?1024%(XXX-1):0);y<1024;y+=XXX-1) {sp=0;dumpasc(sta+y,(1024-y<XXX-1)?1024-y:XXX-1);wric();}
- }
- if (x==0) FreeMem(sta,1024);
- break;
- case('h'):
- if (c==CMD_WRITE) ERROR;
- a=lowbl;b=highbl;
- anz=getbytes(cl);
- if (gcla())
- {
- if ((x=frmval(&a))==-1) ERROR;
- if (a<0) ERROR;
- a*=bptrack;
- if (x)
- {
- if (frmval3(&b)) ERROR;
- if (b<0) ERROR;
- b=(b+1)*bptrack;
- }
- }
- hwric();
- if (anz==0) pril("Checking disk");
- else
- {
- sp=0;adds("disk ");shhunt(anz);
- }
- b=b-a;if (b<=0) break;
- if ((sta=AllocMem(bptrack*bsize,0x10000|memtyp))==0) {pril(nomembuf);break;}
- etrackbl(a,sta,TD_HUNT,bptrack,b);
- FreeMem(sta,bptrack*bsize);
- break;
- default: serr();
- }
- break;
- case (':'):
- c=gcla();
- if (c=='d')
- {
- c=gcla();
- if (c=='i') x= -1;
- else if (c=='f') x=0;
- else ERROR;
- if ((nam=getdevnam())==0) ERROR;
- hwric();
- if ((dl=finddev(nam))==0) break;
- if (dopkt(dl->dl_Task,31,x)) pril("Action failed"); else pril("OK");
- break;
- }
- if (c=='r')
- {
- if (gcl())
- {
- if (frmval3(&xx)) ERROR;
- }
- else xx=root;
- hwric();
- if (bbuf==0)
- {
- if (abuf==0)
- {
- if ((abuf=bbuf=AllocMem(bsize,memtyp))==0) {pril(nomembuf);break;}
- }
- else bbuf=abuf;
- sp=0;adds("Allocated buffer at $");addax((ULONG)bbuf);wrilc();
- }
- if (trackbl(xx+lowbl,bbuf,CMD_READ)==0) {cbl=xx;binfo();}
- break;
- }
- if (c=='b')
- {
- if (gcl())
- {
- if ((LONG)(sta=geteadr())<0) ERROR;
- if (gcla()) ERROR;
- hwric();
- if (sta) if ((typeofmem(sta)&memtyp)!=memtyp) {pril("Wrong memory type");break;}
- bbuf=sta;
- }
- else
- {
- hwric();sp=0;
- if (bbuf) {adds("Buffer is at $");addax((ULONG)bbuf);} else adds(nobuf);
- wrilc();break;
- }
- break;
- }
- if (c=='h')
- {
- if ((nam=getnam())==0) ERROR;
- hwric();x=hash(nam);
- sp=0;adds("Hash value: ");addd(x);
- if (bbuf) {adds(" - Block:");addd(((ULONG *)bbuf)[x]);}
- wrilc();
- break;
- }
- switch (c)
- {
- case ('w'):
- if (frmval3(&xx)) ERROR;
- hwric();
- if (bbuf==0) {pril(nobuf);break;}
- trackbl(xx+lowbl,bbuf,CMD_WRITE);
- break;
- case ('i'):
- hwric();
- if (bbuf==0) {pril(nobuf);break;}
- binfo();
- break;
- case ('c'):
- hwric();
- if (bbuf==0) {pril(nobuf);break;}
- sp=0;adds(sold);addlx(((ULONG *)bbuf)[5]);
- adds(snow);addlx(((ULONG *)bbuf)[5]=blchk());
- wrilc();break;
- case ('m'):
- if (bbuf==0) {hwric();pril(nobuf);break;}
- xx=0;if (x=gcl()) {if ((x=frmval(&xx))<0) ERROR;}
- if (xx<0||xx>=bsize4) ERROR;
- sta=bbuf+4*xx;
- xx=bsize4-1;if (x) {if (frmval3(&xx)) ERROR;}
- if (xx<0||xx>=bsize4) ERROR;
- ena=bbuf+4*xx;
- goto m1;
- case ('f'):
- hwric();
- if (bbuf==0) {pril(nobuf);break;}
- if (*(ULONG *)bbuf!=8 && *(ULONG *)(bbuf+bsize-4)!=-3) {pril("Wrong block type");break;}
- x=((ULONG *)bbuf)[4];
- if (trackbl(x+lowbl,bbuf,CMD_READ)==0) {cbl=x;binfo();}
- break;
- default:
- serr();
- }
- break;
- case ('g'):
- if ((LONG)(sta=geteadr())<0) ERROR;
- if (gcla()) ERROR;
- hwric();
- if (regs[15]&1) {pril(oddsp);break;}
- regs[16]=(ULONG)sta;
- jump(1);
- if (trpv<0) goto on2;
- gottrap();
- break;
- case ('O'):
- if (gcl())
- {
- if ((LONG)(sta=geteadr())<0) ERROR;
- if (gcla()) ERROR;
- regs[16]=(ULONG)sta;
- }
- hwric();
- on1: for(;;)
- {
- sta=(UBYTE *)regs[16];
- sta+=disass(sta);
- while (qual&SHIFT);
- while ((qual&(CONT|SHIFT|CAPS))==0)
- {
- state=2;c=get();state=0;
- if (c=='r') {wric();showregs();goto on1;}
- if (c=='y') {wric();showsr();goto on1;}
- if (c=='j') {wric();goto e1;}
- if (c=='s') {wric();regs[16]=(ULONG)sta;goto on1;}
- if (c=='x')
- {
- wric();
- if (regs[15]&1) {pril(oddsp);goto on1;}
- x=*(ULONG *)regs[15];if (x&1||(ULONG)x>=0x1000000) {pril("Not a valid address");goto on1;}
- sta=(char *)x;goto e1;
- }
- }
- wric();
- if (qual&CONT) break;
- jump(2);
- if (trpv>=0) {gottrap();break;}
- }
- break;
- case ('E'):
- c=gcl();
- if (c=='s'||c=='f')
- {
- ps++;if (gcla()) ERROR;
- em=(c=='s');hwric();
- pril(em?"Slow mode":"Fast mode");
- break;
- }
- if (c)
- {
- if ((LONG)(sta=geteadr())<0) ERROR;
- c=gcla();
- if (c) if (c!=':') ERROR;
- }
- else sta=0;
- hwric();
- e1: if (em==0)
- {
- if (sta)
- {
- y=*(UWORD *)sta;*(UWORD *)sta=0x4e4f;x=(ULONG)sta;
- if (*(UWORD *)x!=0x4e4f) {pril("Warning: switched to slow");em=1;goto e1;}
- if (regs[16]==(ULONG)sta)
- {
- *(UWORD *)sta=y;jump(2);*(UWORD *)sta=0x4e4f;
- if (trpv>=0) {gottrap();break;}
- }
- jump(0);*(UWORD *)sta=y;
- if (trpv==47) if ((regs[16]-=2)==(ULONG)sta) trpv=-1;
- }
- else jump(0);
- }
- else {x=9;jumpe(sta);}
- if (trpv>=0) {gottrap();break;}
- on2: while(qual&CONT);
- goto on1;
- case ('y'):
- hwric();showsr();
- break;
- case ('r'):
- c=gcl();
- if (c=='c')
- {
- ps++;if (gcla()) ERROR;
- regclear();
- c=0;
- }
- else if (c=='i')
- {
- ps++;
- while (gcl()==' ') ps++;
- reginit();
- copypara(cl+ps);
- c=0;
- }
- if (c==0) {hwric();showregs();break;}
- while((c=gcla())==' ');
- for(;;)
- {
- if (c==0) {hwric();break;}
- if (c=='_') c=gcla();
- for (x=0;x<20;x++) if (c==rl1[x]) {c1=gcla();break;}
- for (;x<20;x++) if (c==rl1[x]&&c1==rl2[x]) break;
- if (x==20) ERROR;
- if (gcl()=='=') ps++;
- if ((BYTE)(c=frmval2(&xx,'$'))<0) ERROR;
- if (x==16) if (xx&1) {ps--;ERROR;}
- regs[x]=xx;
- }
- break;
- case ('d'):
- if ((LONG)(dsta=geteadr())<0) ERROR;
- if (gcl()=='#') dena=(UBYTE *)0x7fffffff; else dena=getadr();
- if ((LONG)dena>=0) hwric();
- dcont:sta=dsta;bf='d';
- if ((LONG)dena<0) wri(12);
- for (;;)
- {
- if ((LONG)dena>=0) if (sta>dena) {bf=0;break;}
- x=disass((UWORD *)sta);
- if (chq()) break;
- if ((LONG)dena<0) if (cy==YYY-1) break;
- wric();
- sta+=x;
- }
- if (dena==(UBYTE *)0x7fffffff)
- {
- put(13);cx=0;sp=0;adds(".d ");addax((ULONG)sta);app('#');hwril();put(8);cx--;bf=-1;
- }
- break;
- case ('m'):
- if ((LONG)(sta=getadr())<0) ERROR;
- ena=getadr();
- m1: hwric();
- while(sta<=ena||(LONG)ena<0)
- {
- dumpmem(sta);sta+=16;
- if (chq()) {bf='m';break;}
- wric();
- }
- break;
- case ('M'):
- if ((LONG)(sta=getadr())<0) ERROR;
- ena=getadr();
- hwric();
- while(sta<=ena||(LONG)ena<0)
- {
- sp=0;adds("./ ");addax((ULONG)sta);app(':');app(' ');
- dumpasc(sta,64);sta+=64;
- if (chq()) {bf='M';break;}
- wric();
- }
- break;
- case ('v'):
- if ((LONG)(sta=getadr())<0) ERROR;
- if ((LONG)(ena=getadr())<0) ERROR;
- if ((LONG)(zad=getadr())<0) ERROR;
- hwric();verify(sta,ena,zad);
- break;
- case ('f'):
- if ((LONG)(sta=getadr())<0) ERROR;
- if ((LONG)(ena=getadr())<0) ERROR;
- x=getbytes(cl);if (gcla()) ERROR;
- if (x==0) ERROR;
- hwric();
- y=(ena-sta)+1;if (y>0) {fill(sta,y,cl,x-1);pril("OK");}
- break;
- case ('['):
- if (gcl()==0)
- {
- hwric();
- Forbid();
- mh=(struct MemHeader *)(*(struct ExecBase **)4L)->MemList.lh_Head;
- for (x=y=0;mh->mh_Node.ln_Succ;mh=(struct MemHeader *)mh->mh_Node.ln_Succ)
- {
- if (mh->mh_Attributes&MEMF_CHIP) x+=(ULONG)mh->mh_Upper-(ULONG)mh->mh_Lower;
- if (mh->mh_Attributes&MEMF_FAST) y+=(ULONG)mh->mh_Upper-(ULONG)mh->mh_Lower;
- }
- a=AvailMem(MEMF_CHIP);b=AvailMem(MEMF_CHIP|MEMF_LARGEST);
- e=AvailMem(MEMF_FAST);f=AvailMem(MEMF_FAST|MEMF_LARGEST);
- Permit();
- pril("Type Available In-Use Maximum Largest");
- clearl();adds("Chip: ");addd(a);sp=15;addd(x-a);sp=24;addd(x);sp=33;addd(b);wrilc();
- clearl();adds("Fast: ");addd(e);sp=15;addd(y-e);sp=24;addd(y);sp=33;addd(f);wrilc();
- clearl();adds("Total ");addd(a+e);sp=15;addd(x+y-a-e);sp=24;addd(x+y);sp=33;addd((b>f)?b:f);wrilc();
- break;
- }
- else if (gcl()=='a')
- {
- ps++;if ((LONG)(sta=getadr())<0) ERROR;
- if ((LONG)(ena=getadr())<0) ERROR;
- if ((LONG)(ena-=(LONG)sta-1)<=0) ERROR;
- if (Allocabs((long)ena,sta)==0) sta=0;
- }
- else
- {
- if ((LONG)(ena=getadr())<=0) ERROR;
- if ((x=(LONG)getadr())<0) x=1;
- sta=AllocMem((long)ena,x);
- }
- hwric();
- if (sta==0) {pril("Could not allocate memory");break;}
- sp=0;adds("Allocated $");addax((ULONG)ena);adds(" bytes at $");addax((ULONG)sta);
- wrilc();
- break;
- case (']'):
- if ((c=gcl())=='a') ps++;
- if ((LONG)(sta=getadr())<0) ERROR;
- if ((x=(LONG)getadr())<0) ERROR;
- if (c=='a') x-=(ULONG)sta-1;
- if (x<=0) ERROR;
- if (gcla()) ERROR;
- hwric();
- if (freemem(sta,x)) pril("!!! Some is already free !!!");
- break;
- case ('c'):
- if ((LONG)(sta=getadr())<0) ERROR;
- if ((LONG)(ena=getadr())<0) ERROR;
- while((c=gcla())==' ');
- if (c!='a'&&c!='e') ERROR;
- if (gcla()!=' ') ERROR;
- if ((LONG)(zad=getadr())<0) ERROR;
- if (c=='e') zad-=ena-sta;
- while((c=gcla())==' ');
- xx=0;if (c)
- {
- if (c!='{'&&c!='}') ERROR;
- if (frmval3(&xx)) ERROR;
- if (xx<0||xx>7) ERROR;
- if (c=='{') xx= -xx;
- }
- hwric();if (sta>ena) break;
- sp=0;app('$');addax((ULONG)zad);app(' ');app('$');addax((ULONG)(zad+(ena-sta)));
- copy(sta,ena+1,zad,xx);
- wrilc();
- break;
- case (','):
- if ((LONG)(sta=geteadr())<0) ERROR;
- ps++;if (changemem(sta)<0) ERROR;
- if (dena!=(UBYTE *)-1)
- {
- cx=0;put(13);erasedisp();
- dsta=sta;
- }
- if (dsta!=(UBYTE *)-1) goto dcont;
- hwric();
- break;
- case ('&'):
- if ((LONG)(sta=getadr())<0) ERROR;
- if (gcl()==':') ps++;
- if ((x=changemem(sta))<0) ERROR;
- if (x==16) {put(13);cx=0;dumpmem(sta);wric();}
- else hwric();
- sp=0;adds(".& ");addax((ULONG)sta+x);adds(": ");hwril();bf=-1;
- break;
- case ('/'):
- if ((LONG)(sta=getadr())<0) ERROR;
- hwric();
- ena=sta;
- if (gcl()==':') ps++;
- if (gcl()==' ') ps++;
- while (c=gcla())
- {
- if (c=='.') {sta++;continue;}
- *sta++=c;
- }
- while(sta-ena<64) *sta++=' ';
- sp=0;adds("./ ");addax((ULONG)sta);adds(": ");hwril();bf=-1;
- break;
- case ('?'):
- if ((c=gcl())=='%') ps++;
- if (frmval3(&xx)) ERROR;
- hwric();st[0]='$';sp=1;addlx(xx);adds(" = ");
- if (c=='%') {app('%');addlb(xx);} else addd(xx);
- wrilc();
- break;
- case ('@'):
- c=gcla();
- if (c==0)
- {
- hwric();
- pril("Unit Size Used Free Full Errs Status Name");
- dl=(struct DeviceList *)BADDR(((struct DosInfo *)BADDR(((struct RootNode *)DOSBase->dl_Root)->rn_Info))->di_DevInfo);
- for (;dl;dl=(struct DeviceList *)BADDR(dl->dl_Next))
- {
- if (dl->dl_Type!=DLT_DEVICE) continue;
- if (dopkt(dl->dl_Task,25,(ULONG)&infd>>2)) continue;
- clearl();
- addbname((long)dl->dl_Name);
- app(':');sp=5;
- switch (infd.id_DiskType)
- {
- case(ID_NO_DISK_PRESENT):adds("No disk present");break;
- case(ID_UNREADABLE_DISK):adds("Unreadable disk");break;
- case(ID_KICKSTART_DISK):adds("Kickstart disk");break;
- case('B'<<24|'U'<<16|'S'<<8|'Y'):adds("Inhibited");break;
- case(ID_DOS_DISK):
- x=infd.id_NumBlocks;
- y=(x*infd.id_BytesPerBlock)>>10;
- if (y>1023) {addd(y>>10);app('M');}
- else {addd(y);app('K');}
- sp=31;addd(infd.id_NumSoftErrors);
- sp=35;y=infd.id_DiskState;
- switch(y)
- {
- case (ID_WRITE_PROTECTED):adds("Read only");break;
- case (ID_VALIDATING):adds("Validating");break;
- case (ID_VALIDATED):adds("Read/Write");break;
- }
- if (y!=ID_VALIDATING)
- {
- y=infd.id_NumBlocksUsed;
- sp=11;addd(y);
- sp=18;addd(x-y);
- sp=25;addd(y*100/x);app('%');
- }
- sp=46;y=infd.id_VolumeNode;
- if (y) addbname((long)((struct DeviceList *)BADDR(y))->dl_Name);
- break;
- default:adds("Not a DOS disk");break;
- }
- wril();if (chqc()) break;
- }
- }
- else if (c=='$')
- {
- nam=getnam2();if (gcla()) ERROR;
- hwric();
- if ((lo=Lock(nam,ACCESS_READ))==0) {pril("Not found");break;}
- if (Examine(lo,&fib)==0) {pril("Could not examine");goto einf1;}
- if (fib.fib_DirEntryType<0) {shi();wric();goto einf1;}
- sp=0;adds("Directory \"");addsc(fib.fib_FileName);
- adds("\" on ");DateStamp((void *)&fib.fib_Date);
- adds(dayn[(ULONG)fib.fib_Date.ds_Days%7]);adds("day ");adddt(&fib.fib_Date);wrilc();
- for(;;)
- {
- if (ExNext(lo,&fib)==0)
- {
- if (IoErr()!=ERROR_NO_MORE_ENTRIES) pril("Error while ExNext");
- break;
- }
- shi();
- if (chqc()) break;
- }
- einf1: UnLock(lo);
- }
- else if (c==':')
- {
- if (gcl()==0)
- {
- hwric();sp=0;adds("Current dir is \'");
- addbname(((struct CommandLineInterface *)BADDR(proc->pr_CLI))->cli_SetName);
- app('\'');wrilc();break;
- }
- if ((nam=getnam())==0) ERROR;
- if (gcla()) ERROR;
- hwric();
- if (setcd(nam)) pril("Not found");
- }
- else
- {
- ps--;if ((nam=getnam())==0) ERROR;
- hwric();if ((xx=loadseg(nam))==0) break;
- proc->pr_WindowPtr=(APTR)0;
- x=exe(xx,nam,cl+ps);
- proc->pr_WindowPtr=(APTR)wi;
- UnLoadSeg(xx);
- if (x) {sp=0;adds("Error #");addd(x);wrilc();}
- }
- break;
- case ('e'):
- c=gcla();
- if (c=='s')
- {
- if (gcl())
- {
- if (frmval3(&xx)) ERROR;
- if (xx<0||(xx&3)!=0) ERROR;
- if (xx<1600) {hwric();pril("Minimum is 1600 bytes");break;}
- if (stack) FreeMem(stack,ssize);
- ssize=xx;stack=0;regs[15]=0;
- }
- hwric();sp=0;adds("Stack size: ");addd(ssize);adds(" bytes");wrilc();
- break;
- }
- if (c=='b'||c=='w'||c=='l')
- {
- if ((LONG)(sta=getadr())<0) ERROR;
- if (c!='b') if ((LONG)sta&1) ERROR;
- if (gcl())
- {
- if (gcl()==':') ps++;
- if (frmval2(&xx,'$')) ERROR;
- x=xx;
- if (c=='b')
- {
- if (x>255||x<-128) ERROR;
- *(UBYTE *)sta=(UBYTE)x;
- }
- else if (c=='w')
- {
- if (x>65535||x<-32768) ERROR;
- *(UWORD *)sta=(UWORD)x;
- }
- else *(ULONG *)sta=(ULONG)x;
- hwric();
- break;
- }
- hwric();sp=0;app('.');app('e');app(c);
- adds(" ($");addax((ULONG)sta);adds("): $");
- if (c=='b') addbx(*(UBYTE *)sta);
- else if (c=='w') addwx(*(UWORD *)sta);
- else addlx(*(ULONG *)sta);
- wrilc();
- break;
- }
- if (c=='r')
- {
- if (gcl()==0)
- {
- x=rpar;hwric();
- for (y=0;y<7;y++)
- {
- clearl();adds(".er ");adds(rps[y]);sp=19;
- if (y==0) addd(rpc[x>>13&3]);
- else if (y==3) {app('$');addwx(rsyn);}
- else app((char)('0'+(x>>rpsh[y]&1)));
- wrilc();
- }
- break;
- }
- while((c=gcla())==' ');
- if (gcl()=='-') while (x=gcl()) {ps++;if (x==':') break;}
- switch(c-='1')
- {
- case (0):
- if (frmval3(&xx)) ERROR;
- for (x=0;x<4;x++) if (rpc[x]==xx) break;
- if (x==4) ERROR;
- rpar=(rpar&0x9fff)|(x<<13);hwric();
- break;
- case (1):
- case (2):
- case (4):
- case (5):
- case (6):
- x=1<<rpsh[c];y=rpar|x;
- while ((c=gcla())==' ');
- if (c=='0') y^=x;
- else if (c!='1') ERROR;
- if (gcla()) ERROR;
- rpar=y;hwric();
- break;
- case (3):
- if (frmval2(&xx,'$')) ERROR;
- if (xx<0||xx>65535) ERROR;
- rsyn=xx;hwric();
- break;
- default:
- serr();
- }
- break;
- }
- ps--;
- if ((LONG)(sta=getadr())<0) ERROR;
- x=getbytes(cl);if (gcla()) ERROR;
- hwric();if (x==0) break;
- for (y=0;y<x;y++) *sta++=cl[y];
- sp=0;adds(".e ");addax((ULONG)sta);app(' ');wril();bf=-1;
- break;
- case ('l'):
- if (gcl()=='s')
- {
- ps++;if ((nam=getnam())==0) ERROR;
- if (gcla()) ERROR;
- hwric();
- if ((xx=loadseg(nam))==0) break;
- sp=0;adds("Segment: $");addax((ULONG)BADDR(xx));wrilc();
- break;
- }
- for (x=0;;)
- {
- if (gcl()=='i'&&(x&4)==0) {ps++;x|=4;}
- else if (gcl()=='y'&&(x&2)==0) {ps++;x|=2;}
- else if (gcl()=='b'&&(x&1)==0) {ps++;x|=1;}
- else break;
- }
- if ((nam=getnam())==0) ERROR;
- if ((LONG)(sta=getadr())<0) ERROR;
- if (gcl())
- {
- if ((LONG)(zad=getadr())<0) ERROR;
- }
- else zad=sta;
- if (gcla()) ERROR;
- hwric();
- if (x&1) {if ((ULONG)sta&3) {pril("Bad address");break;}}
- load(nam,sta,x,zad-sta);
- break;
- case ('L'):
- if ((nam=getnam())==0) ERROR;
- if ((LONG)(sta=getadr())<0) ERROR;
- if (gcla()) ERROR;
- hwric();
- if ((fh=Open(nam,MODE_OLDFILE))==0) {pril("File not found");break;}
- st[0]='$';sp=1;addax((ULONG)sta);adds(" - $");
- while ((x=Read(fh,sta,0x1000000))>0) sta+=x;
- if (x<0) pril("Error while loading"); else {addax((ULONG)(sta-1));wrilc();}
- Close(fh);
- break;
- case ('u'):
- if (gcla()!='s') ERROR;
- if ((x=(LONG)getadr())<0) ERROR;
- if (gcla()) ERROR;
- hwric();if (x&3) {pril(snoseg);break;}
- UnLoadSeg(x>>2);
- break;
- case ('S'):
- if ((c=gcl())=='+') ps++;
- if ((nam=getnam())==0) ERROR;
- if ((LONG)(sta=getadr())<0) ERROR;
- if ((LONG)(ena=getadr())<0) ERROR;
- if (gcla()) ERROR;
- hwric();
- if ((fh=Open(nam,(c=='+')?MODE_READWRITE:MODE_NEWFILE))==0) {cnopen(file);break;}
- if (c=='+') Seek(fh,0,OFFSET_END);
- if (writebytes(fh,sta,ena-sta+1)) pril("Error while writing");
- Close(fh);
- break;
- case ('s'):
- if ((nam=getnam())==0) ERROR;
- if ((LONG)(sta=getadr())<0) ERROR;
- if ((LONG)(ena=getadr())<0) ERROR;
- zad=0;if (gcl()) if ((LONG)(zad=getadr())<0) ERROR;
- if (gcla()) ERROR;
- hwric();x=ena-sta;
- if (x<0) break;
- sav(nam,sta,x+1,zad);
- break;
- case ('t'):
- switch (gcla())
- {
- case ('l'):
- c=gcl();sta=0;
- if (c==0 || ps[cl+1]==0)
- switch(c)
- {
- case( 0 ): sta=(char *)&(*(struct ExecBase **)4L)->LibList;break;
- case('r'): sta=(char *)&(*(struct ExecBase **)4L)->ResourceList;break;
- case('d'): sta=(char *)&(*(struct ExecBase **)4L)->DeviceList;break;
- case('p'): sta=(char *)&(*(struct ExecBase **)4L)->PortList;break;
- case('i'): sta=(char *)&(*(struct ExecBase **)4L)->IntrList;break;
- case('y'): sta=(char *)&(*(struct ExecBase **)4L)->TaskReady;break;
- case('t'): sta=(char *)&(*(struct ExecBase **)4L)->TaskWait;break;
- }
- if (sta==0) if ((LONG)(sta=geteadr())<0) ERROR;
- hwric();pril("Node Type Pri Name");
- for (ln= *(struct Node **)sta;;ln=ln->ln_Succ)
- {
- if ((ULONG)ln&1) break;
- if (ln->ln_Succ==0) break;
- clearl();
- app('$');addax((ULONG)ln);app(':');app(' ');
- app('$');addbx(ln->ln_Type);app(' ');
- addd(ln->ln_Pri);
- if (sta=ln->ln_Name) {sp=18;addsc(sta);}
- wril();if (chqc()) break;
- }
- break;
- case ('s'):
- if ((LONG)(sta=getadr())<0) ERROR;
- hwric();if ((ULONG)sta&3) {pril(snoseg);break;}
- pril(iins);
- for (x=1;sta;x++,sta=(UBYTE *)BADDR(*(ULONG *)(sta)))
- {
- clearl();addd(x);sp=4;app('$');addax((ULONG)(sta+4));
- app('-');app('$');y=*(ULONG *)(sta-4);
- addax((ULONG)(sta+y));app(' ');app('$');addax(y);
- wril();if (chqc()) break;
- }
- break;
- case ('b'):
- if ((LONG)(sta=getadr())<0) ERROR;
- hwric();
- while(sta)
- {
- e=(ULONG)BADDR(sta);
- sta=(UBYTE *)*(ULONG *)e;e+=4;
- sp=0;adds("Start: $");addax(e);
- x=e+(ULONG)BADDR(*(ULONG *)e)-4;
- adds(" End: $");addax((ULONG)(x+3));
- adds(" Highest global: (");addd(*(ULONG *)x*4);app(')');
- wrilc();
- for (;;)
- {
- x-=4;a=*(ULONG *)x;if (a==0) break;
- x-=4;b=*(ULONG *)x;
- clearl();st[1]='(';sp=2;addd(b*4);app(')');sp=8;adds("= $");
- addax((ULONG)(e+a));
- wril();if (chqc()) {sta=0;break;}
- }
- }
- break;
- case ('f'):
- if (gcl()==0) nam=":S/STARTUP-SEQUENCE";
- else if ((nam=getnam())==0) ERROR;
- hwric();
- if ((fh=Open(nam,MODE_OLDFILE))==0) {cnopen(file);break;}
- for (sp=x=0;;)
- {
- if (x==0) if ((x=Read(fh,cl,XXX+1))<1) break; else z=0;
- c=cl[z++];x--;
- if (c==9)
- {
- if (sp>=((XXX-1)&~7)) c=10;
- else
- {
- do app(' '); while (sp&7);
- continue;
- }
- }
- if (c==10||sp>XXX-2)
- {
- wril();sp=0;if (chqc()) break;
- }
- if (c!=10) addc(c);
- }
- Close(fh);
- if (sp) wrilc();
- if (x<0) pril("Error while reading");
- break;
- default:serr();
- }
- break;
- default:serr();
- }
- }
-
- irq.io_Command=IND_REMHANDLER;
- DoIO((struct IORequest *)&irq);
-
- proc->pr_WindowPtr=owi;
-
- fin:
- if (ofh) Close(ofh);
- if (irq.io_Device) CloseDevice((struct IORequest *)&irq);
- if (rq.io_Device) CloseDevice((struct IORequest *)&rq);
- if (monp.mp_SigBit!=-1) FreeSignal(monp.mp_SigBit);
- if (crqp.mp_SigBit!=-1) FreeSignal(crqp.mp_SigBit);
- if (stack) FreeMem(stack,ssize);
- if (abuf) FreeMem(abuf,bsize);
- if (charbuf) FreeMem(charbuf,8*256);
- if (scrbuf) FreeMem(scrbuf,XXX*8);
- if (wi) CloseWindow(wi);
- if (sc) CloseScreen(sc);
- if (GfxBase) CloseLibrary((struct Library *)GfxBase);
- if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
- }
-
- void
- gottrap()
- {
- if (trpv==0) return;
- sp=0;adds("Trap #");addd(trpv);adds(" at $");addax(regs[16]);wrilc();
- }
-
-
-
- void
- showregs()
- {
- register x,y;
- sp=0;
- for (x=0;x<20;x++)
- {
- if (sp>51) {wrilc();sp=0;}
- if (sp==0) adds(".r");
- app(' ');app(rl1[x]);app(rl2[x]);
- adds("=$");y=regs[x];
- if (x<17) addlx(y);
- else if (x==17) addwx((UWORD)y);
- else addbx((UBYTE)y);
- }
- if (sp) wrilc();
- }
-
- void
- showsr()
- {
- pril(" t-s--iii---xnzvc");
- sp=0;adds(".r sr=%");addwb((UWORD)regs[17]);
- wrilc();
- }
-
- char fibb[8]={'h','s','p','a','r','w','e','d'};
-
- void
- shi()
- {
- register int x,y;
- clearl();addsc(fib.fib_FileName);sp=31;
- if (fib.fib_EntryType>0) adds("Dir"); else addd(fib.fib_Size);
- sp=40;x=fib.fib_Protection^15;
- for (y=0;y<8;y++,x<<=1) if (x&0x80) app(fibb[y]); else app('-');
- sp=49;adddt(&fib.fib_Date);
- wril();
- }
-
-
- changemem(adr)
- UBYTE *adr;
- {
- register UBYTE f,x,c;
- register int s;
- x=f=s=0;
- for (;;)
- {
- c=gcla();
- if (c>='0'&&c<='9') x=(x<<4)+c-'0';
- else if (c>='a'&&c<='f') x=(x<<4)+c-('a'-10);
- else
- {
- if (f||c!=' ') break; else {f=1;continue;}
- }
- if (f==2) {cl[s++]=x;x=f=0;} else f=2;
- }
- if (f==2||(c!=' '&&c!=0)) return(-1);
- for (x=0;x<s;x++) adr[x]=cl[x];
- return(s);
- }
-
-
-
- ULONG
- loadseg(nam)
- char *nam;
- {
- register ULONG xx;
- if ((xx=LoadSeg(nam))==0)
- if (IoErr()==ERROR_FILE_NOT_OBJECT) pril("Not an object module");
- else pril("File not found");
- return(xx);
- }
-
- void
- binfo()
- {
- register ULONG *bb,ty,st;
-
- binfoh("BLOCK");addd(cbl);wrilc();
- bb=(ULONG *)bbuf;
- ty=bb[0];st=bb[bsize4-1];
- binfoh("Type");
- if (ty==2&&(st==1||st==2||st==-3)) adds("short");
- else if (ty==8) {adds("data");st=0;}
- else if (ty==16&&st==-3) adds("list");
- else {adds("no DOS block");wrilc();return;}
- wrilc();ty+=st;
- if (ty!=3) {binfoh("Header key");addd(bb[1]);wrilc();}
- if (ty==-1||ty==13) {binfoh("Number of blocks");addd(bb[2]);wrilc();}
- if (ty==8) {binfoh("Sequence number");addd(bb[2]);wrilc();}
- if (ty!=3&&ty!=4) {binfoh("Data size");addd(bb[3]);wrilc();}
- if (ty==-1||ty==13) {binfoh("First data block");addd(bb[4]);wrilc();}
- if (ty==8) {binfoh("Next data block");addd(bb[4]);wrilc();}
- binfoh("Checksum");app('$');addlx(bb[5]);
- adds((blchk()==bb[5])?" (correct)":" (wrong)");
- wrilc();if (ty==8) return;
- if (ty==3) {binfoh("Bitmap");adds((bb[bsize4-50])?"valid":"not valid");wrilc();}
- if (ty!=13) {binfoh("Name");addbname4((ULONG)bbuf+bsize-80);wrilc();}
- if (ty==4||ty==-1) {binfoh("Hashchain");addd(bb[bsize4-4]);wrilc();}
- if (ty!=3) {binfoh("Parent");addd(bb[bsize4-3]);wrilc();}
- if (ty==-1||ty==13) {binfoh("Extension");addd(bb[bsize4-2]);wrilc();}
- binfoh("Secondary type");
- if (st==1) adds("root");
- else if (st==2) adds("user dir");
- else adds(file);
- wrilc();
- }
-
-
- void
- shhunt(x)
- int x;
- {
- register int y;
- adds("hunting ");if (huc) adds("(UC==lc) ");
- adds("for: ");
- for (y=0;y<x;y++) {app(' ');addbx(cl[y]);if (sp>XXX-5) {wrilc();sp=0;}}
- if (sp) wrilc();
- }
-
- trackbl(bl,bu,cm)
- int bl;
- char *bu;
- UWORD cm;
- {
- return (etrackbl(bl,bu,cm,1,1));
- }
-
- etrackbl(bl,bu,cm,blstep,blnum)
- int bl;
- char *bu;
- UWORD cm;
- ULONG blstep,blnum;
- {
- register x,y;
- char *bu2;
-
- if (device==0) {pril("No device selected!");return(-1);}
- if (OpenDevice((char *)device,unit,(struct IORequest *)&trq,flags)) {cnopen((char *)device);return(-1);}
- if (cm==CMD_CLEAR) {trq.io_Command=CMD_CLEAR;return(DoIO((struct IORequest *)&trq));}
- trq.io_Command=TD_CHANGESTATE;DoIO((struct IORequest *)&trq);
- if (trq.io_Actual) {pril("No disk in drive");return(-1);}
- if (cm==CMD_WRITE||cm==TD_FORMAT)
- {
- trq.io_Command=TD_PROTSTATUS;DoIO((struct IORequest *)&trq);
- if (trq.io_Actual) {pril("Disk is write-protected!");return(-1);}
- }
- trq.io_Length=(cm==TD_RAW)?blnum:bsize*blstep;
- trq.io_Command=(cm==TD_HUNT)?CMD_READ:cm; /* TD_RAW==TD_SEEK */
- for (;;)
- {
- bu2=bu+trq.io_Length;
- if ((typeofmem(bu)&typeofmem(bu2-1)&memtyp)!=memtyp) {pril("Buffer has wrong memory type or bad location!");x=-1;break;}
- trq.io_Data=(APTR)bu;
- trq.io_Offset=bl*bsize;
- x=DoIO((struct IORequest *)&trq);
- if (cm==TD_RAW)
- {
- if (x==0) x=doraw(blstep,bu,blnum);
- blstep=0;
- }
- if (x==-1) break;
- addblk(bl,blstep==1);
- blnum-=blstep;
- if (cm==TD_HUNT)
- {
- if (x==0)
- {
- hwril();clearcs();put(13);cx=0;
- if (anz) hunt(bu,bu2,cl,anz,-1,bl);
- bl+=blstep;if (chq()||blnum==0) {clearcs();break;}
- continue;
- }
- else bu2=bu;
- }
- adds("Err:");y=sp;addd(x);
- if (bu!=bu2) {sp=y+4;app('$');addax((ULONG)bu);app('-');app('$');addax((ULONG)(bu2-1));}
- if (cm!=TD_FORMAT) bu=bu2;
- wril();
- bl+=blstep;
- if (blnum==0||cm==TD_RAW) {wric();break;}
- if (chqc()) break;
- }
- if (cm==CMD_WRITE)
- {
- trq.io_Command=CMD_UPDATE;x=DoIO((struct IORequest *)&trq);
- if (x!=0) {sp=0;adds("Update error: ");addd(x);wrilc();}
- }
- trq.io_Command=TD_MOTOR;trq.io_Length=0;DoIO((struct IORequest *)&trq);
- CloseDevice((struct IORequest *)&trq);
- return(x);
- }
-
-
-