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

Subversion Repositories klc32

[/] [klc32/] [trunk/] [software/] [klasm/] [klasm/] [klasm/] [Module1.vb] - Blame information for rev 14

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 11 robfinch
Imports System.IO
2
 
3
Module Module1
4
 
5
    Dim strs() As String
6
    Dim pass As Integer
7
    Dim lname As String
8
    Dim address As Int32
9
    Public ofs As System.IO.TextWriter
10
    Public lfs As System.IO.TextWriter
11
    Public labels As New Collection
12
    Public symbols As New Collection
13
    Dim iline As String
14
    Dim lnc As Integer
15
 
16
    Sub Main()
17
        Dim tr As TextReader
18
        Dim fn As String
19
        Dim args() As String
20
        Dim text As String
21
        Dim lines() As String
22
        Dim line As String
23
        Dim n As Integer
24
        Dim s As String
25
        Dim delimiters As String = " ," & vbTab
26
        Dim p() As Char = delimiters.ToCharArray()
27
 
28
        args = System.Environment.GetCommandLineArgs()
29
        lname = args(1)
30
        lname = lname.Replace(".s", ".lst")
31
        lname = lname.Replace(".asm", ".lst")
32
        tr = System.IO.File.OpenText(args(1))
33
        text = tr.ReadToEnd()
34
        tr.Close()
35
        text = text.Replace(vbCr, "")
36
        lines = text.Split(vbLf.ToCharArray)
37
        For pass = 1 To 2
38
            If pass = 2 Then
39
                ofs = System.IO.File.CreateText(args(2))
40
                lfs = System.IO.File.CreateText(lname)
41
            End If
42
            address = 0
43
            lnc = 0
44
            For Each iline In lines
45
                lnc = lnc + 1
46
                line = iline
47
                n = line.IndexOf(";")
48
                If n >= 0 Then
49
                    line = line.Substring(0, n - 1)
50
                End If
51
                line = line.Trim()
52
                line = CompressSpaces(line)
53
                line = line.Replace(", ", ",")
54
                If line.Length = 0 Then
55
                    emitEmptyLine(iline)    ' there could be comments on the line
56
                Else
57
                    strs = line.Split(p)
58
                    s = strs(0)
59
                    s = s.Trim()
60
                    If s.EndsWith(":") Then
61
                        ProcessLabel(s)
62
                    Else
63
                        ProcessOp(s)
64
                    End If
65
                End If
66
            Next
67
        Next
68
        ofs.Close()
69
        lfs.Close()
70
    End Sub
71
 
72
    Function CompressSpaces(ByVal s As String) As String
73
        Dim l As Integer
74
        Do
75
            l = s.Length
76
            s = s.Replace(vbTab, " ")
77
            s = s.Replace("  ", " ")
78
        Loop While s.Length <> l
79
        Return s
80
    End Function
81
 
82
    Sub ProcessTrap(ByVal n As Integer, ByVal m As Integer)
83
        Dim oc As Integer
84
        Dim Cra As Integer
85
 
86
        Cra = GetCrRegister(strs(1))
87
        oc = n << 26
88
        oc = oc Or (Cra << 21)
89
        oc = oc Or (m << 16)
90
        emit(oc)
91
    End Sub
92
 
93
    Sub ProcessSet(ByVal n As Integer, ByVal m As Integer)
94
        Dim oc As Integer
95
        Dim Cra As Integer
96
        Dim Rt As Integer
97
 
98
        Cra = GetCrRegister(strs(1))
99
        Rt = GetRegister(strs(2))
100
        oc = n << 26
101
        oc = oc Or (Cra << 21)
102
        oc = oc Or (m << 16)
103
        oc = oc Or (Rt << 11)
104
        emit(oc)
105
    End Sub
106
 
107
    Sub ProcessBranch(ByVal oc As Integer, ByVal func As Integer)
108
        Dim opcode As Integer
109
        Dim ra As Int64
110
        Dim rb As Int64
111
        Dim imm As Int64
112
        Dim disp As Int64
113
        Dim L As Label
114
        Dim P As LabelPatch
115
 
116
        ra = GetCrRegister(strs(1))
117
        strs(2) = strs(2).Trim
118
        Try
119
            L = labels.Item(strs(2))
