OpenCores
URL https://opencores.org/ocsvn/w11/w11/trunk

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.5/] [tools/] [bin/] [tmuconv] - Blame information for rev 36

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 wfjm
#!/usr/bin/perl -w
2
# $Id: tmuconv 314 2010-07-09 17:38:41Z mueller $
3
#
4
# Copyright 2008-2010 by Walter F.J. Mueller 
5
#
6
# This program is free software; you may redistribute and/or modify it under
7
# the terms of the GNU General Public License as published by the Free
8
# Software Foundation, either version 2, or at your option any later version.
9
#
10
# This program is distributed in the hope that it will be useful, but
11
# WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
12
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13
# for complete details.
14
#
15
#  Revision History:
16
# Date         Rev Version  Comment
17
# 2010-06-26   309   1.0.8  add ibimres.cacc/racc handling
18
# 2010-04-26   284   1.0.7  add error check for GetOptions
19
# 2009-09-19   240   1.0.6  add more VFETCH addr defs; add 2nd DL11 defs
20
# 2009-06-04   223   1.0.5  add IIST and PC11 defs
21
# 2009-05-03   212   1.0.4  add defs for mmu par/pdr's and some unibus dev's
22
# 2008-12-14   177   1.0.3  add -t_ru; use dp_ireg_we_last; add ibus names
23
# 2008-11-30   174   1.0.2  SPUSH and VFETCH tags for em cycles; psw in id lines
24
# 2008-04-25   138   1.0.1  show ccc/scc for code 000257/000277 in disassembler
25
# 2008-04-19   137   1.0    Initial version
26
#
27
# Current fields in tmu_ofile:
28
#   clkcycle:d
29
#   cpu:o
30
#   dp.pc:o
31
#   dp.psw:o
32
#   dp.ireg:o
33
#   dp.ireg_we:b
34
#   dp.ireg_we_last:b
35
#   dp.dsrc:o
36
#   dp.ddst:o
37
#   dp.dtmp:o
38
#   dp.dres:o
39
#   dp.gpr_adst:o
40
#   dp.gpr_mode:o
41
#   dp.gpr_bytop:b
42
#   dp.gpr_we:b
43
#   vm.ibmreq.req:b
44
#   vm.ibmreq.we:b
45
#   vm.ibmreq.be0:b
46
#   vm.ibmreq.be1:b
47
#   vm.ibmreq.dip:b
48
#   vm.ibmreq.cacc:b
49
#   vm.ibmreq.racc:b
50
#   vm.ibmreq.addr:o
51
#   vm.ibmreq.din:o
52
#   vm.ibsres.ack:b
53
#   vm.ibsres.busy:b
54
#   vm.ibsres.dout:o
55
#   co.cpugo:b
56
#   co.cpuhalt:b
57
#   sy.emmreq.req:b
58
#   sy.emmreq.we:b
59
#   sy.emmreq.be:b
60
#   sy.emmreq.cancel:b
61
#   sy.emmreq.addr:o
62
#   sy.emmreq.din:o
63
#   sy.emsres.ack_r:b
64
#   sy.emsres.ack_w:b
65
#   sy.emsres.dout:o
66
#   sy.chit:b
67
#
68
 
69
use 5.005;                                  # require Perl 5.005 or higher
70
use strict;                                 # require strict checking
71
use FileHandle;
72
 
73
use Getopt::Long;
74
 
75
my %opts = ();
76
 
77
GetOptions(\%opts, "help", "dump", "cdump",
78
           "t_id", "t_ru", "t_em", "t_ib")
79
  or die "bad options";
80
 
81
sub print_help;
82
sub do_file;
83
sub code2mnemo;
84
sub regmod;
85
 
86
my @var_name;
87
my @var_type;
88
my @var_dec;
89
my @var_oct;
90
my %name;
91
 
92
my @val_curr_text;
93
my @val_curr;
94
my @val_last;
95
 
96
my @reg_05 = ("------","------","------","------","------","------",   # set 0
97
              "------","------","------","------","------","------",); # set 1
98
my @reg_sp = ("------","------","------","------");        # ksp,ssp,???,usp
99
 
100
my $ind_dp_pc;
101
my $ind_dp_psw;
102
my $ind_dp_ireg;
103
my $ind_dp_ireg_we;
104
my $ind_dp_ireg_we_last;
105
my $ind_dp_dres;
106
my $ind_dp_gpr_adst;
107
my $ind_dp_gpr_mode;
108
my $ind_dp_gpr_bytop;
109
my $ind_dp_gpr_we;
110
 
111
my $ind_vm_ibmreq_req;
112
my $ind_vm_ibmreq_we;
113
my $ind_vm_ibmreq_be0;
114
my $ind_vm_ibmreq_be1;
115
my $ind_vm_ibmreq_cacc;
116
my $ind_vm_ibmreq_racc;
117
my $ind_vm_ibmreq_addr;
118
my $ind_vm_ibmreq_din;
119
my $ind_vm_ibsres_ack;
120
my $ind_vm_ibsres_busy;
121
my $ind_vm_ibsres_dout;
122
 
123
my $ind_sy_emmreq_req;
124
my $ind_sy_emmreq_we;
125
my $ind_sy_emmreq_be;
126
my $ind_sy_emmreq_cancel;
127
my $ind_sy_emmreq_addr;
128
my $ind_sy_emmreq_din;
129
my $ind_sy_emsres_ack_r;
130
my $ind_sy_emsres_ack_w;
131
my $ind_sy_emsres_dout;
132
my $ind_sy_chit;
133
 
