* added compilers lcc and bcc (linux86)
[mascara-docs.git] / compilers / linux86-0.16.17 / bootblocks / commands.c
blobd39aa60e28f74e1ebbe5a9d66ee5e401abac9329
2 #include "monitor.h"
4 int cmd_type(ptr)
5 char * ptr;
7 char * fname;
8 char buffer[1024];
9 long len;
11 while(*ptr == ' ') ptr++;
12 if( (fname=ptr) == 0 ) return 0;
13 while(*ptr & *ptr != ' ') ptr++;
15 if( open_file(fname) >= 0 ) for(len=file_length(); len>0; len-=1024)
17 if( read_block(buffer) < 0 ) break;
18 if( len > 1024 )
19 write(1, buffer, 1024);
20 else
21 write(1, buffer, len);
23 else
24 printf("Cannot open file '%s'\n", fname);
25 close_file();
26 return 0;
29 #ifndef NOCOMMAND
30 extern unsigned int current_address;
31 extern int number_base;
33 int cmd_quit(args)
34 char * args;
36 printf("Bye\n");
37 exit(0);
40 int cmd_nop(ptr)
41 char * ptr;
45 int cmd_dir(ptr)
46 char * ptr;
48 open_file(".");
49 return 0;
52 int cmd_more(ptr)
53 char * ptr;
55 char * fname;
56 char buffer[1024];
57 long len;
58 int cc;
59 char * sptr;
61 while(*ptr == ' ') ptr++;
62 if( (fname=ptr) == 0 ) return 0;
63 while(*ptr & *ptr != ' ') ptr++;
65 more_char(-1);
67 if( open_file(fname) >= 0 ) for(len=file_length(); len>0; len-=1024)
69 if( read_block(buffer) < 0 ) break;
70 if( len > 1024 ) cc = 1024; else cc = len;
71 for(sptr=buffer; cc>0 ; cc--,sptr++)
73 if( more_char(*sptr & 0xFF) < 0 ) goto break_break;
76 else
77 printf("Cannot open file '%s'\n", fname);
78 break_break:;
79 close_file();
80 return 0;
83 more_char(ch)
84 int ch;
86 static int line_number = 0;
88 if( ch == -1 ) { line_number = 0; return 0; }
90 if( (ch & 0xE0 ) || ch == '\n' )
91 putchar(ch);
92 if( ch == '\n' && ++line_number == 24)
94 char buf[4];
95 printf("More ?"); fflush(stdout);
96 if( read(0, buf, 1) <= 0 ) return -1;
97 if( buf[0] == 3 || buf[0] == '\033'
98 || buf[0] == 'q' || buf[0] == 'Q' ) return -1;
99 if( buf[0] == '\r' ) line_number--;
100 if( buf[0] == ' ' ) line_number=2;
101 printf("\r \r");
103 return 0;
106 more_strn(str, len)
107 char * str;
108 int len;
110 for(; len>0 && *str ; len--,str++)
111 if( more_char( *str & 0xFF ) < 0 ) return -1;
112 return 0;
114 #endif
116 /**************************************************************************/
118 #ifndef NOMONITOR
120 cmd_monhelp() {
121 static char * helps[] = {
122 "Monitor help\n",
123 "zimage filename [args] Start Linux-386\n",
124 "bzimage filename [args] Start Linux-386\n",
125 "=filename [args] Start Linux-386\n",
126 "quit Reboot\n",
127 "help Display help file\n",
128 "dir Display directory\n",
129 "type Display file to screen\n",
130 "more Display file to screen\n",
131 "m[em] [address] Hexdump memory\n",
132 "seg [val] Set/show default segment\n",
133 "rel [segment] Relocate this program\n",
134 "base [val] Set default number base (or 'n' cmd)\n",
135 "init Re-init program\n",
136 "r[egs] Display register values\n",
140 char **p = helps;
141 more_char(-1);
143 while(*p)
144 if( more_strn(*p, strlen(*p)) <0 )
145 break;
146 else
147 p++;
148 printf("\n");
149 return 0;
152 cmd_regs()
154 #ifdef __STANDALONE__
155 printf(": AX=%04x BX=%04x CX=%04x DX=%04x SI=%04x DI=%04x",
156 __argr.x.ax, __argr.x.bx, __argr.x.cx, __argr.x.dx,
157 __argr.x.si, __argr.x.di);
158 printf(" CF=%x", __argr.x.cflag);
159 printf(" CS=%04x DS=%04x ES=%04x\n", __get_cs(), __get_ds(), __get_es());
160 #else
161 printf("Only in standalone\n");
162 #endif
165 int cmd_memdump(ptr)
166 char * ptr;
168 int count = 128;
169 int i,j;
170 int es = __get_es();
172 #define rmem(x) __peek_es( (x)+current_address )
174 getnum(&ptr, &current_address);
175 getnum(&ptr, &count);
177 for(i=0; i<count; i+=16)
179 printf("%04x:%04x:", es, current_address);
180 for(j=0; j<16; j++)
181 printf(" %s%02x", (j==8)?" ":"", rmem(j));
182 printf(" ");
183 for(j=0; j<16; j++)
184 if( rmem(j) >= ' ' && rmem(j) <= '~' )
185 putchar(rmem(j));
186 else
187 putchar('.');
188 putchar('\n');
189 current_address += 16;
190 current_address &= 0xFFFF;
193 #undef rmem
196 int cmd_seg(ptr)
197 char * ptr;
199 int es = __get_es();
201 if( getnum(&ptr, &es) )
203 __set_es(es);
204 current_address = 0;
206 else
207 printf("Current segment 0x%04x\n", es);
208 return 0;
211 int cmd_set_base(ptr)
213 int obase = number_base;
214 int nbase;
215 number_base = 10;
217 if( getnum(&ptr, &nbase) )
219 if( nbase < 2 || nbase > 36 )
220 printf("Can't use that base\n");
221 else
222 obase = nbase;
224 else printf("Current base is %d\n", obase);
226 number_base = obase;
227 return 0;
230 int cmd_rel(ptr)
231 char * ptr;
233 int nseg = 0xFFFF;
234 int cs = __get_cs();
236 getnum(&ptr, &nseg);
238 relocator(nseg);
239 if( __get_cs() == cs )
240 printf("Didn't relocate; CS=$%04x DS=$%04x\n", __get_cs(), __get_ds());
241 else
242 printf("Relocated to CS=$%04x DS=$%04x\n", __get_cs(), __get_ds());
244 #endif