120
        Catch
121
            L = Nothing
122
        End Try
123
        If L Is Nothing Then
124
            L = New Label
125
            L.name = strs(2)
126
            L.address = -1
127
            L.slot = -1
128
            L.defined = False
129
            labels.Add(L, L.name)
130
        End If
131
        If Not L.defined Then
132
            P = New LabelPatch
133
            P.type = "B"
134
            P.address = address
135
            L.PatchAddresses.Add(P)
136
        End If
137
        'If slot = 2 Then
138
        '    imm = ((L.address - address - 16) + (L.slot << 2)) >> 2
139
        'Else
140
        disp = L.address - (address + 4)
141
        'End If
142
        'imm = (L.address + (L.slot << 2)) >> 2
143
        opcode = oc << 26
144
        opcode = opcode Or (ra << 21)
145
        opcode = opcode Or (func << 16)
146
        opcode = opcode Or (disp And &HFFFF)
147
        emit(opcode)
148
    End Sub
149
 
150 14 robfinch
    Sub ProcessRRop(ByVal n As Integer, ByVal m As Integer, ByVal rc As Boolean)
151 11 robfinch
        Dim oc As Integer
152
        Dim Rt As Integer
153
        Dim Ra As Integer
154
        Dim Rb As Integer
155
 
156
        Rt = GetRegister(strs(1))
157
        Ra = GetRegister(strs(2))
158
        Rb = GetRegister(strs(3))
159
        oc = n << 26
160 14 robfinch
        oc = oc Or (Ra << 21)
161
        oc = oc Or (Rb << 16)
162
        oc = oc Or (Rt << 11)
163
        oc = oc Or m
164
        If rc Then oc = oc Or 64
165
        emit(oc)
166
    End Sub
167
 
168
    Sub ProcessCRRop(ByVal n As Integer, ByVal m As Integer)
169
        Dim oc As Integer
170
        Dim Rt As Integer
171
        Dim Ra As Integer
172
        Dim Rb As Integer
173
 
174
        Rt = GetCrRegister(strs(1))
175
        Ra = GetCrRegister(strs(2))
176
        Rb = GetCrRegister(strs(3))
177
        oc = n << 26
178 11 robfinch
        oc = oc Or Ra << 21
179
        oc = oc Or Rb << 16
180
        oc = oc Or Rt << 11
181 14 robfinch
        oc = oc Or (m << 1)
182 11 robfinch
        emit(oc)
183
    End Sub
184
 
185
    Sub ProcessCmpOp(ByVal n As Integer, ByVal m As Integer)
186
        Dim oc As Integer
187
        Dim CRt As Integer
188
        Dim Ra As Integer
189
        Dim Rb As Integer
190
 
191
        CRt = GetCrRegister(strs(1))
192
        Ra = GetRegister(strs(2))
193
        Rb = GetRegister(strs(3))
194
        oc = n << 26
195
        oc = oc Or (Ra << 21)
196
        oc = oc Or (Rb << 16)
197 14 robfinch
        oc = oc Or (CRt << 13)
198 11 robfinch
        oc = oc Or m
199
        emit(oc)
200
    End Sub
201
 
202
    Sub ProcessCmpiOp(ByVal n As Integer)
203
        Dim oc As Integer
204
        Dim CRt As Integer
205
        Dim Ra As Integer
206
        Dim imm As Integer
207
 
208
        CRt = GetCrRegister(strs(1))
209
        Ra = GetRegister(strs(2))
210
        imm = GetImmediate(strs(3))
211
        oc = n << 26
212
        oc = oc Or (Ra << 21)
213 14 robfinch
        oc = oc Or (CRt << 18)
214 11 robfinch
        If imm < -32767 Or imm > 32767 Then
215
            oc = oc Or &H8000
216
            emit(oc)
217
            emit1(imm, True)
218
        Else
219
            oc = oc Or (imm And &HFFFF)
220
            emit(oc)
221
        End If
222
    End Sub
223
 
224
    Sub ProcessLdi(ByVal n As Integer)
225
        Dim oc As Integer
226
        Dim Rt As Integer
227
        Dim Ra As Integer
228
        Dim imm As Integer
229
 
230
        Rt = GetRegister(strs(1))
231
        Ra = 0