134
my @pdp11_opcode_tbl = (
135
    {code=>0000000, mask=>0000000, name=>"halt", type=>"0arg"},
136
    {code=>0000001, mask=>0000000, name=>"wait", type=>"0arg"},
137
    {code=>0000002, mask=>0000000, name=>"rti ", type=>"0arg"},
138
    {code=>0000003, mask=>0000000, name=>"bpt ", type=>"0arg"},
139
    {code=>0000004, mask=>0000000, name=>"iot ", type=>"0arg"},
140
    {code=>0000005, mask=>0000000, name=>"reset",type=>"0arg"},
141
    {code=>0000006, mask=>0000000, name=>"rtt ", type=>"0arg"},
142
    {code=>0000007, mask=>0000000, name=>"!!mfpt", type=>"0arg"},
143
    {code=>0000100, mask=>0000077, name=>"jmp ", type=>"1arg"},
144
    {code=>0000200, mask=>0000007, name=>"rts ", type=>"1reg"},
145
    {code=>0000230, mask=>0000007, name=>"spl ", type=>"spl"},
146
    {code=>0000240, mask=>0000017, name=>"cl",   type=>"ccop"},
147
    {code=>0000260, mask=>0000017, name=>"se",   type=>"ccop"},
148
    {code=>0000300, mask=>0000077, name=>"swap", type=>"1arg"},
149
    {code=>0000400, mask=>0000377, name=>"br  ", type=>"br"},
150
    {code=>0001000, mask=>0000377, name=>"bne ", type=>"br"},
151
    {code=>0001400, mask=>0000377, name=>"beq ", type=>"br"},
152
    {code=>0002000, mask=>0000377, name=>"bge ", type=>"br"},
153
    {code=>0002400, mask=>0000377, name=>"blt ", type=>"br"},
154
    {code=>0003000, mask=>0000377, name=>"bgt ", type=>"br"},
155
    {code=>0003400, mask=>0000377, name=>"ble ", type=>"br"},
156
    {code=>0004000, mask=>0000777, name=>"jsr ", type=>"jsr"},
157
    {code=>0005000, mask=>0000077, name=>"clr ", type=>"1arg"},
158
    {code=>0005100, mask=>0000077, name=>"com ", type=>"1arg"},
159
    {code=>0005200, mask=>0000077, name=>"inc ", type=>"1arg"},
160
    {code=>0005300, mask=>0000077, name=>"dec ", type=>"1arg"},
161
    {code=>0005400, mask=>0000077, name=>"neg ", type=>"1arg"},
162
    {code=>0005500, mask=>0000077, name=>"adc ", type=>"1arg"},
163
    {code=>0005600, mask=>0000077, name=>"sbc ", type=>"1arg"},
164
    {code=>0005700, mask=>0000077, name=>"tst ", type=>"1arg"},
165
    {code=>0006000, mask=>0000077, name=>"ror ", type=>"1arg"},
166
    {code=>0006100, mask=>0000077, name=>"rol ", type=>"1arg"},
167
    {code=>0006200, mask=>0000077, name=>"asr ", type=>"1arg"},
168
    {code=>0006300, mask=>0000077, name=>"asl ", type=>"1arg"},
169
    {code=>0006400, mask=>0000077, name=>"mark", type=>"mark"},
170
    {code=>0006500, mask=>0000077, name=>"mfpi", type=>"1arg"},
171
    {code=>0006600, mask=>0000077, name=>"mtpi", type=>"1arg"},
172
    {code=>0006700, mask=>0000077, name=>"sxt ", type=>"1arg"},
173
    {code=>0007000, mask=>0000077, name=>"!!csm",  type=>"1arg"},
174
    {code=>0007200, mask=>0000077, name=>"!!tstset",type=>"1arg"},
175
    {code=>0007300, mask=>0000077, name=>"!!wrtlck",type=>"1arg"},
176
    {code=>0010000, mask=>0007777, name=>"mov ", type=>"2arg"},
177
    {code=>0020000, mask=>0007777, name=>"cmp ", type=>"2arg"},
178
    {code=>0030000, mask=>0007777, name=>"bit ", type=>"2arg"},
179
    {code=>0040000, mask=>0007777, name=>"bic ", type=>"2arg"},
180
    {code=>0050000, mask=>0007777, name=>"bis ", type=>"2arg"},
181
    {code=>0060000, mask=>0007777, name=>"add ", type=>"2arg"},
182
    {code=>0070000, mask=>0000777, name=>"mul ", type=>"rdst"},
183
    {code=>0071000, mask=>0000777, name=>"div ", type=>"rdst"},
184
    {code=>0072000, mask=>0000777, name=>"ash ", type=>"rdst"},
185
    {code=>0073000, mask=>0000777, name=>"ashc", type=>"rdst"},
186
    {code=>0074000, mask=>0000777, name=>"xor ", type=>"rdst"},
187
    {code=>0077000, mask=>0000777, name=>"sob ", type=>"sob"},
188
    {code=>0100000, mask=>0000377, name=>"bpl ", type=>"br"},
189
    {code=>0100400, mask=>0000377, name=>"bmi ", type=>"br"},
190
    {code=>0101000, mask=>0000377, name=>"bhi ", type=>"br"},
191
    {code=>0101400, mask=>0000377, name=>"blos", type=>"br"},
192
    {code=>0102000, mask=>0000377, name=>"bvc ", type=>"br"},
193
    {code=>0102400, mask=>0000377, name=>"bvs ", type=>"br"},
194
    {code=>0103000, mask=>0000377, name=>"bcc ", type=>"br"},
195
    {code=>0103400, mask=>0000377, name=>"bcs ", type=>"br"},
196
    {code=>0104000, mask=>0000377, name=>"emt ", type=>"trap"},
197
    {code=>0104400, mask=>0000377, name=>"trap", type=>"trap"},
198
    {code=>0105000, mask=>0000077, name=>"clrb", type=>"1arg"},
199
    {code=>0105100, mask=>0000077, name=>"comb", type=>"1arg"},
200
    {code=>0105200, mask=>0000077, name=>"incb", type=>"1arg"},
201
    {code=>0105300, mask=>0000077, name=>"decb", type=>"1arg"},
202
    {code=>0105400, mask=>0000077, name=>"negb", type=>"1arg"},
203
    {code=>0105500, mask=>0000077, name=>"adcb", type=>"1arg"},
204
    {code=>0105600, mask=>0000077, name=>"sbcb", type=>"1arg"},
205
    {code=>0105700, mask=>0000077, name=>"tstb", type=>"1arg"},
206
    {code=>0106000, mask=>0000077, name=>"rorb", type=>"1arg"},
207
    {code=>0106100, mask=>0000077, name=>"rolb", type=>"1arg"},
208
    {code=>0106200, mask=>0000077, name=>"asrb", type=>"1arg"},
209
    {code=>0106300, mask=>0000077, name=>"aslb", type=>"1arg"},
210
    {code=>0106400, mask=>0000077, name=>"!!mtps", type=>"1arg"},
211
    {code=>0106500, mask=>0000077, name=>"mfpd", type=>"1arg"},
212
    {code=>0106600, mask=>0000077, name=>"mtpd", type=>"1arg"},
213
    {code=>0106700, mask=>0000077, name=>"!!mfps", type=>"1arg"},
214
    {code=>0110000, mask=>0007777, name=>"movb", type=>"2arg"},
215
    {code=>0120000, mask=>0007777, name=>"cmpb", type=>"2arg"},
216
    {code=>0130000, mask=>0007777, name=>"bitb", type=>"2arg"},
217
    {code=>0140000, mask=>0007777, name=>"bicb", type=>"2arg"},
218
    {code=>0150000, mask=>0007777, name=>"bisb", type=>"2arg"},
219
    {code=>0160000, mask=>0007777, name=>"sub ", type=>"2arg"},
220
    {code=>0170000, mask=>0000000, name=>"!!cfcc", type=>"0arg"},
221
    {code=>0170001, mask=>0000000, name=>"!!setf", type=>"0arg"},
222
    {code=>0170011, mask=>0000000, name=>"!!setd", type=>"0arg"},
223
    {code=>0170002, mask=>0000000, name=>"!!seti", type=>"0arg"},
224
    {code=>0170012, mask=>0000000, name=>"!!setl", type=>"0arg"},
225
    {code=>0170100, mask=>0000077, name=>"!!ldfps",type=>"1fpp"},
226
    {code=>0170200, mask=>0000077, name=>"!!stfps",type=>"1fpp"},
227
    {code=>0170300, mask=>0000077, name=>"!!stst", type=>"1fpp"},
228
    {code=>0170400, mask=>0000077, name=>"!!clrf", type=>"1fpp"},
229
    {code=>0170500, mask=>0000077, name=>"!!tstf", type=>"1fpp"},
230
    {code=>0170600, mask=>0000077, name=>"!!absf", type=>"1fpp"},
231
    {code=>0170700, mask=>0000077, name=>"!!negf", type=>"1fpp"},
232
    {code=>0171000, mask=>0000377, name=>"!!mulf", type=>"rfpp"},
233
    {code=>0171400, mask=>0000377, name=>"!!modf", type=>"rfpp"},
234
    {code=>0172000, mask=>0000377, name=>"!!addf", type=>"rfpp"},
235
    {code=>0172400, mask=>0000377, name=>"!!ldf",  type=>"rfpp"},
236
    {code=>0173000, mask=>0000377, name=>"!!subf", type=>"rfpp"},
237
    {code=>0173400, mask=>0000377, name=>"!!cmpf", type=>"rfpp"},
238
    {code=>0174000, mask=>0000377, name=>"!!stf",  type=>"rfpp"},
239
    {code=>0174400, mask=>0000377, name=>"!!divf", type=>"rfpp"},
240
    {code=>0175000, mask=>0000377, name=>"!!stexp",type=>"rfpp"},
241
    {code=>0175400, mask=>0000377, name=>"!!stcif",type=>"rfpp"},
242
    {code=>0176000, mask=>0000377, name=>"!!stcfd",type=>"rfpp"},
243
    {code=>0176400, mask=>0000377, name=>"!!ldexp",type=>"rfpp"},
244
    {code=>0177000, mask=>0000377, name=>"!!ldcif",type=>"rfpp"},
245
    {code=>0177400, mask=>0000377, name=>"!!ldcdf",type=>"rfpp"}
246
  );
