home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 545b.lha / Fmon_v1.8 / src.lzh / fmon.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-09-03  |  43.2 KB  |  1,509 lines

  1.  
  2. /*********************************************************
  3. *                                                        *
  4. *    Fmon V1.8     -     fmon.c: main program            *
  5. *                                                        *
  6. *    (c) 1991  Michael Schröder                          *
  7. *                                                        *
  8. *    This program is freely distributable as long as     *
  9. *    the above copyright message is left intact          *
  10. *                                                        *
  11. *********************************************************/
  12.  
  13.  
  14. #include "libraries/dosextens.h"
  15. #include "intuition/intuition.h"
  16. #include "exec/memory.h"
  17. #include "exec/io.h"
  18. #include "exec/execbase.h"
  19. #include "devices/input.h"
  20. #include "devices/trackdisk.h"
  21. #include "exec/interrupts.h"
  22. #include "graphics/gfxbase.h"
  23. #include "proto/exec.h"
  24. #include "proto/dos.h"
  25. #include "proto/intuition.h"
  26. #include "fmon.h"
  27.  
  28.  
  29. char *Allocabs(long,char *);
  30. #pragma syscall Allocabs cc 9002
  31. ULONG typeofmem(char *);
  32. #pragma syscall typeofmem 216 901
  33.  
  34.  
  35. #define ERROR {serr();break;}
  36.  
  37. #define SHIFT 3
  38. #define CONT  8
  39. #define CAPS  4
  40. #define TD_HUNT CMD_INVALID
  41. #define TD_RAW TD_SEEK
  42.  
  43. char fmonid[]="Fmon";
  44. char fontid[]="topaz.font";
  45. extern char windid[];
  46. struct TextAttr teat={0,TOPAZ_EIGHTY,0,0}; /* MUST be an 8x8 font */
  47. struct NewScreen ns={0,0,XXX*8,VOFF+YYY*8+2+1,1,0,1,SCREENPARA,CUSTOMSCREEN,0,0,0,0};
  48. 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};
  49.  
  50.  
  51. UBYTE st[120];
  52. UWORD sp;
  53.  
  54.  
  55. void jump(),jumpe(),pos(),serr(),insertl(),clearl(),wril(),put(),wri(),wric(),hwric(),ofhwric();
  56. void wrilc(),hwril(),putofh(),load(),copy(),clearcs(),erasedisp(),regclear(),reginit();
  57. void fill(),sav(),hunt(),verify();
  58. void __regargs app(UBYTE);
  59. void __regargs addlx(ULONG);
  60. void __regargs addax(ULONG);
  61. void __regargs addwx(UWORD);
  62. void __regargs addbx(UBYTE);
  63. void __regargs addd(LONG);
  64. void __regargs adddt(void *);
  65. void __regargs addwb(UWORD);
  66. void __regargs addlb(ULONG);
  67. void __regargs adds(char *);
  68. void __regargs addsc(char *);
  69. void __regargs addblk(ULONG,int);
  70. void __regargs pril(char *);
  71. void __regargs print(char *);
  72. void __regargs eprint(char *,char *);
  73. int  __regargs cmpsbs(char *,long);
  74. void __regargs cnoprint(char *);
  75. void __regargs cnopen(char *);
  76. void __regargs addbname(long);
  77. void __regargs addbname4(long);
  78. int  __regargs getbytes(char *);
  79. void __regargs dumpmem(char *);
  80. void __regargs dumpasc(char *,int);
  81. void __regargs addc(char);
  82. int  __regargs setcd(char *);
  83. void __regargs binfoh(char *);
  84. ULONG blchk();
  85. ULONG __regargs bochk(char *);
  86. ULONG __regargs hash(char *);
  87. int __regargs inidev(char *);
  88. struct DeviceList * __regargs finddev(char *);
  89. void __regargs copypara(char *);
  90.  
  91. int freemem(),exe(),inputline(),get(),dopkt(),doraw(),frmval(),frmval2(),frmval3(),chq(),chqc();
  92. UBYTE gcl(),gcla(),*getadr(),*geteadr(),*getdevnam(),*getnam(),*getnam2();
  93.  
  94. void handler();
  95. UWORD qual;
  96. struct Interrupt hands;
  97.  
  98. struct IntuitionBase *IntuitionBase;
  99. struct GfxBase *GfxBase;
  100. struct Screen *sc;
  101. struct Window *wi;
  102. extern struct InfoData infd;
  103. extern struct FileInfoBlock fib;
  104. extern UBYTE bootbl[];
  105. struct Process *proc;
  106. UBYTE *bpl0,*charbuf,*scrbuf;
  107.  
  108. struct MsgPort monp,crqp;
  109. struct IOStdReq irq,rq,crq,trq;
  110.  
  111. ULONG fh,ofh;
  112. UWORD em;
  113.  
  114. short cx=0,cy=0;
  115.  
  116. UBYTE cl[XXX+1];
  117. UWORD ps;
  118.  
  119. 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,
  120.                   'W','e','d','n','e','s',0,'T','h','u','r','s',0,0,
  121.                   'F','r','i',0,0,0,0,'S','a','t','u','r',0,0};
  122.  
  123. UBYTE dnl[4][5]={'d','f','0',':',0,'d','f','1',':',0,'d','f','2',':',0,'d','f','3',':',0};
  124.  
  125. UWORD rpc[4]={0,140,280,560};
  126. char rps[7][15]={'1','-','P','r','e','c','o','m','p',':',000,000,000,000,000,
  127.                  '2','-','M','F','M',' ','p','r','e','c','o','m','p',':',000,
  128.                  '3','-','W','o','r','d','s','y','n','c',':',000,000,000,000,
  129.                  '4','-','S','y','n','c','w','o','r','d',':',000,000,000,000,
  130.                  '5','-','M','S','B','s','y','n','c',':',000,000,000,000,000,
  131.                  '6','-','F','a','s','t',':',000,000,000,000,000,000,000,000,
  132.                  '7','-','I','n','d','e','x',':',000,000,000,000,000,000,000};
  133.  
  134. UBYTE rpsh[7]={0,12,10,0,9,8,0};
  135.  
  136. ULONG regs[20];
  137. WORD trpv;
  138. UBYTE *stack;
  139. ULONG ssize;
  140. UBYTE rl1[21]="ddddddddaaaaaaaapsit";
  141. UBYTE rl2[21]="0123456701234567crdd";
  142.  
  143. UWORD rsyn=0x4489,rpar=0x9500;
  144.  
  145. char *bbuf,*abuf;
  146. 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;
  147. ULONG cbl;
  148. BYTE notd= -1;
  149. UBYTE hj='*',huc=0;
  150. int anz;
  151. BYTE bf;
  152. UBYTE state;
  153. char nobuf[]="No buffer!";
  154. char oddsp[]="!!! Odd stackpointer !!!";
  155. char file[]="file";
  156. char cnas[]="Could not alloc signal ";
  157. char intuiname[]="intuition.library";
  158. char gfxname[]="graphics.library";
  159. char inpname[]="input.device";
  160. char conname[]="console.device";
  161. char iins[]="No   Start    End   Length";
  162. char nomembuf[]="No memory for buffer";
  163. char sold[]="Old: $";
  164. char snow[]="  Now: $";
  165. char snoseg[]="Not a segment pointer";
  166. extern char snotd[];
  167.  
  168. void binfo(),shi(),shhunt(),showsr(),showregs(),gottrap();
  169. ULONG loadseg();
  170.  
  171.  
  172. void
  173. min()
  174. {
  175. register UBYTE c;
  176. register LONG x,y,z;
  177. UBYTE c1,*dsta,*dena,*getadr(),*geteadr();
  178. register UBYTE *sta,*ena,*nam,*zad;
  179. ULONG lo,a,b,e,f;
  180. LONG xx;
  181. extern struct DosLibrary *DOSBase;
  182. struct DeviceList *dl;
  183. struct Node *ln;
  184. struct MemHeader *mh;
  185. APTR owi;
  186. struct TextFont *font;
  187.  
  188. proc=(struct Process *)FindTask(0);
  189.  
  190. if ((IntuitionBase=(struct IntuitionBase *)OpenLibrary(intuiname,0))==0)
  191.   {cnoprint(intuiname);goto fin;}
  192.  
  193. if ((GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0))==0)
  194.   {cnoprint(gfxname);goto fin;}
  195.  
  196. teat.ta_Name=fontid;ns.Font=&teat;ns.DefaultTitle=windid;
  197. if ((sc=(struct Screen *)OpenScreen(&ns))==0) {cnoprint("screen");goto fin;}
  198. nw.Screen=sc;
  199. if ((wi=(struct Window *)OpenWindow(&nw))==0) {cnoprint("window");goto fin;}
  200.  
  201. if ((scrbuf=AllocMem(XXX*8,0x3))==0)
  202.   {print("Could not alloc CharBuf\n");goto fin;}
  203. if ((charbuf=AllocMem(8*256,0x1))==0)
  204.   {print("Could not alloc CharBuf\n");goto fin;}
  205.  
  206. font=wi->RPort->Font;
  207. for (x=0;x<256;x++)
  208.   {
  209.   y=x;c=0;
  210.   if (x<32||(x>=128&&x<128+32)) {y+=64;c=255;}
  211.   if (y<font->tf_LoChar||y>font->tf_HiChar) y=font->tf_HiChar-font->tf_LoChar+1;
  212.   y-=font->tf_LoChar;
  213.   for (z=0;z<8;z++)
  214.     {
  215.     charbuf[8*x+z]=(*((UBYTE *)font->tf_CharData+(*(UWORD *)((UBYTE *)font->tf_CharLoc+y*4)>>3)+font->tf_Modulo*z))^c;
  216.     }
  217.   }
  218.  
  219. bpl0=wi->RPort->BitMap->Planes[0]+VOFF*XXX;
  220.  
  221. if ((monp.mp_SigBit=AllocSignal(-1))==-1) {eprint(cnas,"1");goto fin;}
  222. monp.mp_SigTask=(struct Task *)proc;
  223. if ((crqp.mp_SigBit=AllocSignal(-1))==-1) {eprint(cnas,"2");goto fin;}
  224. crqp.mp_SigTask=(struct Task *)proc;
  225.  
  226. trq.io_Message.mn_ReplyPort=rq.io_Message.mn_ReplyPort=irq.io_Message.mn_ReplyPort=&monp;
  227. crq.io_Message.mn_ReplyPort=&crqp;
  228. 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;
  229.  
  230. rq.io_Data=(APTR)wi;
  231. rq.io_Length=sizeof(struct Window);
  232.  
  233. if (OpenDevice(conname,0,(struct IORequest *)&rq,0)) {cnoprint(conname);goto fin;}
  234. crq.io_Device=rq.io_Device;crq.io_Unit=rq.io_Unit;
  235. for (x= -XXX;x<7*XXX;x+=XXX) *(bpl0+x)=0;      /* Clear Cursor */
  236. for (x=0;x<XXX;x++) bpl0[(YYY*8+1)*XXX+x]=255; /* Draw Line */
  237.  
  238. if (OpenDevice(inpname,0,(struct IORequest *)&irq,0)) {cnoprint(inpname);goto fin;}
  239.  
  240. owi=proc->pr_WindowPtr;
  241. proc->pr_WindowPtr=(APTR)wi;
  242. ssize=((struct CommandLineInterface *)BADDR(proc->pr_CLI))->cli_DefaultStack << 2;
  243. if (ssize<1600) ssize=1600;
  244.  
  245. irq.io_Data=(APTR)&hands;
  246. irq.io_Command=IND_ADDHANDLER;
  247. hands.is_Node.ln_Type=NT_INTERRUPT;
  248. hands.is_Node.ln_Pri=60;
  249. hands.is_Node.ln_Name=fmonid;
  250. hands.is_Code=handler;
  251. DoIO((struct IORequest *)&irq);
  252.  
  253. regclear();wri(12);
  254. if (inidev(dnl[0])) pril("Warning: no device selected");
  255. bf=0;
  256. for(;;)
  257.   {
  258.   if (bf==0) wri('.');
  259.   else if (bf!=-1) {ofhwric();put(13);cx=0;wri('.');wri(bf);put(8);cx--;}
  260.   bf=0;
  261.   if ((c=inputline())==0) hwric();
  262.   else if (c=='x')
  263.     {
  264.     if (gcla()) serr(); else break;
  265.     }
  266.   else switch (c)
  267.     {
  268.     case ('p'):
  269.       c=gcla();hwric();
  270.       if (c=='t')
  271.         {
  272.         if (ofh==0) {pril("No output enabled");break;}
  273.         sp=0;adds("\033[1m\033[6w");adds(cl+ps);adds("\033[5w\033[22m\n");
  274.         putofh();break;
  275.         }
  276.       if (ofh) {Close(ofh);ofh=0;}
  277.       if (c=='e')
  278.         {
  279.         if ((ofh=Open("prt:",MODE_NEWFILE))==0) {cnopen("printer");break;}
  280.         wri('O');wri('n');hwric();
  281.         }
  282.       else pril("Off");
  283.       break;
  284.     case ('o'):
  285.       if ((c=gcl())=='+') ps++;
  286.       nam=getnam2();if (gcla()) ERROR;
  287.       if (ofh) {Close(ofh);ofh=0;}
  288.       hwric();
  289.       if (nam)
  290.         {
  291.         if ((ofh=Open(nam,(c=='+')?MODE_READWRITE:MODE_NEWFILE))==0) {cnopen(file);break;}
  292.         if (c=='+') Seek(ofh,0,OFFSET_END);
  293.         }
  294.       wri('O');wri('K');hwric();
  295.       break;
  296.     case ('h'):
  297.       c=gcla();
  298.       if (c=='j')
  299.         {
  300.         y=hj;
  301.         for(;;)
  302.           {
  303.           while ((c=gcla())==' ');
  304.           if (c==0) break;
  305.           if (c=='\"')
  306.             {
  307.             if ((x=gcla())==0) {serr();goto hj1;};
  308.             if (gcla()!='\"') {serr();goto hj1;}
  309.             }
  310.           else
  311.             {
  312.             ps--;x=(LONG)getadr();
  313.             if (x<0||x>255) {serr();goto hj1;}
  314.             }
  315.           if (hj!=x) y=x;
  316.           }
  317.         hwric();hj=y;
  318.         sp=0;adds(".hj ");
  319.         if ((hj&127)>31) {app('\"');app(hj);adds("\" ");}
  320.         addbx(hj);wrilc();
  321. hj1:    break;
  322.         }
  323.       if (c=='u'||c=='l')
  324.         {
  325.         if (gcla()) ERROR;
  326.         hwric();huc=c^'l';
  327.         if (huc) pril("UC==lc"); else pril("UC!=lc");
  328.         break;
  329.         }
  330.       y=0;
  331.       if (c=='r') z=2;
  332.       else for (ps--,z=0;;)
  333.         {
  334.         c=gcl();
  335.         if (c=='c'&&y==0) {ps++;y=-1;}
  336.         else if (c=='e'&&z==0) {ps++;z=1;}
  337.         else break;
  338.         }
  339.       if ((LONG)(sta=getadr())<0) ERROR;
  340.       if ((LONG)(ena=getadr())<0) ERROR;
  341.       if (z==2)
  342.         {
  343.         if ((LONG)(zad=getadr())<0) ERROR;
  344.         hwric();sp=0;adds("hunting relative for $");addax((ULONG)zad);wrilc();
  345.         if ((LONG)sta<(LONG)zad-32768) sta=zad-32768;
  346.         if ((LONG)ena>(LONG)zad+32767) ena=zad+32767;
  347.         }
  348.       else
  349.         {
  350.         x=getbytes(cl);
  351.         c=gcla();if (x==0) ERROR;
  352.         zad=0;
  353.         if (y)
  354.           {
  355.           if (c==0) ERROR;
  356.           zad=cl+x;y=getbytes(zad);c=gcla();if (x!=y) ERROR;
  357.           }
  358.         if (c) ERROR;
  359.         hwric();sp=0;shhunt(x);
  360.         }
  361.       hunt(sta,ena+1,cl,x,z,zad);
  362.       break;
  363.     case ('a'):
  364.       if ((LONG)(sta=geteadr())<0) ERROR;
  365.       if (gcl()==0) {hwric();break;}
  366.       for (y=0;cl[y];y++);
  367.       while (--y>10)
  368.         {
  369.         c=cl[y];
  370.         if (c>='0'&&c<='9') continue;
  371.         if (c>='a'&&c<='f') continue;
  372.         if (c==' ')
  373.           {
  374.           if (cl[y-1]!=' ') continue;
  375.           while (cl[y]==' ') y--;
  376.           cl[y+1]=0;
  377.           }
  378.         break;
  379.         }
  380.       a=10;if (gcl()==':')
  381.         {
  382.         a=37;
  383.         for (y=ps;cl[y];y++)
  384.           {
  385.           if (cl[y-1]==' '&&cl[y]==' ')
  386.             {
  387.             while ((c=cl[y])==' ') y++;
  388.             if (c) ps=y;
  389.             break;
  390.             }
  391.           }
  392.         }
  393.       if ((x=assem(sta))==0) ERROR;
  394.       clearl();for (y=0;y<XXX&&(c=cl[y]);y++) st[y]=c;
  395.       z=XXX-1-5*(x/2);cx=0;put(13);if (y>z-1) {sp=y;wrilc();insertl();clearl();}
  396.       sp=z;for (y=0;y<x;y+=2) {sp++;addwx(*(UWORD *)(sta+y));}
  397.       sta+=x;wrilc();
  398.       sp=0;adds(".a ");addax((ULONG)sta);hwril();cx=a;pos();bf=-1;
  399.       break;
  400.     case ('#'):
  401.       if ((nam=getdevnam())==0) ERROR;
  402.       hwric();
  403.       x=bsize;
  404.       if (inidev(nam)) break;
  405.       if (abuf!=0)
  406.         if (x!=bsize||(typeofmem(abuf)&memtyp)!=memtyp)
  407.           {
  408.           if (abuf=bbuf) bbuf=0;
  409.           FreeMem(abuf,x);abuf=0;
  410.           }
  411.       proc->pr_WindowPtr=(APTR)-1;
  412.       if (setcd(nam)) pril("Warning: Could not set CD");
  413.       proc->pr_WindowPtr=(APTR)wi;
  414.       break;
  415.     case ('b'):
  416.       if ((LONG)(sta=geteadr())<0) ERROR;
  417.       if (gcla()) ERROR;
  418.       hwric();sp=0;adds(sold);addlx(((ULONG *)sta)[1]);
  419.       adds(snow);addlx(((ULONG *)sta)[1]=bochk(sta));
  420.       wrilc();break;
  421.     case ('>'):
  422.     case ('<'):
  423.       c=(c=='<')?CMD_READ:CMD_WRITE;
  424.       switch (gcla())
  425.         {
  426.         case ('c'):
  427.           if (gcla()) ERROR;
  428.           hwric();
  429.           trackbl(0,0,CMD_CLEAR);
  430.           break;
  431.         case ('s'):
  432.           if ((LONG)(sta=geteadr())<0) ERROR;
  433.           if (frmval(&a)==-1) ERROR;
  434.           if (a<0) ERROR;
  435.           if (frmval(&b)==-1) ERROR;
  436.           if (b<0||b>=heads) ERROR;
  437.           if (frmval(&e)==-1) ERROR;
  438.           if (e<0||e>=bptrack) ERROR;
  439.           xx=1;
  440.           if (gcl())
  441.             {
  442.             if (frmval3(&xx)) ERROR;
  443.             if (xx<0) ERROR;
  444.             }
  445.           e+=a*bpcyl+b*bptrack;hwric();
  446.           if (xx) etrackbl(e,sta,c,1,xx);
  447.           break;
  448.         case ('t'):
  449.           if ((LONG)(sta=geteadr())<0) ERROR;
  450.           if ((x=frmval(&a))==-1) ERROR;
  451.           if (a<0) ERROR;
  452.           if (x)
  453.             {
  454.             if (frmval3(&b)) ERROR;
  455.             if (b<0) ERROR;
  456.             }
  457.           else b=a;
  458.           hwric();
  459.           x=(b-a+1)*bptrack;if (x<=0) break;
  460.           etrackbl(a*bptrack,sta,c,1,x);
  461.           break;
  462.         case('r'):
  463.           if ((LONG)(sta=geteadr())<0) ERROR;
  464.           if ((x=(LONG)getadr())<=0) ERROR;
  465.           if (frmval3(&a)) ERROR;
  466.           if (a<0) ERROR;
  467.           hwric();
  468.           if (notd) {pril(snotd);break;}
  469.           if (x>0x7fff) {pril("Length must be <= $7fff");break;}
  470.           etrackbl(a*11,sta,TD_RAW,0x7f^((a&1)<<2)^(8<<unit)^((c==CMD_WRITE)?256:0),x);
  471.           break;
  472.         case('f'):
  473.           if (c==CMD_READ) ERROR;
  474.           if ((LONG)(sta=geteadr())<0) ERROR;
  475.           if ((x=frmval(&a))==-1) ERROR;
  476.           if (a<0) ERROR;
  477.           if (x)
  478.             {
  479.             if (frmval3(&b)) ERROR;
  480.             if (b<0) ERROR;
  481.             }
  482.           else b=a;
  483.           hwric();
  484.           x=(b-a+1)*bptrack;if (x<=0) break;
  485.           etrackbl(a*bptrack,sta,TD_FORMAT,bptrack,x);
  486.           break;
  487.         case('i'):
  488.           if (x=gcl()) {if ((LONG)(sta=geteadr())<0) ERROR;}
  489.           hwric();if (notd) {pril(snotd);break;}
  490.           if (x==0)
  491.             {
  492.             if ((sta=AllocMem(1024,0x10000|memtyp))==0) {pril(nomembuf);break;}
  493.             for(y=0;y<50;y++) sta[y]=bootbl[y];
  494.             }
  495.           if (c==CMD_WRITE) {*(ULONG *)sta=0x444f5300;*(ULONG *)(sta+4)=bochk(sta);}
  496.           if (etrackbl(0,sta,c,1,2)==0) if (c==CMD_READ)
  497.             {
  498.             if (*(ULONG *)sta!=0x444f5300||*(ULONG*)(sta+4)!=bochk(sta)) pril("Not a valid bootblock");
  499.             else
  500.               {
  501.               for (y=12;y<50;y++) if (sta[y]!=bootbl[y]) break;
  502.               if (y==50) pril("Standard bootblock");
  503.               else pril("Unknown bootblock");
  504.               }
  505.             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();}
  506.             }
  507.           if (x==0) FreeMem(sta,1024);
  508.           break;
  509.         case('h'):
  510.           if (c==CMD_WRITE) ERROR;
  511.           a=lowbl;b=highbl;
  512.           anz=getbytes(cl);
  513.           if (gcla())
  514.             {
  515.             if ((x=frmval(&a))==-1) ERROR;
  516.             if (a<0) ERROR;
  517.             a*=bptrack;
  518.             if (x)
  519.               {
  520.               if (frmval3(&b)) ERROR;
  521.               if (b<0) ERROR;
  522.               b=(b+1)*bptrack;
  523.               }
  524.             }
  525.           hwric();
  526.           if (anz==0) pril("Checking disk");
  527.           else
  528.             {
  529.             sp=0;adds("disk ");shhunt(anz);
  530.             }
  531.           b=b-a;if (b<=0) break;
  532.           if ((sta=AllocMem(bptrack*bsize,0x10000|memtyp))==0) {pril(nomembuf);break;}
  533.           etrackbl(a,sta,TD_HUNT,bptrack,b);
  534.           FreeMem(sta,bptrack*bsize);
  535.           break;
  536.         default: serr();
  537.         }
  538.       break;
  539.     case (':'):
  540.       c=gcla();
  541.       if (c=='d')
  542.         {
  543.         c=gcla();
  544.         if (c=='i') x= -1;
  545.         else if (c=='f') x=0;
  546.         else ERROR;
  547.         if ((nam=getdevnam())==0) ERROR;
  548.         hwric();
  549.         if ((dl=finddev(nam))==0) break;
  550.         if (dopkt(dl->dl_Task,31,x)) pril("Action failed"); else pril("OK");
  551.         break;
  552.         }
  553.       if (c=='r')
  554.         {
  555.         if (gcl())
  556.           {
  557.           if (frmval3(&xx)) ERROR;
  558.           }
  559.         else xx=root;
  560.         hwric();
  561.         if (bbuf==0)
  562.           {
  563.           if (abuf==0)
  564.             {
  565.             if ((abuf=bbuf=AllocMem(bsize,memtyp))==0) {pril(nomembuf);break;}
  566.             }
  567.           else bbuf=abuf;
  568.           sp=0;adds("Allocated buffer at $");addax((ULONG)bbuf);wrilc();
  569.           }
  570.         if (trackbl(xx+lowbl,bbuf,CMD_READ)==0) {cbl=xx;binfo();}
  571.         break;
  572.         }
  573.       if (c=='b')
  574.         {
  575.         if (gcl())
  576.           {
  577.           if ((LONG)(sta=geteadr())<0) ERROR;
  578.           if (gcla()) ERROR;
  579.           hwric();
  580.           if (sta) if ((typeofmem(sta)&memtyp)!=memtyp) {pril("Wrong memory type");break;}
  581.           bbuf=sta;
  582.           }
  583.         else
  584.           {
  585.           hwric();sp=0;
  586.           if (bbuf) {adds("Buffer is at $");addax((ULONG)bbuf);} else adds(nobuf);
  587.           wrilc();break;
  588.           }
  589.         break;
  590.         }
  591.       if (c=='h')
  592.         {
  593.         if ((nam=getnam())==0) ERROR;
  594.         hwric();x=hash(nam);
  595.         sp=0;adds("Hash value: ");addd(x);
  596.         if (bbuf) {adds("  - Block:");addd(((ULONG *)bbuf)[x]);}
  597.         wrilc();
  598.         break;
  599.         }
  600.       switch (c)
  601.         {
  602.         case ('w'):
  603.           if (frmval3(&xx)) ERROR;
  604.           hwric();
  605.           if (bbuf==0) {pril(nobuf);break;}
  606.           trackbl(xx+lowbl,bbuf,CMD_WRITE);
  607.           break;
  608.         case ('i'):
  609.           hwric();
  610.           if (bbuf==0) {pril(nobuf);break;}
  611.           binfo();
  612.           break;
  613.         case ('c'):
  614.           hwric();
  615.           if (bbuf==0) {pril(nobuf);break;}
  616.           sp=0;adds(sold);addlx(((ULONG *)bbuf)[5]);
  617.           adds(snow);addlx(((ULONG *)bbuf)[5]=blchk());
  618.           wrilc();break;
  619.         case ('m'):
  620.           if (bbuf==0) {hwric();pril(nobuf);break;}
  621.           xx=0;if (x=gcl()) {if ((x=frmval(&xx))<0) ERROR;}
  622.           if (xx<0||xx>=bsize4) ERROR;
  623.           sta=bbuf+4*xx;
  624.           xx=bsize4-1;if (x) {if (frmval3(&xx)) ERROR;}
  625.           if (xx<0||xx>=bsize4) ERROR;
  626.           ena=bbuf+4*xx;
  627.           goto m1;
  628.         case ('f'):
  629.           hwric();
  630.           if (bbuf==0) {pril(nobuf);break;}
  631.           if (*(ULONG *)bbuf!=8 && *(ULONG *)(bbuf+bsize-4)!=-3) {pril("Wrong block type");break;}
  632.           x=((ULONG *)bbuf)[4];
  633.           if (trackbl(x+lowbl,bbuf,CMD_READ)==0) {cbl=x;binfo();}
  634.           break;
  635.         default:
  636.           serr();
  637.         }
  638.       break;
  639.     case ('g'):
  640.       if ((LONG)(sta=geteadr())<0) ERROR;
  641.       if (gcla()) ERROR;
  642.       hwric();
  643.       if (regs[15]&1) {pril(oddsp);break;}
  644.       regs[16]=(ULONG)sta;
  645.       jump(1);
  646.       if (trpv<0) goto on2;
  647.       gottrap();
  648.       break;
  649.     case ('O'):
  650.       if (gcl())
  651.         {
  652.         if ((LONG)(sta=geteadr())<0) ERROR;
  653.         if (gcla()) ERROR;
  654.         regs[16]=(ULONG)sta;
  655.         }
  656.       hwric();
  657. on1:  for(;;)
  658.         {
  659.         sta=(UBYTE *)regs[16];
  660.         sta+=disass(sta);
  661.         while (qual&SHIFT);
  662.         while ((qual&(CONT|SHIFT|CAPS))==0)
  663.           {
  664.           state=2;c=get();state=0;
  665.           if (c=='r') {wric();showregs();goto on1;}
  666.           if (c=='y') {wric();showsr();goto on1;}
  667.           if (c=='j') {wric();goto e1;}
  668.           if (c=='s') {wric();regs[16]=(ULONG)sta;goto on1;}
  669.           if (c=='x')
  670.             {
  671.             wric();
  672.             if (regs[15]&1) {pril(oddsp);goto on1;}
  673.             x=*(ULONG *)regs[15];if (x&1||(ULONG)x>=0x1000000) {pril("Not a valid address");goto on1;}
  674.             sta=(char *)x;goto e1;
  675.             }
  676.           }
  677.         wric();
  678.         if (qual&CONT) break;
  679.         jump(2);
  680.         if (trpv>=0) {gottrap();break;}
  681.         }
  682.       break;
  683.     case ('E'):
  684.       c=gcl();
  685.       if (c=='s'||c=='f')
  686.         {
  687.         ps++;if (gcla()) ERROR;
  688.         em=(c=='s');hwric();
  689.         pril(em?"Slow mode":"Fast mode");
  690.         break;
  691.         }
  692.       if (c)
  693.         {
  694.         if ((LONG)(sta=geteadr())<0) ERROR;
  695.         c=gcla();
  696.         if (c) if (c!=':') ERROR;
  697.         }
  698.       else sta=0;
  699.       hwric();
  700. e1:   if (em==0)
  701.         {
  702.         if (sta)
  703.           {
  704.           y=*(UWORD *)sta;*(UWORD *)sta=0x4e4f;x=(ULONG)sta;
  705.           if (*(UWORD *)x!=0x4e4f) {pril("Warning: switched to slow");em=1;goto e1;}
  706.           if (regs[16]==(ULONG)sta)
  707.             {
  708.             *(UWORD *)sta=y;jump(2);*(UWORD *)sta=0x4e4f;
  709.             if (trpv>=0) {gottrap();break;}
  710.             }
  711.           jump(0);*(UWORD *)sta=y;
  712.           if (trpv==47) if ((regs[16]-=2)==(ULONG)sta) trpv=-1;
  713.           }
  714.         else jump(0);
  715.         }
  716.       else {x=9;jumpe(sta);}
  717.       if (trpv>=0) {gottrap();break;}
  718. on2:  while(qual&CONT);
  719.       goto on1;
  720.     case ('y'):
  721.       hwric();showsr();
  722.       break;
  723.     case ('r'):
  724.       c=gcl();
  725.       if (c=='c')
  726.         {
  727.         ps++;if (gcla()) ERROR;
  728.         regclear();
  729.         c=0;
  730.         }
  731.       else if (c=='i')
  732.         {
  733.         ps++;
  734.         while (gcl()==' ') ps++;
  735.         reginit();
  736.         copypara(cl+ps);
  737.         c=0;
  738.         }
  739.       if (c==0) {hwric();showregs();break;}
  740.       while((c=gcla())==' ');
  741.       for(;;)
  742.         {
  743.         if (c==0) {hwric();break;}
  744.         if (c=='_') c=gcla();
  745.         for (x=0;x<20;x++) if (c==rl1[x]) {c1=gcla();break;}
  746.         for (;x<20;x++) if (c==rl1[x]&&c1==rl2[x]) break;
  747.         if (x==20) ERROR;
  748.         if (gcl()=='=') ps++;
  749.         if ((BYTE)(c=frmval2(&xx,'$'))<0) ERROR;
  750.         if (x==16) if (xx&1) {ps--;ERROR;}
  751.         regs[x]=xx;
  752.         }
  753.       break;
  754.     case ('d'):
  755.       if ((LONG)(dsta=geteadr())<0) ERROR;
  756.       if (gcl()=='#') dena=(UBYTE *)0x7fffffff; else dena=getadr();
  757.       if ((LONG)dena>=0) hwric();
  758. dcont:sta=dsta;bf='d';
  759.       if ((LONG)dena<0) wri(12);
  760.       for (;;)
  761.         {
  762.         if ((LONG)dena>=0) if (sta>dena) {bf=0;break;}
  763.         x=disass((UWORD *)sta);
  764.         if (chq()) break;
  765.         if ((LONG)dena<0) if (cy==YYY-1) break;
  766.         wric();
  767.         sta+=x;
  768.         }
  769.       if (dena==(UBYTE *)0x7fffffff)
  770.         {
  771.         put(13);cx=0;sp=0;adds(".d ");addax((ULONG)sta);app('#');hwril();put(8);cx--;bf=-1;
  772.         }
  773.       break;
  774.     case ('m'):
  775.       if ((LONG)(sta=getadr())<0) ERROR;
  776.       ena=getadr();
  777. m1:   hwric();
  778.       while(sta<=ena||(LONG)ena<0)
  779.         {
  780.         dumpmem(sta);sta+=16;
  781.         if (chq()) {bf='m';break;}
  782.         wric();
  783.         }
  784.       break;
  785.     case ('M'):
  786.       if ((LONG)(sta=getadr())<0) ERROR;
  787.       ena=getadr();
  788.       hwric();
  789.       while(sta<=ena||(LONG)ena<0)
  790.         {
  791.         sp=0;adds("./ ");addax((ULONG)sta);app(':');app(' ');
  792.         dumpasc(sta,64);sta+=64;
  793.         if (chq()) {bf='M';break;}
  794.         wric();
  795.         }
  796.       break;
  797.     case ('v'):
  798.       if ((LONG)(sta=getadr())<0) ERROR;
  799.       if ((LONG)(ena=getadr())<0) ERROR;
  800.       if ((LONG)(zad=getadr())<0) ERROR;
  801.       hwric();verify(sta,ena,zad);
  802.       break;
  803.     case ('f'):
  804.       if ((LONG)(sta=getadr())<0) ERROR;
  805.       if ((LONG)(ena=getadr())<0) ERROR;
  806.       x=getbytes(cl);if (gcla()) ERROR;
  807.       if (x==0) ERROR;
  808.       hwric();
  809.       y=(ena-sta)+1;if (y>0) {fill(sta,y,cl,x-1);pril("OK");}
  810.       break;
  811.     case ('['):
  812.       if (gcl()==0)
  813.         {
  814.         hwric();
  815.         Forbid();
  816.         mh=(struct MemHeader *)(*(struct ExecBase **)4L)->MemList.lh_Head;
  817.         for (x=y=0;mh->mh_Node.ln_Succ;mh=(struct MemHeader *)mh->mh_Node.ln_Succ)
  818.           {
  819.           if (mh->mh_Attributes&MEMF_CHIP) x+=(ULONG)mh->mh_Upper-(ULONG)mh->mh_Lower;
  820.           if (mh->mh_Attributes&MEMF_FAST) y+=(ULONG)mh->mh_Upper-(ULONG)mh->mh_Lower;
  821.           }
  822.         a=AvailMem(MEMF_CHIP);b=AvailMem(MEMF_CHIP|MEMF_LARGEST);
  823.         e=AvailMem(MEMF_FAST);f=AvailMem(MEMF_FAST|MEMF_LARGEST);
  824.         Permit();
  825.         pril("Type Available In-Use   Maximum  Largest");
  826.         clearl();adds("Chip: ");addd(a);sp=15;addd(x-a);sp=24;addd(x);sp=33;addd(b);wrilc();
  827.         clearl();adds("Fast: ");addd(e);sp=15;addd(y-e);sp=24;addd(y);sp=33;addd(f);wrilc();
  828.         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();
  829.         break;
  830.         }
  831.       else if (gcl()=='a')
  832.         {
  833.         ps++;if ((LONG)(sta=getadr())<0) ERROR;
  834.         if ((LONG)(ena=getadr())<0) ERROR;
  835.         if ((LONG)(ena-=(LONG)sta-1)<=0) ERROR;
  836.         if (Allocabs((long)ena,sta)==0) sta=0;
  837.         }
  838.       else
  839.         {
  840.         if ((LONG)(ena=getadr())<=0) ERROR;
  841.         if ((x=(LONG)getadr())<0) x=1;
  842.         sta=AllocMem((long)ena,x);
  843.         }
  844.       hwric();
  845.       if (sta==0) {pril("Could not allocate memory");break;}
  846.       sp=0;adds("Allocated $");addax((ULONG)ena);adds(" bytes at $");addax((ULONG)sta);
  847.       wrilc();
  848.       break;
  849.     case (']'):
  850.       if ((c=gcl())=='a') ps++;
  851.       if ((LONG)(sta=getadr())<0) ERROR;
  852.       if ((x=(LONG)getadr())<0) ERROR;
  853.       if (c=='a') x-=(ULONG)sta-1;
  854.       if (x<=0) ERROR;
  855.       if (gcla()) ERROR;
  856.       hwric();
  857.       if (freemem(sta,x)) pril("!!! Some is already free !!!");
  858.       break;
  859.     case ('c'):
  860.       if ((LONG)(sta=getadr())<0) ERROR;
  861.       if ((LONG)(ena=getadr())<0) ERROR;
  862.       while((c=gcla())==' ');
  863.       if (c!='a'&&c!='e') ERROR;
  864.       if (gcla()!=' ') ERROR;
  865.       if ((LONG)(zad=getadr())<0) ERROR;
  866.       if (c=='e') zad-=ena-sta;
  867.       while((c=gcla())==' ');
  868.       xx=0;if (c)
  869.         {
  870.         if (c!='{'&&c!='}') ERROR;
  871.         if (frmval3(&xx)) ERROR;
  872.         if (xx<0||xx>7) ERROR;
  873.         if (c=='{') xx= -xx;
  874.         }
  875.       hwric();if (sta>ena) break;
  876.       sp=0;app('$');addax((ULONG)zad);app(' ');app('$');addax((ULONG)(zad+(ena-sta)));
  877.       copy(sta,ena+1,zad,xx);
  878.       wrilc();
  879.       break;
  880.     case (','):
  881.       if ((LONG)(sta=geteadr())<0) ERROR;
  882.       ps++;if (changemem(sta)<0) ERROR;
  883.       if (dena!=(UBYTE *)-1)
  884.         {
  885.         cx=0;put(13);erasedisp();
  886.         dsta=sta;
  887.         }
  888.       if (dsta!=(UBYTE *)-1) goto dcont;
  889.       hwric();
  890.       break;
  891.     case ('&'):
  892.       if ((LONG)(sta=getadr())<0) ERROR;
  893.       if (gcl()==':') ps++;
  894.       if ((x=changemem(sta))<0) ERROR;
  895.       if (x==16) {put(13);cx=0;dumpmem(sta);wric();}
  896.       else hwric();
  897.       sp=0;adds(".& ");addax((ULONG)sta+x);adds(": ");hwril();bf=-1;
  898.       break;
  899.     case ('/'):
  900.       if ((LONG)(sta=getadr())<0) ERROR;
  901.       hwric();
  902.       ena=sta;
  903.       if (gcl()==':') ps++;
  904.       if (gcl()==' ') ps++;
  905.       while (c=gcla())
  906.         {
  907.         if (c=='.') {sta++;continue;}
  908.         *sta++=c;
  909.         }
  910.       while(sta-ena<64) *sta++=' ';
  911.       sp=0;adds("./ ");addax((ULONG)sta);adds(": ");hwril();bf=-1;
  912.       break;
  913.     case ('?'):
  914.       if ((c=gcl())=='%') ps++;
  915.       if (frmval3(&xx)) ERROR;
  916.       hwric();st[0]='$';sp=1;addlx(xx);adds(" = ");
  917.       if (c=='%') {app('%');addlb(xx);} else addd(xx);
  918.       wrilc();
  919.       break;
  920.     case ('@'):
  921.       c=gcla();
  922.       if (c==0)
  923.         {
  924.         hwric();
  925.         pril("Unit Size  Used   Free   Full Errs   Status   Name");
  926.         dl=(struct DeviceList *)BADDR(((struct DosInfo *)BADDR(((struct RootNode *)DOSBase->dl_Root)->rn_Info))->di_DevInfo);
  927.         for (;dl;dl=(struct DeviceList *)BADDR(dl->dl_Next))
  928.           {
  929.           if (dl->dl_Type!=DLT_DEVICE) continue;
  930.           if (dopkt(dl->dl_Task,25,(ULONG)&infd>>2)) continue;
  931.           clearl();
  932.           addbname((long)dl->dl_Name);
  933.           app(':');sp=5;
  934.           switch (infd.id_DiskType)
  935.             {
  936.             case(ID_NO_DISK_PRESENT):adds("No disk present");break;
  937.             case(ID_UNREADABLE_DISK):adds("Unreadable disk");break;
  938.             case(ID_KICKSTART_DISK):adds("Kickstart disk");break;
  939.             case('B'<<24|'U'<<16|'S'<<8|'Y'):adds("Inhibited");break;
  940.             case(ID_DOS_DISK):
  941.               x=infd.id_NumBlocks;
  942.               y=(x*infd.id_BytesPerBlock)>>10;
  943.               if (y>1023) {addd(y>>10);app('M');}
  944.               else {addd(y);app('K');}
  945.               sp=31;addd(infd.id_NumSoftErrors);
  946.               sp=35;y=infd.id_DiskState;
  947.               switch(y)
  948.                 {
  949.                 case (ID_WRITE_PROTECTED):adds("Read only");break;
  950.                 case (ID_VALIDATING):adds("Validating");break;
  951.                 case (ID_VALIDATED):adds("Read/Write");break;
  952.                 }
  953.               if (y!=ID_VALIDATING)
  954.                 {
  955.                 y=infd.id_NumBlocksUsed;
  956.                 sp=11;addd(y);
  957.                 sp=18;addd(x-y);
  958.                 sp=25;addd(y*100/x);app('%');
  959.                 }
  960.               sp=46;y=infd.id_VolumeNode;
  961.               if (y) addbname((long)((struct DeviceList *)BADDR(y))->dl_Name);
  962.               break;
  963.             default:adds("Not a DOS disk");break;
  964.             }
  965.           wril();if (chqc()) break;
  966.           }
  967.         }
  968.       else if (c=='$')
  969.         {
  970.         nam=getnam2();if (gcla()) ERROR;
  971.         hwric();
  972.         if ((lo=Lock(nam,ACCESS_READ))==0) {pril("Not found");break;}
  973.         if (Examine(lo,&fib)==0) {pril("Could not examine");goto einf1;}
  974.         if (fib.fib_DirEntryType<0) {shi();wric();goto einf1;}
  975.         sp=0;adds("Directory \"");addsc(fib.fib_FileName);
  976.         adds("\" on ");DateStamp((void *)&fib.fib_Date);
  977.         adds(dayn[(ULONG)fib.fib_Date.ds_Days%7]);adds("day ");adddt(&fib.fib_Date);wrilc();
  978.         for(;;)
  979.           {
  980.           if (ExNext(lo,&fib)==0)
  981.             {
  982.             if (IoErr()!=ERROR_NO_MORE_ENTRIES) pril("Error while ExNext");
  983.             break;
  984.             }
  985.           shi();
  986.           if (chqc()) break;
  987.           }
  988. einf1:  UnLock(lo);
  989.         }
  990.       else if (c==':')
  991.         {
  992.         if (gcl()==0)
  993.           {
  994.           hwric();sp=0;adds("Current dir is \'");
  995.           addbname(((struct CommandLineInterface *)BADDR(proc->pr_CLI))->cli_SetName);
  996.           app('\'');wrilc();break;
  997.           }
  998.         if ((nam=getnam())==0) ERROR;
  999.         if (gcla()) ERROR;
  1000.         hwric();
  1001.         if (setcd(nam)) pril("Not found");
  1002.         }
  1003.       else
  1004.         {
  1005.         ps--;if ((nam=getnam())==0) ERROR;
  1006.         hwric();if ((xx=loadseg(nam))==0) break;
  1007.         proc->pr_WindowPtr=(APTR)0;
  1008.         x=exe(xx,nam,cl+ps);
  1009.         proc->pr_WindowPtr=(APTR)wi;
  1010.         UnLoadSeg(xx);
  1011.         if (x) {sp=0;adds("Error #");addd(x);wrilc();}
  1012.         }
  1013.       break;
  1014.     case ('e'):
  1015.       c=gcla();
  1016.       if (c=='s')
  1017.         {
  1018.         if (gcl())
  1019.           {
  1020.           if (frmval3(&xx)) ERROR;
  1021.           if (xx<0||(xx&3)!=0) ERROR;
  1022.           if (xx<1600) {hwric();pril("Minimum is 1600 bytes");break;}
  1023.           if (stack) FreeMem(stack,ssize);
  1024.           ssize=xx;stack=0;regs[15]=0;
  1025.           }
  1026.         hwric();sp=0;adds("Stack size: ");addd(ssize);adds(" bytes");wrilc();
  1027.         break;
  1028.         }
  1029.       if (c=='b'||c=='w'||c=='l')
  1030.         {
  1031.         if ((LONG)(sta=getadr())<0) ERROR;
  1032.         if (c!='b') if ((LONG)sta&1) ERROR;
  1033.         if (gcl())
  1034.           {
  1035.           if (gcl()==':') ps++;
  1036.           if (frmval2(&xx,'$')) ERROR;
  1037.           x=xx;
  1038.           if (c=='b')
  1039.             {
  1040.             if (x>255||x<-128) ERROR;
  1041.             *(UBYTE *)sta=(UBYTE)x;
  1042.             }
  1043.           else if (c=='w')
  1044.             {
  1045.             if (x>65535||x<-32768) ERROR;
  1046.             *(UWORD *)sta=(UWORD)x;
  1047.             }
  1048.           else *(ULONG *)sta=(ULONG)x;
  1049.           hwric();
  1050.           break;
  1051.           }
  1052.         hwric();sp=0;app('.');app('e');app(c);
  1053.         adds(" ($");addax((ULONG)sta);adds("): $");
  1054.         if (c=='b') addbx(*(UBYTE *)sta);
  1055.         else if (c=='w') addwx(*(UWORD *)sta);
  1056.         else addlx(*(ULONG *)sta);
  1057.         wrilc();
  1058.         break;
  1059.         }
  1060.       if (c=='r')
  1061.         {
  1062.         if (gcl()==0)
  1063.           {
  1064.           x=rpar;hwric();
  1065.           for (y=0;y<7;y++)
  1066.             {
  1067.             clearl();adds(".er ");adds(rps[y]);sp=19;
  1068.             if (y==0) addd(rpc[x>>13&3]);
  1069.             else if (y==3) {app('$');addwx(rsyn);}
  1070.             else app((char)('0'+(x>>rpsh[y]&1)));
  1071.             wrilc();
  1072.             }
  1073.           break;
  1074.           }
  1075.         while((c=gcla())==' ');
  1076.         if (gcl()=='-') while (x=gcl()) {ps++;if (x==':') break;}
  1077.         switch(c-='1')
  1078.           {
  1079.           case (0):
  1080.             if (frmval3(&xx)) ERROR;
  1081.             for (x=0;x<4;x++) if (rpc[x]==xx) break;
  1082.             if (x==4) ERROR;
  1083.             rpar=(rpar&0x9fff)|(x<<13);hwric();
  1084.             break;
  1085.           case (1):
  1086.           case (2):
  1087.           case (4):
  1088.           case (5):
  1089.           case (6):
  1090.             x=1<<rpsh[c];y=rpar|x;
  1091.             while ((c=gcla())==' ');
  1092.             if (c=='0') y^=x;
  1093.             else if (c!='1') ERROR;
  1094.             if (gcla()) ERROR;
  1095.             rpar=y;hwric();
  1096.             break;
  1097.           case (3):
  1098.             if (frmval2(&xx,'$')) ERROR;
  1099.             if (xx<0||xx>65535) ERROR;
  1100.             rsyn=xx;hwric();
  1101.             break;
  1102.           default:
  1103.             serr();
  1104.           }
  1105.         break;
  1106.         }
  1107.       ps--;
  1108.       if ((LONG)(sta=getadr())<0) ERROR;
  1109.       x=getbytes(cl);if (gcla()) ERROR;
  1110.       hwric();if (x==0) break;
  1111.       for (y=0;y<x;y++) *sta++=cl[y];
  1112.       sp=0;adds(".e ");addax((ULONG)sta);app(' ');wril();bf=-1;
  1113.       break;
  1114.     case ('l'):
  1115.       if (gcl()=='s')
  1116.         {
  1117.         ps++;if ((nam=getnam())==0) ERROR;
  1118.         if (gcla()) ERROR;
  1119.         hwric();
  1120.         if ((xx=loadseg(nam))==0) break;
  1121.         sp=0;adds("Segment: $");addax((ULONG)BADDR(xx));wrilc();
  1122.         break;
  1123.         }
  1124.       for (x=0;;)
  1125.         {
  1126.         if (gcl()=='i'&&(x&4)==0) {ps++;x|=4;}
  1127.         else if (gcl()=='y'&&(x&2)==0) {ps++;x|=2;}
  1128.         else if (gcl()=='b'&&(x&1)==0) {ps++;x|=1;}
  1129.         else break;
  1130.         }
  1131.       if ((nam=getnam())==0) ERROR;
  1132.       if ((LONG)(sta=getadr())<0) ERROR;
  1133.       if (gcl())
  1134.         {
  1135.         if ((LONG)(zad=getadr())<0) ERROR;
  1136.         }
  1137.       else zad=sta;
  1138.       if (gcla()) ERROR;
  1139.       hwric();
  1140.       if (x&1) {if ((ULONG)sta&3) {pril("Bad address");break;}}
  1141.       load(nam,sta,x,zad-sta);
  1142.       break;
  1143.     case ('L'):
  1144.       if ((nam=getnam())==0) ERROR;
  1145.       if ((LONG)(sta=getadr())<0) ERROR;
  1146.       if (gcla()) ERROR;
  1147.       hwric();
  1148.       if ((fh=Open(nam,MODE_OLDFILE))==0) {pril("File not found");break;}
  1149.       st[0]='$';sp=1;addax((ULONG)sta);adds(" - $");
  1150.       while ((x=Read(fh,sta,0x1000000))>0) sta+=x;
  1151.       if (x<0) pril("Error while loading"); else {addax((ULONG)(sta-1));wrilc();}
  1152.       Close(fh);
  1153.       break;
  1154.     case ('u'):
  1155.       if (gcla()!='s') ERROR;
  1156.       if ((x=(LONG)getadr())<0) ERROR;
  1157.       if (gcla()) ERROR;
  1158.       hwric();if (x&3) {pril(snoseg);break;}
  1159.       UnLoadSeg(x>>2);
  1160.       break;
  1161.     case ('S'):
  1162.       if ((c=gcl())=='+') ps++;
  1163.       if ((nam=getnam())==0) ERROR;
  1164.       if ((LONG)(sta=getadr())<0) ERROR;
  1165.       if ((LONG)(ena=getadr())<0) ERROR;
  1166.       if (gcla()) ERROR;
  1167.       hwric();
  1168.       if ((fh=Open(nam,(c=='+')?MODE_READWRITE:MODE_NEWFILE))==0) {cnopen(file);break;}
  1169.       if (c=='+') Seek(fh,0,OFFSET_END);
  1170.       if (writebytes(fh,sta,ena-sta+1)) pril("Error while writing");
  1171.       Close(fh);
  1172.       break;
  1173.     case ('s'):
  1174.       if ((nam=getnam())==0) ERROR;
  1175.       if ((LONG)(sta=getadr())<0) ERROR;
  1176.       if ((LONG)(ena=getadr())<0) ERROR;
  1177.       zad=0;if (gcl()) if ((LONG)(zad=getadr())<0) ERROR;
  1178.       if (gcla()) ERROR;
  1179.       hwric();x=ena-sta;
  1180.       if (x<0) break;
  1181.       sav(nam,sta,x+1,zad);
  1182.       break;
  1183.     case ('t'):
  1184.       switch (gcla())
  1185.         {
  1186.         case ('l'):
  1187.           c=gcl();sta=0;
  1188.           if (c==0 || ps[cl+1]==0)
  1189.             switch(c)
  1190.               {
  1191.               case( 0 ): sta=(char *)&(*(struct ExecBase **)4L)->LibList;break;
  1192.               case('r'): sta=(char *)&(*(struct ExecBase **)4L)->ResourceList;break;
  1193.               case('d'): sta=(char *)&(*(struct ExecBase **)4L)->DeviceList;break;
  1194.               case('p'): sta=(char *)&(*(struct ExecBase **)4L)->PortList;break;
  1195.               case('i'): sta=(char *)&(*(struct ExecBase **)4L)->IntrList;break;
  1196.               case('y'): sta=(char *)&(*(struct ExecBase **)4L)->TaskReady;break;
  1197.               case('t'): sta=(char *)&(*(struct ExecBase **)4L)->TaskWait;break;
  1198.               }
  1199.           if (sta==0) if ((LONG)(sta=geteadr())<0) ERROR;
  1200.           hwric();pril("Node    Type Pri  Name");
  1201.           for (ln= *(struct Node **)sta;;ln=ln->ln_Succ)
  1202.             {
  1203.             if ((ULONG)ln&1) break;
  1204.             if (ln->ln_Succ==0) break;
  1205.             clearl();
  1206.             app('$');addax((ULONG)ln);app(':');app(' ');
  1207.             app('$');addbx(ln->ln_Type);app(' ');
  1208.             addd(ln->ln_Pri);
  1209.             if (sta=ln->ln_Name) {sp=18;addsc(sta);}
  1210.             wril();if (chqc()) break;
  1211.             }
  1212.           break;
  1213.         case ('s'):
  1214.           if ((LONG)(sta=getadr())<0) ERROR;
  1215.           hwric();if ((ULONG)sta&3) {pril(snoseg);break;}
  1216.           pril(iins);
  1217.           for (x=1;sta;x++,sta=(UBYTE *)BADDR(*(ULONG *)(sta)))
  1218.             {
  1219.             clearl();addd(x);sp=4;app('$');addax((ULONG)(sta+4));
  1220.             app('-');app('$');y=*(ULONG *)(sta-4);
  1221.             addax((ULONG)(sta+y));app(' ');app('$');addax(y);
  1222.             wril();if (chqc()) break;
  1223.             }
  1224.           break;
  1225.         case ('b'):
  1226.           if ((LONG)(sta=getadr())<0) ERROR;
  1227.           hwric();
  1228.           while(sta)
  1229.             {
  1230.             e=(ULONG)BADDR(sta);
  1231.             sta=(UBYTE *)*(ULONG *)e;e+=4;
  1232.             sp=0;adds("Start: $");addax(e);
  1233.             x=e+(ULONG)BADDR(*(ULONG *)e)-4;
  1234.             adds("  End: $");addax((ULONG)(x+3));
  1235.             adds("  Highest global: (");addd(*(ULONG *)x*4);app(')');
  1236.             wrilc();
  1237.             for (;;)
  1238.               {
  1239.               x-=4;a=*(ULONG *)x;if (a==0) break;
  1240.               x-=4;b=*(ULONG *)x;
  1241.               clearl();st[1]='(';sp=2;addd(b*4);app(')');sp=8;adds("= $");
  1242.               addax((ULONG)(e+a));
  1243.               wril();if (chqc()) {sta=0;break;}
  1244.               }
  1245.             }
  1246.           break;
  1247.         case ('f'):
  1248.           if (gcl()==0) nam=":S/STARTUP-SEQUENCE";
  1249.           else if ((nam=getnam())==0) ERROR;
  1250.           hwric();
  1251.           if ((fh=Open(nam,MODE_OLDFILE))==0) {cnopen(file);break;}
  1252.           for (sp=x=0;;)
  1253.             {
  1254.             if (x==0) if ((x=Read(fh,cl,XXX+1))<1) break; else z=0;
  1255.             c=cl[z++];x--;
  1256.             if (c==9)
  1257.               {
  1258.               if (sp>=((XXX-1)&~7)) c=10;
  1259.               else
  1260.                 {
  1261.                 do app(' '); while (sp&7);
  1262.                 continue;
  1263.                 }
  1264.               }
  1265.             if (c==10||sp>XXX-2)
  1266.               {
  1267.               wril();sp=0;if (chqc()) break;
  1268.               }
  1269.             if (c!=10) addc(c);
  1270.             }
  1271.           Close(fh);
  1272.           if (sp) wrilc();
  1273.           if (x<0) pril("Error while reading");
  1274.           break;
  1275.         default:serr();
  1276.         }
  1277.       break;
  1278.     default:serr();
  1279.     }
  1280.   }
  1281.  
  1282. irq.io_Command=IND_REMHANDLER;
  1283. DoIO((struct IORequest *)&irq);
  1284.  
  1285. proc->pr_WindowPtr=owi;
  1286.  
  1287. fin:
  1288. if (ofh) Close(ofh);
  1289. if (irq.io_Device) CloseDevice((struct IORequest *)&irq);
  1290. if (rq.io_Device) CloseDevice((struct IORequest *)&rq);
  1291. if (monp.mp_SigBit!=-1) FreeSignal(monp.mp_SigBit);
  1292. if (crqp.mp_SigBit!=-1) FreeSignal(crqp.mp_SigBit);
  1293. if (stack) FreeMem(stack,ssize);
  1294. if (abuf) FreeMem(abuf,bsize);
  1295. if (charbuf) FreeMem(charbuf,8*256);
  1296. if (scrbuf) FreeMem(scrbuf,XXX*8);
  1297. if (wi) CloseWindow(wi);
  1298. if (sc) CloseScreen(sc);
  1299. if (GfxBase) CloseLibrary((struct Library *)GfxBase);
  1300. if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
  1301. }
  1302.  
  1303. void
  1304. gottrap()
  1305. {
  1306. if (trpv==0) return;
  1307. sp=0;adds("Trap #");addd(trpv);adds(" at $");addax(regs[16]);wrilc();
  1308. }
  1309.  
  1310.  
  1311.  
  1312. void
  1313. showregs()
  1314. {
  1315. register x,y;
  1316. sp=0;
  1317. for (x=0;x<20;x++)
  1318.   {
  1319.   if (sp>51) {wrilc();sp=0;}
  1320.   if (sp==0) adds(".r");
  1321.   app(' ');app(rl1[x]);app(rl2[x]);
  1322.   adds("=$");y=regs[x];
  1323.   if (x<17) addlx(y);
  1324.   else if (x==17) addwx((UWORD)y);
  1325.   else addbx((UBYTE)y);
  1326.   }
  1327. if (sp) wrilc();
  1328. }
  1329.  
  1330. void
  1331. showsr()
  1332. {
  1333. pril("       t-s--iii---xnzvc");
  1334. sp=0;adds(".r sr=%");addwb((UWORD)regs[17]);
  1335. wrilc();
  1336. }
  1337.  
  1338. char fibb[8]={'h','s','p','a','r','w','e','d'};
  1339.  
  1340. void
  1341. shi()
  1342. {
  1343. register int x,y;
  1344. clearl();addsc(fib.fib_FileName);sp=31;
  1345. if (fib.fib_EntryType>0) adds("Dir"); else addd(fib.fib_Size);
  1346. sp=40;x=fib.fib_Protection^15;
  1347. for (y=0;y<8;y++,x<<=1) if (x&0x80) app(fibb[y]); else app('-');
  1348. sp=49;adddt(&fib.fib_Date);
  1349. wril();
  1350. }
  1351.  
  1352.  
  1353. changemem(adr)
  1354. UBYTE *adr;
  1355. {
  1356. register UBYTE f,x,c;
  1357. register int s;
  1358. x=f=s=0;
  1359. for (;;)
  1360.   {
  1361.   c=gcla();
  1362.   if (c>='0'&&c<='9') x=(x<<4)+c-'0';
  1363.   else if (c>='a'&&c<='f') x=(x<<4)+c-('a'-10);
  1364.   else
  1365.     {
  1366.     if (f||c!=' ') break; else {f=1;continue;}
  1367.     }
  1368.   if (f==2) {cl[s++]=x;x=f=0;} else f=2;
  1369.   }
  1370. if (f==2||(c!=' '&&c!=0)) return(-1);
  1371. for (x=0;x<s;x++) adr[x]=cl[x];
  1372. return(s);
  1373. }
  1374.  
  1375.  
  1376.  
  1377. ULONG
  1378. loadseg(nam)
  1379. char *nam;
  1380. {
  1381. register ULONG xx;
  1382. if ((xx=LoadSeg(nam))==0)
  1383.   if (IoErr()==ERROR_FILE_NOT_OBJECT) pril("Not an object module");
  1384.   else pril("File not found");
  1385. return(xx);
  1386. }
  1387.  
  1388. void
  1389. binfo()
  1390. {
  1391. register ULONG *bb,ty,st;
  1392.  
  1393. binfoh("BLOCK");addd(cbl);wrilc();
  1394. bb=(ULONG *)bbuf;
  1395. ty=bb[0];st=bb[bsize4-1];
  1396. binfoh("Type");
  1397. if (ty==2&&(st==1||st==2||st==-3)) adds("short");
  1398. else if (ty==8) {adds("data");st=0;}
  1399. else if (ty==16&&st==-3) adds("list");
  1400. else {adds("no DOS block");wrilc();return;}
  1401. wrilc();ty+=st;
  1402. if (ty!=3) {binfoh("Header key");addd(bb[1]);wrilc();}
  1403. if (ty==-1||ty==13) {binfoh("Number of blocks");addd(bb[2]);wrilc();}
  1404. if (ty==8) {binfoh("Sequence number");addd(bb[2]);wrilc();}
  1405. if (ty!=3&&ty!=4) {binfoh("Data size");addd(bb[3]);wrilc();}
  1406. if (ty==-1||ty==13) {binfoh("First data block");addd(bb[4]);wrilc();}
  1407. if (ty==8) {binfoh("Next data block");addd(bb[4]);wrilc();}
  1408. binfoh("Checksum");app('$');addlx(bb[5]);
  1409. adds((blchk()==bb[5])?" (correct)":" (wrong)");
  1410. wrilc();if (ty==8) return;
  1411. if (ty==3) {binfoh("Bitmap");adds((bb[bsize4-50])?"valid":"not valid");wrilc();}
  1412. if (ty!=13) {binfoh("Name");addbname4((ULONG)bbuf+bsize-80);wrilc();}
  1413. if (ty==4||ty==-1) {binfoh("Hashchain");addd(bb[bsize4-4]);wrilc();}
  1414. if (ty!=3) {binfoh("Parent");addd(bb[bsize4-3]);wrilc();}
  1415. if (ty==-1||ty==13) {binfoh("Extension");addd(bb[bsize4-2]);wrilc();}
  1416. binfoh("Secondary type");
  1417. if (st==1) adds("root");
  1418. else if (st==2) adds("user dir");
  1419. else adds(file);
  1420. wrilc();
  1421. }
  1422.  
  1423.  
  1424. void
  1425. shhunt(x)
  1426. int x;
  1427. {
  1428. register int y;
  1429. adds("hunting ");if (huc) adds("(UC==lc) ");
  1430. adds("for: ");
  1431. for (y=0;y<x;y++) {app(' ');addbx(cl[y]);if (sp>XXX-5) {wrilc();sp=0;}}
  1432. if (sp) wrilc();
  1433. }
  1434.  
  1435. trackbl(bl,bu,cm)
  1436. int bl;
  1437. char *bu;
  1438. UWORD cm;
  1439. {
  1440. return (etrackbl(bl,bu,cm,1,1));
  1441. }
  1442.  
  1443. etrackbl(bl,bu,cm,blstep,blnum)
  1444. int bl;
  1445. char *bu;
  1446. UWORD cm;
  1447. ULONG blstep,blnum;
  1448. {
  1449. register x,y;
  1450. char *bu2;
  1451.  
  1452. if (device==0) {pril("No device selected!");return(-1);}
  1453. if (OpenDevice((char *)device,unit,(struct IORequest *)&trq,flags)) {cnopen((char *)device);return(-1);}
  1454. if (cm==CMD_CLEAR) {trq.io_Command=CMD_CLEAR;return(DoIO((struct IORequest *)&trq));}
  1455. trq.io_Command=TD_CHANGESTATE;DoIO((struct IORequest *)&trq);
  1456. if (trq.io_Actual) {pril("No disk in drive");return(-1);}
  1457. if (cm==CMD_WRITE||cm==TD_FORMAT)
  1458.   {
  1459.   trq.io_Command=TD_PROTSTATUS;DoIO((struct IORequest *)&trq);
  1460.   if (trq.io_Actual) {pril("Disk is write-protected!");return(-1);}
  1461.   }
  1462. trq.io_Length=(cm==TD_RAW)?blnum:bsize*blstep;
  1463. trq.io_Command=(cm==TD_HUNT)?CMD_READ:cm; /* TD_RAW==TD_SEEK */
  1464. for (;;)
  1465.   {
  1466.   bu2=bu+trq.io_Length;
  1467.   if ((typeofmem(bu)&typeofmem(bu2-1)&memtyp)!=memtyp) {pril("Buffer has wrong memory type or bad location!");x=-1;break;}
  1468.   trq.io_Data=(APTR)bu;
  1469.   trq.io_Offset=bl*bsize;
  1470.   x=DoIO((struct IORequest *)&trq);
  1471.   if (cm==TD_RAW)
  1472.     {
  1473.     if (x==0) x=doraw(blstep,bu,blnum);
  1474.     blstep=0;
  1475.     }
  1476.   if (x==-1) break;
  1477.   addblk(bl,blstep==1);
  1478.   blnum-=blstep;
  1479.   if (cm==TD_HUNT)
  1480.     {
  1481.     if (x==0)
  1482.       {
  1483.       hwril();clearcs();put(13);cx=0;
  1484.       if (anz) hunt(bu,bu2,cl,anz,-1,bl);
  1485.       bl+=blstep;if (chq()||blnum==0) {clearcs();break;}
  1486.       continue;
  1487.       }
  1488.     else bu2=bu;
  1489.     }
  1490.   adds("Err:");y=sp;addd(x);
  1491.   if (bu!=bu2) {sp=y+4;app('$');addax((ULONG)bu);app('-');app('$');addax((ULONG)(bu2-1));}
  1492.   if (cm!=TD_FORMAT) bu=bu2;
  1493.   wril();
  1494.   bl+=blstep;
  1495.   if (blnum==0||cm==TD_RAW) {wric();break;}
  1496.   if (chqc()) break;
  1497.   }
  1498. if (cm==CMD_WRITE)
  1499.   {
  1500.   trq.io_Command=CMD_UPDATE;x=DoIO((struct IORequest *)&trq);
  1501.   if (x!=0) {sp=0;adds("Update error: ");addd(x);wrilc();}
  1502.   }
  1503. trq.io_Command=TD_MOTOR;trq.io_Length=0;DoIO((struct IORequest *)&trq);
  1504. CloseDevice((struct IORequest *)&trq);
  1505. return(x);
  1506. }
  1507.  
  1508.  
  1509.