232
        imm = GetImmediate(strs(2))
233
        oc = n << 26
234
        oc = oc Or Ra << 21
235
        oc = oc Or Rt << 16
236
        If imm < -32767 Or imm > 32767 Then
237
            oc = oc Or &H8000
238
            emit(oc)
239
            emit1(imm, True)
240
        Else
241
            oc = oc Or (imm And &HFFFF)
242
            emit(oc)
243
        End If
244
    End Sub
245
 
246 14 robfinch
    Sub ProcessExec()
247
        Dim oc As Integer
248
        Dim Ra As Integer
249
 
250
        Ra = GetRegister(strs(1))
251
        oc = 1 << 26
252
        oc = oc Or (Ra << 21)
253
        oc = oc Or 63
254
        emit(oc)
255
    End Sub
256
 
257 11 robfinch
    Sub ProcessOri(ByVal n As Integer)
258
        Dim oc As Integer
259
        Dim Rt As Integer
260
        Dim Ra As Integer
261
        Dim imm As Integer
262
 
263 14 robfinch
        If strs(1).ToLower = "cr" Then
264
            imm = GetImmediate(strs(2))
265
            oc = 19 << 26
266
            Select Case (strs(0))
267
                Case "andi"
268
                    oc = oc Or (8 << 16)
269
                Case "ori"
270
                    oc = oc Or (9 << 16)
271
                Case "eori"
272
                    oc = oc Or (10 << 16)
273
            End Select
274
            If imm < -32767 Or imm > 32767 Then
275
                oc = oc Or &H8000
276
                emit(oc)
277
                emit1(imm, True)
278
            Else
279
                oc = oc Or (imm And &HFFFF)
280
                emit(oc)
281
            End If
282
            Return
283
        End If
284 11 robfinch
        Rt = GetRegister(strs(1))
285
        Ra = GetRegister(strs(2))
286
        imm = GetImmediate(strs(3))
287
        oc = n << 26
288
        oc = oc Or Ra << 21
289
        oc = oc Or Rt << 16
290
        If imm < -32767 Or imm > 32767 Then
291
            oc = oc Or &H8000
292
            emit(oc)
293
            emit1(imm, True)
294
        Else
295
            oc = oc Or (imm And &HFFFF)
296
            emit(oc)
297
        End If
298
    End Sub
299
 
300
    Sub ParseAm(ByRef offset As Integer, ByRef reg1 As Integer, ByRef reg2 As Integer)
301
        Dim s() As String
302
        Dim t() As String
303
 
304
        offset = 0
305
        reg1 = 0
306
        reg2 = 0
307
        s = strs(2).Split("(".ToCharArray)
308
        If s(0).Length > 0 Then
309
            offset = GetImmediate(s(0))
310
        Else
311
            offset = 0
312
        End If
313
        If s.Length > 1 Then
314
            s(1) = s(1).TrimEnd(")".ToCharArray)
315
            t = s(1).Split("+".ToCharArray)
316
            reg1 = GetRegister(t(0))
317
            If t.Length = 2 Then
318
                reg2 = GetRegister(t(1))
319
            Else
320
                reg2 = 0
321
            End If
322
        End If
323
    End Sub
324
 
325
    Sub ProcessLabel(ByVal s As String)
326
        Dim L As Label
327
        Dim M As Label
328
 
329
        s = s.TrimEnd(":")
330
        L = New Label
331
        L.name = s
332
        L.address = address
333
        L.defined = True
334
        If labels.Count > 0 Then
335
            Try
336
                M = labels.Item(s)
337
            Catch
338
                M = Nothing
339
            End Try
340
        Else
341
            M = Nothing
342
        End If
343
        If M Is Nothing Then
344
            labels.Add(L, L.name)
345
        Else
346
            M.defined = True
347
            M.address = L.address
348
            M.slot = L.slot
349
        End If
350
        emitLabel(L.name)
351
    End Sub
352
 
353
 
354
    Sub ProcessEquate()
355
        Dim sym As Symbol
356
        Dim sym2 As Symbol
357
 
358
        If strs(1).ToUpper = "EQU" Then
359
            sym = New Symbol
360
            sym.name = strs(0)
361
            sym.value = GetImmediate(strs(2))