247
 
248
my %pdp11_regs = (                          # use simh naming convention
249
     177776=> "psw",
250
     177774=> "stklim",
251
     177772=> "pirq",
252
     177770=> "mbrk",
253
     177766=> "cpuerr",
254
     177764=> "sysid",
255
     177600=> "uipdr0",
256
     177602=> "uipdr1",
257
     177604=> "uipdr2",
258
     177606=> "uipdr3",
259
     177610=> "uipdr4",
260
     177612=> "uipdr5",
261
     177614=> "uipdr6",
262
     177616=> "uipdr7",
263
     177620=> "udpdr0",
264
     177622=> "udpdr1",
265
     177624=> "udpdr2",
266
     177626=> "udpdr3",
267
     177630=> "udpdr4",
268
     177632=> "udpdr5",
269
     177634=> "udpdr6",
270
     177636=> "udpdr7",
271
     177640=> "uipar0",
272
     177642=> "uipar1",
273
     177644=> "uipar2",
274
     177646=> "uipar3",
275
     177650=> "uipar4",
276
     177652=> "uipar5",
277
     177654=> "uipar6",
278
     177656=> "uipar7",
279
     177660=> "udpar0",
280
     177662=> "udpar1",
281
     177664=> "udpar2",
282
     177666=> "udpar3",
283
     177670=> "udpar4",
284
     177672=> "udpar5",
285
     177674=> "udpar6",
286
     177676=> "udpar7",
287
     177576=> "mmr2",
288
     177574=> "mmr1",
289
     177572=> "mmr0",
290
     177570=> "sdreg",                      # not a simh name !!
291
     177560=> "ti.csr",
292
     177562=> "ti.buf",
293
     177564=> "to.csr",
294
     177566=> "to.buf",
295
     177550=> "pr.csr",
296
     177552=> "pr.buf",
297
     177554=> "pp.csr",
298
     177556=> "pp.buf",
299
     177546=> "kl.csr",
300
     177514=> "lp.csr",
301
     177516=> "lp.buf",
302
     177500=> "ii.acr",
303
     177502=> "ii.adr",
304
     177400=> "rk.ds ",
305
     177402=> "rk.er ",
306
     177404=> "rk.cs ",
307
     177406=> "rk.wc ",
308
     177410=> "rk.ba ",
309
     177412=> "rk.da ",
310
     177414=> "rk.mr ",
311
     177416=> "rk.db ",
312
     177060=> "xor.cs",                     # XOR Tester
313
     176500=> "ti2.cs",
314
     176502=> "ti2.bu",
315
     176504=> "to2.cs",
316
     176506=> "to2.bu",
317
     174400=> "rl.cs ",
318
     174402=> "rl.ba ",
319
     174404=> "rl.da ",
320
     174406=> "rl.mp ",
321
     172540=> "kp.csr",
322
     172542=> "kp.buf",
323
     172544=> "kp.cnt",
324
     172520=> "tm.mts",
325
     172522=> "tm.mtc",
326
     172524=> "tm.brc",
327
     172526=> "tm.cma",
328
     172530=> "tm.mtd",
329
     172532=> "tm.rda",
330
     172516=> "mmr3",
331
     172200=> "sipdr0",
332
     172202=> "sipdr1",
333
     172204=> "sipdr2",
334
     172206=> "sipdr3",
335
     172210=> "sipdr4",
336
     172212=> "sipdr5",
337
     172214=> "sipdr6",
338
     172216=> "sipdr7",
339
     172220=> "sdpdr0",
340
     172222=> "sdpdr1",
341
     172224=> "sdpdr2",
342
     172226=> "sdpdr3",
343
     172230=> "sdpdr4",
344
     172232=> "sdpdr5",
345
     172234=> "sdpdr6",
346
     172236=> "sdpdr7",
347
     172240=> "sipar0",
348
     172242=> "sipar1",
349
     172244=> "sipar2",
350
     172246=> "sipar3",
351
     172250=> "sipar4",
352
     172252=> "sipar5",
353
     172254=> "sipar6",
354
     172256=> "sipar7",
355
     172260=> "sdpar0",
356
     172262=> "sdpar1",
357
     172264=> "sdpar2",
358
     172266=> "sdpar3",
359
     172270=> "sdpar4",
360
     172272=> "sdpar5",
361
     172274=> "sdpar6",
362
     172276=> "sdpar7",
363
     172300=> "kipdr0",
364
     172302=> "kipdr1",
365
     172304=> "kipdr2",
366
     172306=> "kipdr3",
367
     172310=> "kipdr4",
368
     172312=> "kipdr5",
369
     172314=> "kipdr6",
370
     172316=> "kipdr7",
371
     172320=> "kdpdr0",
372
     172322=> "kdpdr1",
373
     172324=> "kdpdr2",
374
     172326=> "kdpdr3",
375
     172330=> "kdpdr4",
376
     172332=> "kdpdr5",
377
     172334=> "kdpdr6",
378
     172336=> "kdpdr7",
379
     172340=> "kipar0",
380
     172342=> "kipar1",
381
     172344=> "kipar2",
382
     172346=> "kipar3",
383
     172350=> "kipar4",
384
     172352=> "kipar5",
385
     172354=> "kipar6",
386
     172356=> "kipar7",
387
     172360=> "kdpar0",
388
     172362=> "kdpar1",
389
     172364=> "kdpar2",
390
     172366=> "kdpar3",
391
     172370=> "kdpar4",
392
     172372=> "kdpar5",
393
     172374=> "kdpar6",
394
     172376=> "kdpar7",
395
     160100=> "dz.csr",
396
     160102=> "dz.mp2",
397
     160104=> "dz.tcr",
398
     160106=> "dz.mp6"
399
);
400
 
