summaryrefslogtreecommitdiff
path: root/devel/debug/1/src/info
blob: 31099c6d66f63f63b9167f7a50a85310563639f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
PACKET info DEFINES info:

(**********************************************************************)
(**                                                                  **)
(**   M i n i - I N F O        Autor: G. Szalay     Stand: 87-04-03  **)
(**                                                                  **)
(**********************************************************************)

LET charset = "1234567890ß'qwertzuiopü+asdfghjklöä#<yxcvbnm,.-
!""§$%&/()=?`QWERTZUIOPÜ*ASDFGHJKLÖÄ^>YXCVBNM;:_ ",
    hextab = "0123456789abcdef", stdds = 0,
    cr = ""13"", cr rubout = ""13""12"",
    up down left right = ""3""10""8""2"";
TEXT VAR buf, linebuf, bytes, hexbytes, char,
         search param := ""255"", search buffer,
         first byte, hex search param := "ff", search mode := "h";
INT VAR drid := stdds, adr hi := 2, adr lo := 0, lines := 4,
        begin hi := adr hi, begin lo := adr lo, first word,
        saddr hi, saddr lo,
        no of found bytes, cur xx, cur x, cur y, ymin, ymax,
        xmin := 9, xmidlo := xmin + 21,
        xmidhi := xmidlo + 5, xmax := xmidhi + 21,
        word, byte, i, l;
INT CONST mask 00ff := dec ("00ff"),
          mask ff00 := dec ("ff00"),
          offs mask := dec ("0007"),
          addr mask := dec ("fff8");
BOOL VAR found, low byte flag := TRUE, interrupted,
         area 2 nonchangeable := id (1) <> 4 (*i.e. other than 68000*);

PROC wait for (TEXT CONST chars):
  inchar (char);
  WHILE pos (chars, char) = 0
  REP out (""7""); inchar (char) PER
END PROC wait for;

PROC info:
  info (drid, begin hi, begin lo, lines)
END PROC info;

PROC info (INT CONST start drid, start addr hi, start addr lo, start len):
  drid := start drid;
  begin hi := start addr hi;
  begin lo := start addr lo;
  lines := start len;
  line; line; show dump;
  command loop.

command loop:
  REP
    zeige kommandoliste;
    kommando lesen und ausfuehren
  PER.

zeige kommandoliste:
  putline (""15"INFO: more, address, dsid, lines, find, or quit"14"").

kommando lesen und ausfuehren:
  inchar (char);
  SELECT pos ("damlfq"3"", char) OF
    CASE 1: drid command
    CASE 2: addr command
    CASE 3: more command
    CASE 4: len command
    CASE 5: find command
    CASE 6: quit command
    CASE 7: up command
    OTHERWISE more command
  END SELECT.

quit command: LEAVE command loop.

drid command:
  out ("dsid="); gethex (buf); drid := dec (buf);
  IF drid > 0 AND drid < 4 OR drid > 255
  THEN beep; drid := stdds
  ELIF drid = 4
  THEN drid := stdds
  FI;
  found := FALSE;
  show dump.

len command:
  out ("lines="); gethex (buf); lines := dec (buf); show dump.

addr command:
  out ("address=");
  gethex (buf);
  IF LENGTH buf < 5
  THEN begin hi := 0; begin lo := dec (buf)
  ELSE begin hi := dec (subtext (buf, 1, LENGTH buf - 4));
       begin lo := dec (subtext (buf, LENGTH buf - 3))
  FI;
  low byte flag := TRUE; found := FALSE;
  show dump.

more command:
  begin hi := adr hi; begin lo := adr lo;
  low byte flag := TRUE; found := FALSE;
  line; show dump.

show dump:
  interrupted := FALSE;
  get cursor (cur x, cur y);
  cursor (1, cur y - 2);
  out ("---------------------------- dsid=");
  IF drid = stdds THEN out ("04") ELSE outsubtext (hex (drid), 3) FI;
  putline (" --------------------");
  adr hi := begin hi;
  adr lo := begin lo AND addr mask;
  FOR l FROM 1 UPTO lines REP
    buf := "  "; linebuf := " "; bytes := "";
    out (txt (adr hi)); out (hex (adr lo) CT ":  ");
    IF adr hi = 8
    THEN out ("_________e_n_d___o_f___d_a_t_a_s_p_a_c_e_________");
         line; beep; LEAVE show dump
    FI;
    FOR i FROM 1 UPTO 8 REP
      word := dsgetw (drid, adr hi, adr lo);
      replace (buf, 1, word); rotate (word, 8); hexbytes := hex (word);
      IF adr lo <> begin lo
      THEN outsubtext (hexbytes, 1, 2); out (" ");
           outsubtext (hexbytes, 3) ; out (" ")
      ELIF low byte flag
      THEN out (""8"-"); outsubtext (hexbytes, 1, 2); out ("-");
           outsubtext (hexbytes, 3); out (" ")
      ELSE outsubtext (hexbytes, 1, 2); out ("-");
           outsubtext (hexbytes, 3); out ("-")
      FI;
      IF i = 4 THEN out ("  ") FI;
      bytes CAT buf;
      incl (adr hi, adr lo, 1)
    PER;
    FOR i FROM 1 UPTO 16 REP
      IF pos (charset, bytes SUB i) = 0 THEN replace (bytes, i, ".") FI
    PER;
    out ("   "); outsubtext (bytes, 1, 8);
    out (" "); outsubtext (bytes, 9); line;
    IF incharety <> "" THEN interrupted := TRUE; LEAVE show dump FI
  PER.

up command:
  IF change not allowed THEN beep; reposit cursor; LEAVE up command FI;
  get cursor (cur x, cur y);
  ymax := cur y - 2; ymin := ymax - lines + 1;
  cur x := xmin + (begin lo AND offs mask) * 6;
  IF cur x > xmidlo THEN cur x INCR 2 FI;
  IF NOT low byte flag THEN cur x INCR 3 FI;
  cur y := ymin;
  cursor (cur x, cur y);
  REP inchar (char);
      IF pos (up down left right, char) > 0 THEN move cursor
      ELIF pos (hextab, char) > 0 THEN read byte and move cursor
      ELIF char <> cr THEN beep
      FI
  UNTIL char = cr PER;
  cursor (1, ymax + 2); line; show dump.

change not allowed:
  interrupted OR area 2 nonchangeable AND area 2 of stdds in window.

area 2 of stdds in window:
  drid = stdds AND
  (begin hi = 2 OR
  begin hi = 1 AND begin lo < 0 AND lines * 8 + begin lo > 0).

read byte and move cursor:
  out (char); byte := pos (hextab, char) - 1;
  wait for (hextab);
  out (char); byte := pos (hextab, char) - 1 + 16 * byte;
  out (""8""8"");
  eval cursor address and modify word;
  char := ""2""; move cursor.

eval cursor address and modify word:
  adr hi := begin hi; adr lo := begin lo AND addr mask;
  incl (adr hi, adr lo, ((cur y - ymin)*8 + (cur x - xmin) DIV 6));
  word := dsgetw (drid, adr hi, adr lo);
  IF high byte read
  THEN rotate (byte, 8); word := (word AND mask 00ff) OR byte
  ELSE word := (word AND mask ff00) OR byte
  FI;
  dsputw (drid, adr hi, adr lo, word).

high byte read:
  cur xx := cur x; IF cur xx > xmidlo THEN cur xx DECR 2 FI;
  cur xx MOD 6 < 3.

move cursor:
  SELECT pos (up down left right, char) OF
    CASE 1: IF cur y = ymin THEN beep ELSE cur y DECR 1 FI
    CASE 2: IF cur y = ymax THEN beep ELSE cur y INCR 1 FI
    CASE 3: IF cur x = xmin THEN IF cur y = ymin THEN beep
                                 ELSE cur y DECR 1; cur x := xmax
                                 FI
                            ELIF cur x = xmidhi THEN cur x DECR 5
                            ELSE cur x DECR 3 FI
    CASE 4: IF cur x = xmax THEN IF cur y = ymax THEN beep
                                 ELSE cur y INCR 1; cur x := xmin
                                 FI
                            ELIF cur x = xmidlo THEN cur x INCR 5
                            ELSE cur x INCR 3 FI
  ENDSELECT;
  cursor (cur x, cur y).

beep: out (""7"").

reposit cursor: out (""3"").

find command:
  out ("find: hex, char, or last param? (h/H/c/C/<CR>)");
  wait for ("hHcC"13"");
  saddr hi := begin hi; saddr lo := begin lo;
  IF   char = "c" OR char = "C"
  THEN out (char); get char string; low byte flag := NOT low byte flag
  ELIF char = "h" OR char = "H"
  THEN out (char); get hex string; low byte flag := NOT low byte flag
  ELSE out (search mode);
       IF pos ("cC", search mode) > 0
       THEN out (search param)
       ELSE out (hex search param)
       FI;
       IF NOT found THEN low byte flag := NOT low byte flag
       ELIF NOT low byte flag OR pos ("CH", search mode) > 0
       THEN incl (saddr hi, saddr lo, 1)
       FI
  FI;
  out (cr); (*acknowledge CR*)
  search string;
  line; show dump.

get char string:
  search mode := char;
  search param := "";
  REP inchar (char);
      SELECT pos (cr rubout, char) OF
        CASE 1: IF search param = "" THEN beep ELSE LEAVE get char string FI
        CASE 2: delete last char
        OTHERWISE search param CAT char; out (char)
      ENDSELECT
  PER.

delete last char:
  IF search param = ""
  THEN beep
  ELSE search param := subtext (search param, 1, LENGTH search param - 1);
       out (""8" "8"")
  FI.

get hex string:
  search mode := char;
  search param := "";
  REP wait for (hextab CT cr rubout);
      SELECT pos (cr rubout, char) OF
        CASE 1: IF NOT regular hex string THEN beep; char :="" FI
        CASE 2: delete last char
        OTHERWISE search param CAT char; out (char)
      ENDSELECT
  UNTIL char = cr PER;
  hex search param := search param;
  search param := "";
  FOR i FROM 1 UPTO LENGTH hex search param DIV 2 REP
    char := hex search param SUB i;
    word := pos (hextab, hex search param SUB (2*i-1)) - 1;
    word := word * 16 + pos (hextab, hex search param SUB (2*i)) - 1;
    search param CAT code (word)
  PER.

regular hex string:
  LENGTH search param > 0 AND (LENGTH search param AND 1) = 0.

search string:
  first byte := search param SUB 1; buf := "  ";
  IF LENGTH search param > 1 THEN first word := search param ISUB 1 FI;
  REP IF pos ("ch", search mode) > 0
      THEN search first byte or word
      ELSE search first word
      FI;
      search rest if any;
      IF found THEN begin hi := saddr hi; begin lo := saddr lo;
                    LEAVE search string
      FI;
      IF NOT low byte flag THEN incl (saddr hi, saddr lo, 1) FI
  PER.

search first byte or word:
  REP
    IF saddr hi = 8 THEN LEAVE search first byte or word FI;
    word := dsgetw (drid, saddr hi, saddr lo);
    replace (buf, 1, word);
    IF NOT low byte flag AND (buf SUB 1) = first byte
    THEN IF LENGTH search param = 1
         THEN low byte flag := TRUE; no of found bytes := 1;
              LEAVE search first byte or word
         ELIF (buf SUB 2) = (search param SUB 2)
         THEN low byte flag := TRUE; no of found bytes := 2;
              LEAVE search first byte or word
         ELSE look in high byte
         FI
    ELSE look in high byte
    FI;
    low byte flag := FALSE;
    incr search address and provide for interaction
  PER.

search first word:
  REP
    IF saddr hi = 8 THEN LEAVE search first word FI;
    word := dsgetw (drid, saddr hi, saddr lo);
    IF LENGTH search param = 1
    THEN replace (buf, 1, word);
         IF (buf SUB 1) = first byte
         THEN low byte flag := TRUE; no of found bytes := 1;
              LEAVE search first word
         FI
    ELSE IF word = first word
         THEN low byte flag := TRUE; no of found bytes := 2;
              LEAVE search first word
         FI
    FI;
    incr search address and provide for interaction
  PER.

look in high byte:
  IF (buf SUB 2) = first byte
  THEN low byte flag := FALSE; no of found bytes := 1;
       LEAVE search first byte or word
  FI.

incr search address and provide for interaction:
  incl (saddr hi, saddr lo, 1);
  IF incharety <> ""
  THEN cursor (64, 24); out ("--- interrupted"); line; line;
       begin hi := saddr hi; begin lo := saddr lo;
       LEAVE search string
  FI.

search rest if any:
  found := TRUE;
  IF LENGTH search param = no of found bytes OR saddr hi = 8
  THEN LEAVE search rest if any
  FI;
  IF low byte flag
  THEN search buffer := subtext (search param, 3)
  ELSE search buffer := subtext (search param, 2)
  FI;
  adr hi := saddr hi; adr lo := saddr lo;
  FOR i FROM 1 UPTO (LENGTH search param - no of found bytes) DIV 2 REP
    incl (adr hi, adr lo, 1);
    word := dsgetw (drid, adr hi, adr lo);
    IF (search buffer ISUB i) = word
    THEN no of found bytes INCR 2
    ELSE found := FALSE
    FI
  UNTIL NOT found PER;
  IF found AND LENGTH search param > no of found bytes
  THEN search last byte
  FI.

search last byte:
  incl (adr hi, adr lo, 1);
  word := dsgetw (drid, adr hi, adr lo);
  replace (buf, 1, word);
  found := (buf SUB 1) = (search param SUB length (search param)).

END PROC info;

(* info *)      (****)

END PACKET info;