362
            If symbols Is Nothing Then
363
                symbols = New Collection
364
            Else
365
                Try
366
                    sym2 = symbols.Item(sym.name)
367
                Catch
368
                    sym2 = Nothing
369
                End Try
370
            End If
371
            If sym2 Is Nothing Then
372
                symbols.Add(sym, sym.name)
373
            End If
374
            emitEmptyLine(iline)
375
        End If
376
    End Sub
377
 
378 14 robfinch
    Sub ProcessMov()
379
        Dim oc As Integer
380
        Dim Ra As Integer
381
        Dim Rt As Integer
382
        Dim Crt As Integer
383
        Dim Cra As Integer
384
 
385
        oc = 1 << 26
386
        Rt = GetRegister(strs(1))
387
        Ra = GetRegister(strs(2))
388
        Crt = GetCrRegister(strs(1))
389
        Cra = GetCrRegister(strs(2))
390
        If Crt <> -1 And Cra <> -1 Then
391
            oc = oc Or (Crt << 16)
392
            oc = oc Or (Cra << 21)
393
            oc = oc Or 48
394
            emit(oc)
395
            Return
396
        End If
397
        If Crt <> -1 And Ra <> -1 Then
398
            oc = oc Or (Crt << 16)
399
            oc = oc Or (Ra << 21)
400
            oc = oc Or 50
401
            emit(oc)
402
            Return
403
        End If
404
        If Rt <> -1 And Cra <> -1 Then
405
            oc = oc Or (Cra << 21)
406
            oc = oc Or (Rt << 16)
407
            oc = oc Or 49
408
            emit(oc)
409
            Return
410
        End If
411
        If Rt <> -1 Then
412
            Select Case (strs(2).ToLower)
413
                Case "usp"
414
                    oc = oc Or (Rt << 16)
415
                    oc = oc Or 33
416
                    emit(oc)
417
                    Return
418
                Case "im"
419
                    oc = oc Or (Rt << 16)
420
                    oc = oc Or 54
421
                    emit(oc)
422
                    Return
423
            End Select
424
        Else
425
            Select Case (strs(1))
426
                ' MOV USP,Rn
427
            Case "usp"
428
                    oc = 1 << 26
429
                    oc = oc Or (Ra << 21)
430
                    oc = oc Or 32
431
                    emit(oc)
432
                    Return
433
                    ' MOV IM,Rn
434
                Case "im"
435
                    oc = 1 << 26
436
                    oc = oc Or (Ra << 21)
437
                    oc = oc Or 53
438
                    emit(oc)
439
                    Return
440
            End Select
441
        End If
442
    End Sub
443
 
444 11 robfinch
    Sub ProcessOrg()
445
        Dim imm As Int32
446
        imm = GetImmediate(strs(1))
447
        address = imm
448
        emitLabel("")
449
    End Sub
450
 
451 14 robfinch
    ' PUSH R1/R2/R3/R4/R5
452
    '
453 11 robfinch
    Sub ProcessPush(ByVal n As Integer)
454
        Dim oc As Integer
455
        Dim rs() As String
456
        Dim regs(5) As Integer
457
        Dim c As Integer
458
 
459
        rs = strs(1).Split("/".ToCharArray)
460
        For c = 1 To 5
461
            If rs.Length < c Then
462
                regs(c - 1) = 0
463
            Else
464
                regs(c - 1) = GetRegister(rs(c - 1))
465
            End If
466
        Next
467
        oc = n << 26
468
        oc = oc Or regs(0) << 21
469
        oc = oc Or regs(1) << 16
470
        oc = oc Or regs(2) << 11
471
        oc = oc Or regs(3) << 6
472
        oc = oc Or regs(4) << 1
473
        emit(oc)
474
    End Sub
475
 
476 14 robfinch
    ' JSR SomeSubroutine
477
    ' JSR (R1+R2)
478
    '
479 11 robfinch
    Sub ProcessJsr(ByVal n As Integer)
480
        Dim oc As Integer
481
        Dim adr As Integer
482 14 robfinch
        Dim Ra As Integer
483
        Dim Rb As Integer
484
        Dim s() As String
485
        Dim t() As String
486
        Dim m As Integer
487 11 robfinch
 
488 14 robfinch
        Ra = 0