401
autoflush STDOUT 1 if (-p STDOUT);          # autoflush if output into pipe
402
 
403
if (exists $opts{help}) {
404
  print_help;
405
  exit 0;
406
}
407
 
408
foreach my $file (@ARGV) {
409
  do_file($file);
410
}
411
 
412
 
413
#-------------------------------------------------------------------------------
414
 
415
sub do_file {
416
  my ($file) = @_;
417
 
418
  open IFILE,"<$file" or die "failed to open $file";
419
 
420
  my $idec_cyc = 0;
421
  my $change_cyc = 0;
422
  my $emreq_cyc = 0;
423
  my $emreq_str = "";
424
  my $ibreq_cyc = 0;
425
  my $ibreq_typ = "";
426
  my $ibreq_str = "";
427
  my $ibreq_nam = "";
428
 
429
  my $emcurr_we   = 0;                      # curr em write enable (or undef)
430
  my $emcurr_addr = undef;                  # curr em address
431
  my $emlast_we   = 0;                      # prev em write enable (or undef)
432
  my $emlast_addr = undef;                  # prev em address
433
 
434
  while () {
435
    chomp;
436
    if (/^#\s+/) {
437
      @var_name = ();
438
      @var_type = ();
439
      my $dsc_str  = $';
440
      my @dsc_list = split /\s+/,$dsc_str;
441
      foreach my $dsc (@dsc_list) {
442
        if ($dsc =~ /^(.*):([bdo])$/) {
443
          my $ind = scalar(@var_name);
444
          $name{$1} = {ind=>$ind,
445
                       typ=>$2};
446
          push @var_name, $1;
447
          push @var_type, $2;
448
          push @var_dec, $ind if $2 eq "d";
449
          push @var_oct, $ind if $2 eq "o";
450
        } else {
451
          print "tmuconv-E: bad descriptor $dsc\n";
452
        }
453
      }
454
 
455
      $ind_dp_pc            = $name{'dp.pc'}->{ind};
456
      $ind_dp_psw           = $name{'dp.psw'}->{ind};
457
      $ind_dp_ireg          = $name{'dp.ireg'}->{ind};
458
      $ind_dp_ireg_we       = $name{'dp.ireg_we'}->{ind};
459
      $ind_dp_ireg_we_last  = $name{'dp.ireg_we_last'}->{ind};
460
      $ind_dp_dres          = $name{'dp.dres'}->{ind};
461
      $ind_dp_gpr_adst      = $name{'dp.gpr_adst'}->{ind};
462
      $ind_dp_gpr_mode      = $name{'dp.gpr_mode'}->{ind};
463
      $ind_dp_gpr_bytop     = $name{'dp.gpr_bytop'}->{ind};
464
      $ind_dp_gpr_we        = $name{'dp.gpr_we'}->{ind};
465
 
466
      $ind_vm_ibmreq_req    = $name{'vm.ibmreq.req'}->{ind};
467
      $ind_vm_ibmreq_we     = $name{'vm.ibmreq.we'}->{ind};
468
      $ind_vm_ibmreq_be0    = $name{'vm.ibmreq.be0'}->{ind};
469
      $ind_vm_ibmreq_be1    = $name{'vm.ibmreq.be1'}->{ind};
470
      $ind_vm_ibmreq_cacc   = $name{'vm.ibmreq.cacc'}->{ind};
471
      $ind_vm_ibmreq_racc   = $name{'vm.ibmreq.racc'}->{ind};
472
      $ind_vm_ibmreq_addr   = $name{'vm.ibmreq.addr'}->{ind};
473
      $ind_vm_ibmreq_din    = $name{'vm.ibmreq.din'}->{ind};
474
      $ind_vm_ibsres_ack    = $name{'vm.ibsres.ack'}->{ind};
475
      $ind_vm_ibsres_busy   = $name{'vm.ibsres.busy'}->{ind};
476
      $ind_vm_ibsres_dout   = $name{'vm.ibsres.dout'}->{ind};
477
 
478
      $ind_sy_emmreq_req    = $name{'sy.emmreq.req'}->{ind};
479
      $ind_sy_emmreq_we     = $name{'sy.emmreq.we'}->{ind};
480
      $ind_sy_emmreq_be     = $name{'sy.emmreq.be'}->{ind};
481
      $ind_sy_emmreq_cancel = $name{'sy.emmreq.cancel'}->{ind};
482
      $ind_sy_emmreq_addr   = $name{'sy.emmreq.addr'}->{ind};
483
      $ind_sy_emmreq_din    = $name{'sy.emmreq.din'}->{ind};
484
      $ind_sy_emsres_ack_r  = $name{'sy.emsres.ack_r'}->{ind};
485
      $ind_sy_emsres_ack_w  = $name{'sy.emsres.ack_w'}->{ind};
486
      $ind_sy_emsres_dout   = $name{'sy.emsres.dout'}->{ind};
487
      $ind_sy_chit          = $name{'sy.chit'}->{ind};
488
 
489
    } else {
490
      @val_last = @val_curr;
491
      my $notfirst = scalar(@val_last) > 0;
492
 
493
      $_ =~ s/^\s*//;
494
      $_ =~ s/\s*$//;
495
      @val_curr = split /\s+/,$_;
496
      if (scalar(@val_curr) != scalar(@var_name)) {
497
        printf "tmuconv-E: value list length mismatch, seen %d, expected %d\n",
498
          scalar(@val_curr), scalar(@var_name);
499
        for (my $i=0; $i
500
          printf "%3d: %s\n", $i,$val_curr[$i];
501
        }
502
        next;
503
      }
504
 
505
      @val_curr_text = @val_curr  if exists $opts{dump} || exists $opts{cdump};
506
 
507
      my $cyc_curr = int $val_curr[0];
508
      my $cyc_str  = sprintf "%8d", $cyc_curr;
509
 
510
      foreach my $ind (@var_dec) {
511
        $val_curr[$ind] = int ($val_curr[$ind]);
512
      }
513
      foreach my $ind (@var_oct) {
514
        $val_curr[$ind] = oct ($val_curr[$ind]);
515
      }
516
 
517
      my $id_str = "";
518
      my $ru_str = "";
519
      my $emres_str = "";
520
      my $emtyp_str = "";
521
      my $ibres_str = "";
522
      my $ibreq_we  = 0;
523
      my $ibreq_act = 0;
524
 
525
      if (exists $opts{dump} || exists $opts{cdump}) {
526
        my @val_change;
527
        my $any_change;
528
 
529
        for (my $i=1; $i
530
          my $change = (not $notfirst) || ($val_curr[$i] != $val_last[$i]);
531
          $val_change[$i] = $change;
532
          $any_change |= $change;
533
        }
534
 
535
        if (exists $opts{dump} || $any_change) {
536
          printf "cycle $cyc_str %s", "-" x 32;
537
          if ($notfirst && exists $opts{cdump}) {
538
            printf " (%d)",$cyc_curr-$change_cyc;
539
          }
540
          print "\n";
541
 
542
          for (my $i=1; $i
543
            my $oper = $val_change[$i] ? "<=" : " =";
544
            if (exists $opts{dump} || $val_change[$i]) {
545
              printf "   %-16s:%s %s %s\n", $var_name[$i], $var_type[$i],
546
                                            $oper, $val_curr_text[$i];
547
            }
548
          }
549
          $change_cyc = $cyc_curr;
550
        }
551
      }
552
#
553
# handle t_id
554
#   uses cycles with dp_ireg_we = '1'
555
#
556
      if (exists $opts{t_id} and $notfirst) {
557
        if ($val_curr[$ind_dp_ireg_we_last]) {
558
          my $pc   = $val_curr[$ind_dp_pc] - 2;
559
          my $psw  = $val_curr[$ind_dp_psw];
560
          my $ireg = $val_curr[$ind_dp_ireg];
561
          my $code = code2mnemo($ireg);
562
          $id_str = sprintf "       %6.6o %6.6o %6.6o  %s",
563
                            $pc, $psw, $ireg, $code;
564
          $id_str .= " " x (20-length($code));
565
          $id_str .= sprintf " (%d)",$cyc_curr-$idec_cyc;
566
          $idec_cyc = $cyc_curr;
567
        }
568
      }
569
#
570
 
571
#    1706 ru  0 06   000002 000002 000002 000002 000002 000002 000002  ksp
572
#    1694 id         002012 000340 010036  mov  r0,@(sp)+       (8)
573
 
574
 
575
# handle t_ru
576
#   uses cycles with dp_gpr_we = '1'
577
#
578
      if (exists $opts{t_ru}) {
579
        if ($val_curr[$ind_dp_gpr_we]) {
580
          my $adst  = $val_curr[$ind_dp_gpr_adst];
581
          my $mode  = $val_curr[$ind_dp_gpr_mode];
582
          my $bytop = $val_curr[$ind_dp_gpr_bytop];
583
          my $psw   = $val_curr[$ind_dp_psw];
584
          my $dres  = $val_curr[$ind_dp_dres];
585
          my $rset  = $psw>>11 & 01;
586
          $ru_str  = sprintf "%o %o%o   %6.6o", $bytop, $rset, $adst, $dres;
587
          $ru_str .= " ";
588
          if ($adst eq "7") {
589
            $ru_str .= "pc";
590
          } elsif ($adst eq "6") {
591
            $reg_sp[$mode] = sprintf "%6.6o",$dres;
592
            $ru_str .= $reg_sp[0];
593
            $ru_str .= ($mode == 0) ? "*" : " ";
594
            $ru_str .= $reg_sp[1];
595
            $ru_str .= ($mode == 1) ? "*" : " ";
596
            $ru_str .= $reg_sp[3];
597
            $ru_str .= ($mode == 3) ? "*" : " ";
598
            $ru_str .= " ksp" if $mode eq "0";
599
            $ru_str .= " ssp" if $mode eq "1";
600
            $ru_str .= " usp" if $mode eq "3";
601
          } else {
602
            my $rbase = ($rset==0) ? 0 : 6;
603
            $reg_05[$rbase+$adst] = sprintf "%6.6o",$dres;
604
            for (my $i=0; $i<6; $i++) {
605
              $ru_str .= $reg_05[$rbase+$i];
606
              $ru_str .= ($adst==$i) ? "*" : " ";
607
            }
608
            $ru_str .= sprintf " r%o%o", $rset, $adst;
609
          }
610
        }
611
      }
612
#
613
# handle t_em
614
#   uses cycles with sy_emmreq_req = '1'
615
#                    sy_emsres_ack_r = '1'
616
#                    sy_emsres_ack_w = '1'
617
#                    sy_emsreq_cancel = '1'
618
#
619
      if (exists $opts{t_em}) {
620
        if ($val_curr[$ind_sy_emmreq_req]) {
621
          $emreq_cyc = $cyc_curr;
622
          $emreq_str = sprintf "%s %s %8.8o",
623
                         ($val_curr[$ind_sy_emmreq_we] ? "w" : "r"),
624
                         $val_curr[$ind_sy_emmreq_be],
625
                         $val_curr[$ind_sy_emmreq_addr];
626
          $emcurr_we   = $val_curr[$ind_sy_emmreq_we];
627
          $emcurr_addr = $val_curr[$ind_sy_emmreq_addr];
628
          if ($emcurr_we) {
629
            $emreq_str .= sprintf " %6.6o", $val_curr[$ind_sy_emmreq_din];
630
          } else {
631
            $emreq_str .= " " x 7;
632
          }
633
        }
634
        if ($val_curr[$ind_sy_emsres_ack_r] ||
635
            $val_curr[$ind_sy_emsres_ack_w] ||
636
            $val_curr[$ind_sy_emmreq_cancel]) {
637
          $emres_str = sprintf "%s%s%s%s",
638
            $val_curr[$ind_sy_emmreq_cancel],
639
            $val_curr[$ind_sy_emsres_ack_r],
640
            $val_curr[$ind_sy_emsres_ack_w],
641
            $val_curr[$ind_sy_chit];
642
          if ($val_curr[$ind_sy_emmreq_cancel]) {
643
            $emreq_str .= " cancel";
644
            $emcurr_we = undef;
645
          } else {
646
            if ($val_curr[$ind_sy_emsres_ack_r]) {
647
              $emreq_str .= sprintf " %6.6o", $val_curr[$ind_sy_emsres_dout];
648
            } else {
649
              $emreq_str .= " " x 7;
650
            }
651
            if (defined $emlast_we && $emcurr_we == $emlast_we) {
652
              if ($emcurr_we && $emcurr_addr == $emlast_addr-2) {
653
                $emtyp_str = "SPUSH";
654
              } elsif ((not $emcurr_we) && $emcurr_addr == $emlast_addr+2 &&
655
                      $emcurr_addr < 0400 && ($emcurr_addr % 04) == 02) {
656
                $emtyp_str = "VFETCH";
657
                $emtyp_str .= " 004 ill.inst"   if ($emlast_addr == 0004);
658
                $emtyp_str .= " 010 res.inst"   if ($emlast_addr == 0010);
659
                $emtyp_str .= " 014 BPT"        if ($emlast_addr == 0014);
660
                $emtyp_str .= " 020 IOT"        if ($emlast_addr == 0020);
661
                $emtyp_str .= " 030 EMT"        if ($emlast_addr == 0030);
662
                $emtyp_str .= " 034 TRAP"       if ($emlast_addr == 0034);
663
                $emtyp_str .= " 060 DL11-TTI"   if ($emlast_addr == 0060);
664
                $emtyp_str .= " 064 DL11-TTO"   if ($emlast_addr == 0064);
665
                $emtyp_str .= " 070 PC11-PTR"   if ($emlast_addr == 0070);
666
                $emtyp_str .= " 074 PC11-PTP"   if ($emlast_addr == 0074);
667
                $emtyp_str .= " 100 KW11-L"     if ($emlast_addr == 0100);
668
                $emtyp_str .= " 104 KW11-P"     if ($emlast_addr == 0104);
669
                $emtyp_str .= " 160 RL11"       if ($emlast_addr == 0160);
670
                $emtyp_str .= " 200 LP11"       if ($emlast_addr == 0200);
671
                $emtyp_str .= " 220 RK11"       if ($emlast_addr == 0220);
672
                $emtyp_str .= " 224 TM11"       if ($emlast_addr == 0224);
673
                $emtyp_str .= " 240 PIRQ"       if ($emlast_addr == 0240);
674
                $emtyp_str .= " 244 FPP exp"    if ($emlast_addr == 0244);
675
                $emtyp_str .= " 250 MMU trap"   if ($emlast_addr == 0250);
676
                $emtyp_str .= " 260 IIST"       if ($emlast_addr == 0260);
677
                $emtyp_str .= " 300 DL11-2-TTI" if ($emlast_addr == 0300);
678
                $emtyp_str .= " 304 DL11-2-TTO" if ($emlast_addr == 0304);
679
              }
680
            }
681
          }
682
          $emlast_we   = $emcurr_we;
683
          $emlast_addr = $emcurr_addr;
684
        }
685
      }
686
#
687
# handle t_ib
688
#   uses cycles with sy_ibmreq_req = '1'
689
#                    sy_ibsres_ack = '1'
690
#                    vm_ibsres_busy '1' -> '0' transition
691
#
692
      if (exists $opts{t_ib}) {
693
        if ($val_curr[$ind_vm_ibmreq_req]) {
694
          my $addr_str = sprintf "%6.6o", $val_curr[$ind_vm_ibmreq_addr];
695
          $ibreq_cyc = $cyc_curr;
696
          $ibreq_typ = sprintf "%s%s",
697
                         ($val_curr[$ind_vm_ibmreq_cacc] ? "c" : "-"),
698
                         ($val_curr[$ind_vm_ibmreq_racc] ? "r" : "-");
699
          $ibreq_str = sprintf "%s %s%s   %s",
700
                         ($val_curr[$ind_vm_ibmreq_we] ? "w" : "r"),
701
                         $val_curr[$ind_vm_ibmreq_be1],
702
                         $val_curr[$ind_vm_ibmreq_be0],
703
                         $addr_str;
704
          $ibreq_we  = $val_curr[$ind_vm_ibmreq_we];
705
          $ibreq_act = 1;
706
          if ($ibreq_we) {
707
            $ibreq_str .= sprintf " %6.6o", $val_curr[$ind_vm_ibmreq_din];
708
          } else {
709
            $ibreq_str .= " " x 7;
710
          }
711
          $ibreq_nam = $pdp11_regs{$addr_str};
712
          $ibreq_nam = "" if not defined $ibreq_nam;
713
        }
714
 
715
        if ($val_curr[$ind_vm_ibsres_ack]) {
716
          $ibreq_act = 0;
717
          $ibres_str .= sprintf "   %s", $val_curr[$ind_vm_ibsres_ack];
718
          if (not $ibreq_we) {
719
            $ibreq_str .= sprintf " %6.6o", $val_curr[$ind_vm_ibsres_dout];
720
          } else {
721
            $ibreq_str .= " " x 7;
722
          }
723
        }
724
 
725
        if ($ibreq_act && $val_curr[$ind_vm_ibsres_busy]==0) {
726
          $ibres_str .= "no ACK, no BUSY";
727
          $ibreq_act = 0;
728
        }
729
      }
730
 
731
      print "$cyc_str id    $id_str\n"     if $id_str;
732
      print "$cyc_str ru    $ru_str\n"     if $ru_str;
733
      if ($emres_str) {
734
        printf "$cyc_str em    $emreq_str  $emres_str (%d) $emtyp_str\n",
735
          $cyc_curr-$emreq_cyc;
736
      }
737
      if ($ibres_str) {
738
        printf "$cyc_str ib %s $ibreq_str  $ibres_str (%d) $ibreq_nam\n",
739
          $ibreq_typ, $cyc_curr-$ibreq_cyc;
740
      }
741
    }
742
  }
743
 
744
  close IFILE;
745
}
746
 