489
        Rb = 0
490
        m = strs(1).IndexOf("(")
491
        If m >= 0 Then
492
            s = strs(1).Split("(".ToCharArray)
493
            t = s(1).Split("+".ToCharArray)
494
            Ra = GetRegister(t(0))
495
            If t.Length > 1 Then
496
                Rb = GetRegister(t(1))
497
            End If
498
            oc = 2 << 26
499
            oc = oc Or (Ra << 21)
500
            oc = oc Or (Rb << 16)
501
            oc = oc Or n
502
            emit(oc)
503
        Else
504
            adr = GetImmediate(strs(1))
505
            oc = n << 26
506
            oc = oc Or (adr And &H3FFFFFF)
507
            emit(oc)
508
        End If
509 11 robfinch
    End Sub
510
 
511
    Sub ProcessMemop(ByVal n As Integer, ByVal m As Integer)
512
        Dim oc As Integer
513
        Dim Ra As Integer
514
        Dim Rb As Integer
515
        Dim Rt As Integer
516
        Dim offs As Integer
517
 
518
        Rt = GetRegister(strs(1))
519
        ParseAm(offs, Ra, Rb)
520
        If Ra <> 0 And Rb <> 0 Then
521
            oc = n << 26
522
            oc = oc Or (Ra << 21)
523
            oc = oc Or (Rb << 16)
524
            oc = oc Or m
525
            emit(oc)
526
        Else
527
            oc = n << 26
528
            oc = oc Or (Ra << 21)
529
            oc = oc Or (Rt << 16)
530
            If offs < -32767 Or offs > 32767 Then
531
                oc = oc Or &H8000
532
                emit(oc)
533
                emit1(offs, True)
534
            Else
535
                oc = oc Or (offs And &HFFFF)
536
                emit(oc)
537
            End If
538
        End If
539
    End Sub
540
 
541
    Sub ProcessLink(ByVal n As Integer)
542
        Dim oc As Integer
543
        Dim Ra As Integer
544
        Dim imm As Integer
545
 
546
        Ra = GetRegister(strs(1))
547
        imm = GetImmediate(strs(2))
548
        oc = n << 26
549
        oc = oc Or (Ra << 21)
550
        oc = oc Or (Ra << 16)
551
        oc = oc Or (imm And &HFFFF)
552
        emit(oc)
553
    End Sub
554
 
555
    Sub ProcessUnlk(ByVal n As Integer, ByVal m As Integer)
556
        Dim oc As Integer
557
        Dim Ra As Integer
558
 
559
        Ra = GetRegister(strs(1))
560
        oc = n << 26
561
        oc = oc Or m
562
        oc = oc Or (Ra << 21)
563
        oc = oc Or (Ra << 16)
564
        emit(oc)
565
    End Sub
566
 
567
    Sub ProcessRts(ByVal n As Integer, ByVal m As Integer)
568
        Dim oc As Integer
569
        Dim offs As Integer
570
        Dim imm As Integer
571
        Dim k As Integer
572
 
573
        k = 1
574
        offs = 0
575
        imm = 0
576
        If strs.Length = 2 Then
577
            offs = GetImmediate(strs(1))
578
            k = k + 1
579
        End If
580
        If strs.Length > 1 Then
581
            imm = GetImmediate(strs(k))
582
        End If
583
        oc = n << 26
584
        oc = oc Or m
585
        oc = oc Or (offs << 22)
586
        oc = oc Or ((imm And &HFFFF) << 6)
587
        emit(oc)
588
    End Sub
589
 
590
    Sub ProcessStop(ByVal n As Integer, ByVal m As Integer)
591
        Dim oc As Integer
592
 
593
        oc = n << 26
594
        oc = n Or m
595
        emit(oc)
596
    End Sub
597
 
598
    Sub ProcessOp(ByVal s As String)
599
        Select Case (s.ToLower)
600
            Case "org"
601
                ProcessOrg()
602
            Case "add"
603 14 robfinch
                ProcessRRop(2, 4, False)
604
            Case "add."
605
                ProcessRRop(2, 4, True)
606 11 robfinch
            Case "sub"
607 14 robfinch
                ProcessRRop(2, 5, False)
608
            Case "sub."
609
                ProcessRRop(2, 5, True)
610 11 robfinch
            Case "cmp"
611
                ProcessCmpOp(2, 6)
612
            Case "and"
613 14 robfinch
                ProcessRRop(2, 8, False)
614
            Case "and."
615
                ProcessRRop(2, 8, True)
616 11 robfinch
            Case "or"
617 14 robfinch
                ProcessRRop(2, 9, False)
618
            Case "or."
619
                ProcessRRop(2, 9, True)
620 11 robfinch
            Case "eor"
621 14 robfinch
                ProcessRRop(2, 10, False)
622
            Case "eor."
623
                ProcessRRop(2, 10, True)
624 11 robfinch
            Case "nand"
625 14 robfinch
                ProcessRRop(2, 12, False)
626
            Case "nand."
627
                ProcessRRop(2, 12, True)
628 11 robfinch
            Case "nor"
629 14 robfinch
                ProcessRRop(2, 13, False)
630
            Case "nor."
631
                ProcessRRop(2, 13, True)
632 11 robfinch
            Case "enor"
633 14 robfinch
                ProcessRRop(2, 14, False)
634
            Case "enor."
635
                ProcessRRop(2, 14, True)
636
            Case "cror"
637
                ProcessCRRop(19, 449)
638
            Case "crorc"
639
                ProcessCRRop(19, 417)
640
            Case "crand"
641
                ProcessCRRop(19, 257)
642
            Case "crandc"
643
                ProcessCRRop(19, 129)
644
            Case "crxor"
645
                ProcessCRRop(19, 193)
646
            Case "crnor"
647
                ProcessCRRop(19, 33)
648
            Case "crnand"
649
                ProcessCRRop(19, 225)
650
            Case "crxnor"
651
                ProcessCRRop(19, 289)
652 11 robfinch
            Case "shl"
653 14 robfinch
                ProcessRRop(2, 16, False)
654
            Case "shl."
655
                ProcessRRop(2, 16, True)
656 11 robfinch
            Case "shr"
657 14 robfinch
                ProcessRRop(2, 17, False)
658
            Case "shr."
659
                ProcessRRop(2, 17, True)
660 11 robfinch
            Case "rol"
661 14 robfinch
                ProcessRRop(2, 18, False)
662
            Case "rol."
663
                ProcessRRop(2, 18, True)
664 11 robfinch
            Case "ror"
665 14 robfinch
                ProcessRRop(2, 19, False)
666
            Case "ror."
667
                ProcessRRop(2, 19, True)
668
            Case "min"
669
                ProcessRRop(2, 23, False)
670
            Case "min."
671
                ProcessRRop(2, 23, True)
672
            Case "max"
673
                ProcessRRop(2, 24, False)
674
            Case "max."
675
                ProcessRRop(2, 24, True)
676 11 robfinch
            Case "ldi"
677
                ProcessLdi(9)
678
            Case "addi"
679
                ProcessOri(4)
680
            Case "subi"
681
                ProcessOri(5)
682
            Case "cmpi"
683
                ProcessCmpiOp(6)
684
            Case "andi"
685
                ProcessOri(8)
686
            Case "ori"
687
                ProcessOri(9)
688
            Case "eori"
689
                ProcessOri(10)
690
            Case "bra"
691
                ProcessBranch(16, 0)
692
            Case "bhi"
693
                ProcessBranch(16, 2)
694
            Case "bls"
695
                ProcessBranch(16, 3)
696
            Case "bhs"
697
                ProcessBranch(16, 4)
698
            Case "blo"
699
                ProcessBranch(16, 5)
700
            Case "bne"
701
                ProcessBranch(16, 6)
702
            Case "beq"
703
                ProcessBranch(16, 7)
704
            Case "bvc"
705
                ProcessBranch(16, 8)
706
            Case "bvs"
707
                ProcessBranch(16, 9)
708
            Case "bpl"
709
                ProcessBranch(16, 10)
710
            Case "bmi"
711
                ProcessBranch(16, 11)
712
            Case "bge"
713
                ProcessBranch(16, 12)
714
            Case "blt"
715
                ProcessBranch(16, 13)
716
            Case "bgt"
717
                ProcessBranch(16, 14)
718
            Case "ble"
719
                ProcessBranch(16, 15)