747
#-------------------------------------------------------------------------------
748
 
749
sub code2mnemo {
750
  my ($code) = @_;
751
 
752
  foreach my $ele (@pdp11_opcode_tbl) {
753
    if (($code & (~($ele->{mask})) ) == $ele->{code}) {
754
      my $name = $ele->{name};
755
      my $type = $ele->{type};
756
      my $str  = $name;
757
      if ($type eq "0arg") {
758
        return $name;
759
 
760
      } elsif ($type eq "1arg" or $type eq "1fpp") {
761
        my $dst = $code & 077;
762
        my $dst_str = regmod($dst);
763
        return "$name $dst_str";
764
 
765
      } elsif ($type eq "2arg") {
766
        my $src = ($code>>6) & 077;
767
        my $dst = $code & 077;
768
        my $src_str = regmod($src);
769
        my $dst_str = regmod($dst);
770
        return "$name $src_str,$dst_str";
771
 
772
      } elsif ($type eq "rdst") {
773
        my $reg = ($code>>6) & 07;
774
        my $src = $code & 077;
775
        my $src_str = regmod($src);
776
        return "$name $src_str,r$reg";
777
 
778
      } elsif ($type eq "1reg") {
779
        my $reg = $code & 07;
780
        my $reg_str = "r$reg";
781
        $reg_str = "sp" if $reg == 6;
782
        $reg_str = "pc" if $reg == 7;
783
        return "$name $reg_str";
784
 
785
      } elsif ($type eq "br")   {
786
        my $off  = $code & 0177;
787
        my $sign = "+";
788
        if ($code & 0200) {
789
          $off  = -(((~$off) & 0177)+1);
790
          $sign = "-";
791
        }
792
        return sprintf "$name .%s%d.", $sign, abs(2*$off);
793
 
794
      } elsif ($type eq "sob")  {
795
        my $reg = ($code>>6) & 07;
796
        my $off = $code & 077;
797
        return sprintf "$name r%d,.-%d.", $reg, 2*$off;
798
 
799
      } elsif ($type eq "trap") {
800
        my $off = $code & 0377;
801
        return sprintf "$name %3.3o", $off;
802
 
803
      } elsif ($type eq "spl")  {
804
        my $off = $code & 07;
805
        return sprintf "$name %d", $off;
806
 
807
      } elsif ($type eq "ccop")  {
808
        my $cc = $code & 017;
809
        return "nop" if ($cc == 0);
810
        return "ccc" if ($code == 0257);
811
        return "scc" if ($code == 0277);
812
        my $str = "";
813
        my $del = "";
814
        if ($code & 010) { $str .= $del . $name . "n", $del = "+" }
815
        if ($code & 004) { $str .= $del . $name . "z", $del = "+" }
816
        if ($code & 002) { $str .= $del . $name . "v", $del = "+" }
817
        if ($code & 001) { $str .= $del . $name . "c", $del = "+" }
818
        return $str;
819
 
820
      } elsif ($type eq "jsr")  {
821
        my $reg = ($code>>6) & 07;
822
        my $dst = $code & 077;
823
        my $dst_str = regmod($dst);
824
        return "$name r$reg,$dst_str";
825
 
826
      } elsif ($type eq "mark") {
827
        my $off = $code & 077;
828
        return sprintf "$name %3.3o", $off;
829
 
830
      } elsif ($type eq "rfpp") {
831
        my $reg = ($code>>6) & 03;
832
        my $dst = $code & 077;
833
        my $dst_str = regmod($dst,"f");
834
        return "$name f$reg,$dst_str";
835
 
836
      } else {
837
        return "?type?";
838
      }
839
    }
840
  }
841
  return "=inval=";
842
}
843
 