720
            Case "trap"
721
                ProcessTrap(17, 0)
722
            Case "thi"
723
                ProcessTrap(17, 2)
724
            Case "tls"
725
                ProcessTrap(17, 3)
726
            Case "ths"
727
                ProcessTrap(17, 4)
728
            Case "tlo"
729
                ProcessTrap(17, 5)
730
            Case "tne"
731
                ProcessTrap(17, 6)
732
            Case "teq"
733
                ProcessTrap(17, 7)
734
            Case "tvc"
735
                ProcessTrap(17, 8)
736
            Case "tvs"
737
                ProcessTrap(17, 9)
738
            Case "tpl"
739
                ProcessTrap(17, 10)
740
            Case "tmi"
741
                ProcessTrap(17, 11)
742
            Case "tge"
743
                ProcessTrap(17, 12)
744
            Case "tlt"
745
                ProcessTrap(17, 13)
746
            Case "tgt"
747
                ProcessTrap(17, 14)
748
            Case "tle"
749
                ProcessTrap(17, 15)
750
            Case "set"
751
                ProcessSet(18, 0)
752
            Case "shi"
753
                ProcessSet(18, 2)
754
            Case "sls"
755
                ProcessSet(18, 3)
756
            Case "shs"
757
                ProcessSet(18, 4)
758
            Case "slo"
759
                ProcessSet(18, 5)
760
            Case "sne"
761
                ProcessSet(18, 6)
762
            Case "seq"
763
                ProcessSet(18, 7)
764
            Case "svc"
765
                ProcessSet(18, 8)
766
            Case "svs"
767
                ProcessSet(18, 9)
768
            Case "spl"
769
                ProcessSet(18, 10)
770
            Case "smi"
771
                ProcessSet(18, 11)
772
            Case "sge"
773
                ProcessSet(18, 12)
774
            Case "slt"
775
                ProcessSet(18, 13)
776
            Case "sgt"
777
                ProcessSet(18, 14)
778
            Case "sle"
779
                ProcessSet(18, 15)
780
            Case "sw"
781
                ProcessMemop(56, 0)
782
            Case "sh"
783
                ProcessMemop(57, 0)
784
            Case "sb"
785
                ProcessMemop(58, 0)
786
            Case "lw"
787
                ProcessMemop(48, 0)
788
            Case "lh"
789
                ProcessMemop(49, 0)
790
            Case "lb"
791
                ProcessMemop(50, 0)
792
            Case "lhu"
793
                ProcessMemop(51, 0)
794
            Case "lbu"
795
                ProcessMemop(52, 0)
796
            Case "tas"
797
                ProcessMemop(46, 0)
798
            Case "swx"
799
                ProcessMemop(2, 56)
800
            Case "shx"
801
                ProcessMemop(2, 57)
802
            Case "sbx"
803
                ProcessMemop(2, 58)
804
            Case "lwx"
805
                ProcessMemop(2, 48)
806
            Case "lhx"
807
                ProcessMemop(2, 49)
808
            Case "lbx"
809
                ProcessMemop(2, 50)
810
            Case "lhux"
811
                ProcessMemop(2, 51)
812
            Case "lbux"
813
                ProcessMemop(2, 52)
814 14 robfinch
            Case "jmp"
815
                ProcessJsr(20)
816 11 robfinch
            Case "jsr"
817
                ProcessJsr(21)
818
            Case "push"
819
                ProcessPush(59)
820
            Case "pop"
821
                ProcessPush(53)
822
            Case "link"
823
                ProcessLink(54)
824
            Case "unlk"
825
                ProcessUnlk(1, 24)
826
            Case "rts"
827
                ProcessRts(0, 34)
828
            Case "stop"
829
                ProcessStop(0, 53)
830 14 robfinch
            Case "mov"
831
                ProcessMov()
832
            Case "exec"
833
                ProcessExec()
834 11 robfinch
            Case Else
835
                ProcessEquate()
836
        End Select
837
    End Sub
838
 
839
    Sub emitEmptyLine(ByVal ln As String)
840
        Dim s As String
841
        If pass = 2 Then
842
            s = "                " & "  " & vbTab & "           " & vbTab & vbTab & ln
843
            lfs.WriteLine(s)
844
        End If
845
    End Sub
846
 
847
    Sub emitLabel(ByVal lbl As String)
848
        Dim s As String
849
 
850
        If pass = 2 Then
851
            s = Hex(address).PadLeft(8, "0") & vbTab & "           " & vbTab & vbTab & iline
852
            lfs.WriteLine(s)
853
        End If
854
    End Sub
855
 
856
    Function GetRegister(ByVal s As String) As Integer
857
        Dim r As Int16
858
        If s.StartsWith("R") Or s.StartsWith("r") Then
859
            s = s.TrimStart("Rr".ToCharArray)
860
            Try
861
                r = Int16.Parse(s)
862
            Catch
863
                r = -1
864
            End Try
865
            Return r
866
        Else
867
            Return -1
868
        End If
869
    End Function
870
 
871
    Function GetCrRegister(ByVal s As String) As Integer
872
        Dim r As Int16
873
        If s.ToLower.StartsWith("cr") Then
874
            s = s.Substring(2)
875
            Try
876
                r = Int16.Parse(s)
877
            Catch
878
                r = -1
879
            End Try
880
            Return r
881
        Else
882
            Return -1
883
        End If
884
    End Function
885
 
886
    Function GetImmediate(ByVal s As String) As Int64
887
        Dim s1 As String
888
        Dim s2 As String
889
        Dim s3 As String
890
        Dim n As Int64
891
        Dim q As Integer
892
        Dim sym As Symbol
893
        Dim L As Label
894
 
895
        s = s.TrimStart("#".ToCharArray)
896
        s = s.Replace("_", "")
897
        If s.Length = 0 Then Return 0
898
        If s.Chars(0) = "$" Then
899
            s1 = "&H" & s.Substring(1)
900
            n = Val(s1)
901
        ElseIf s.Chars(0) = "0" Then
902
            If s.Length = 1 Then Return 0
903
            If s.Chars(1) = "x" Or s.Chars(1) = "X" Then
904
                If s.Length >= 18 Then
905
                    s1 = "&H0000" & s.Substring(2, 6) & "&"
906
                    s2 = "&H0000" & s.Substring(8, 6) & "&"
907
                    s3 = "&H0000" & s.Substring(14) & "&"
908
                    n = Val(s1) << 40
909
                    n = n Or (Val(s2) << 16)
910
                    n = n Or Val(s3)
911
                Else
912
                    s1 = "&H" & s.Substring(2)
913
                    n = Val(s1)
914
                End If
915
            End If
916
        Else
917
            If s.Chars(0) > "9" Then
918
                sym = Nothing
919
                Try
920
                    sym = symbols.Item(s)
921
                Catch
922
                    sym = Nothing
923
                End Try
924
                If Not sym Is Nothing Then
925
                    n = sym.value
926
                    Return n
927
                End If
928
                Try
929
                    L = labels.Item(s)
930
                Catch ex As Exception
931
                    L = Nothing
932
                End Try
933
                If Not L Is Nothing Then
934
                    n = L.address
935
                    Return n
936
                End If
937
            End If
938
            n = Int64.Parse(s)
939
        End If
940
        Return n
941
    End Function
942
 
943
    Overloads Sub emit(ByVal n As Int32)
944
        emit1(n, False)
945
    End Sub
946
 
947
    Sub emit1(ByVal n As Int32, ByVal pfx As Boolean)
948
        Dim wdhi As Int64
949
        Dim wdlo As Int64
950
        Dim s As String
951
 
952
        If pass = 2 Then
953
            If pfx Then
954
                s = Hex(address).PadLeft(8, "0") & vbTab & Hex(n).PadLeft(8, "0") & vbTab
955
            Else
956
                s = Hex(address).PadLeft(8, "0") & vbTab & Hex(n).PadLeft(8, "0") & vbTab & vbTab & iline
957
            End If
958
            lfs.WriteLine(s)
959
        End If
960
        If pass = 2 Then
961
            s = "32'h" & Hex(address) & ":" & vbTab & "romout <= 32'h" & Hex(n).PadLeft(8, "0") & ";"
962
            ofs.WriteLine(s)
963
        End If
964
        address = address + 4
965
 
966
    End Sub
967
 
968
End Module

powered by: WebSVN 2.1.0

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