844
#-------------------------------------------------------------------------------
845
sub regmod {
846
  my ($regmod,$pref) = @_;
847
  my $mod = ($regmod>>3) & 07;
848
  my $reg = $regmod & 07;
849
 
850
  $pref = "r" if not defined $pref or $reg>5;
851
 
852
  my $reg_str = "r$reg";
853
  $reg_str = "sp" if $reg == 6;
854
  $reg_str = "pc" if $reg == 7;
855
 
856
  if ($mod == 0) {                      # mode 0:    Rx  { Fx for float }
857
    $reg_str = "f$reg" if defined $pref && $pref eq "f" && $reg<=5;
858
    return $reg_str;
859
  } elsif ($mod == 1) {                 # mode 1:    (Rx)
860
    return "($reg_str)";
861
  } elsif ($mod == 2 || $mod == 3) {    # mode 2/3:  (Rx)+   @(Rx)+
862
    my $ind = ($mod == 3) ? "@" : "";
863
    if ($reg != 7) {                      # if reg != pc
864
      return "$ind($reg_str)+";
865
    } else {                              # if reg == pc
866
      my $str = sprintf "$ind#nnn";     # 27 -> #nnn;  37 -> @#nnn
867
      return $str;
868
    }
869
  } elsif ($mod == 4 || $mod == 5) {    # mode 4/5:  -(Rx)   @-(Rx)
870
    my $ind = ($mod == 5) ? "@" : "";
871
    return "$ind-($reg_str)";
872
  } elsif ($mod == 6 || $mod == 7) {    # mode 6/7:  nn(Rx)  @nn(Rx)
873
    my $ind = ($mod == 7) ? "@" : "";
874
    return "${ind}nnn($reg_str)";
875
  }
876
}
877
 
878
#-------------------------------------------------------------------------------
879
 
880
sub print_help {
881
  print "usage: tmuconf  file\n";
882
  print "  --help           this message\n";
883
  print "  --dump           dump all information\n";
884
  print "  --cdump          dump only changes relative to prev cycle\n";
885
  print "  --t_id           trace instruction decodes\n";
886
  print "  --t_ru           trace register updates\n";
887
  print "  --t_em           trace em transactions\n";
888
  print "  --t_ib           trace ib transactions\n";
889
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.