-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdop_code_du.mas
787 lines (608 loc) · 24.6 KB
/
dop_code_du.mas
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
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
;*******************************************************************************************************
; P A M E T M I K R O I N S T R U K C I mikroprocesoru D O P - v3
;---------------------------------------------------------------------------
;
; datum posledni upravy : 2.9. 2003
; autor : MPR (Michal Prazan), MBE (Milos Becvar)
; cislo revize : 3.0
; historie : 2.1 - inicialni revize pro ZS 2001
; 2.2 - opravena instrukce RRC a RLC (nastaveni CFS)
; 3.0 - pomerne radikalni uprava firmware pro DOP-v3
;*******************************************************************************************************
;-------------------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------------------
; N A S T A V E N I P O Z A P N U T I , T E S T V N E J S I H O P R E R U S E N I
;-------------------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------------------
START: ,0,0, INTCHECK ; Nastaveni po zapnuti/resetu (momentalne prazdna operace)
INTCHECK: ,0,27, IFT ; Test IF
IFT: {
,0,0, FETCH ; IF=0 => FETCH
,0,26, HW_INT_TEST ; IF=1 => Test signalu INT
}
HW_INT_TEST: {
,0,0, FETCH ; INT=0 => FETCH
INTA ECIR, 0, 26, INTVECT ; INT=1 => INTA, cekani na prerusovaci vektor
}
INTVECT: {
,0,0, SW_INT ; INT=0 => Prerusovaci vektor nacten, jdi na obsluhu
INTA ECIR,0, 26, INTVECT ; INT=1 => INTA, cekani na prerusovaci vektor
}
;-------------------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------------------
; N A C T E N I N O V E I N S T R U K C E
;-------------------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------------------
FETCH: OEPC OEAB , 0 , 0 , ;
FMWAIT: {
OEPC MRD ECIR OEAB , 0 , 10 , FMWAIT ; Cekani na pamet
ECPC , 0 , 1 , DECODE ; test IR(7:5) - prvni rozeskoceni podle nejvyssich bitu
}
;-------------------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------------------
; D E K O D O V A N I I N S T R U K C E
;-------------------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------------------
DECODE: {
, 0 , 5 , DEC_000 ; IR(7:5)=000 LD1, LD2 - test IR(1:0)
, 0 , 5 , DEC_001 ; IR(7:5)=001 OP1, OP2 - test IR(1:0)
, 0 , 5 , DEC_010 ; IR(7:5)=010 OP1, OP2 - test IR(1:0)
, 0 , 5 , DEC_011 ; IR(7:5)=011 OP1, OP2 - test IR(1:0)
, 0 , 3 , DEC_100 ; IR(7:5)=100 ST, RLC, RRC, NOT, SHR, SCF, JSW, test IR(4:2)
, 0 , 4 , DEC_101 ; IR(7:5)=101 LD3, LD4, LD5, LD6, SWW, UCF, JSR, RET, RETI test IR(3:1)
, 0 , 9 , JP_DEC ; IR(7:5)=110 JP nebo nedef. test IR(4)
, 0 , 9 , IT_DEC ; IR(7:5)=111 IT nebo nedef. test IR(4)
}
;-------------------------------------------------------------------------------------------------------
; DRUHA UROVEN DEKODOVANI, NEKTERE INSTRUKCE REALIZOVANY JIZ V TOMTO TAKTU
;-------------------------------------------------------------------------------------------------------
DEC_000: {
, 0 , 3 , LD2 ; IR=000xxx00 LD2 / nop - test IR(4:2)
, 0 , 6 , OPLD1 ; IR=000xxx01 LD1 short - test IR(3:2) (zdroj)
, 0 , 6 , OPLD1 ; IR=000xxx10 LD1 word - test IR(3:2) (zdroj)
, 0 , 6 , OPLD1 ; IR=000xxx11 LD1 byte - test IR(3:2) (zdroj)
}
DEC_001: {
, 0 , 3, OP2_01 ; IR=001xxx00 OP2 - test IR(4:2)
, 0 , 6, OPLD1 ; IR=001xxx01 OP1 short - test IR(3:2) zdroj
, 0 , 6, OPLD1 ; IR=001xxx10 OP1 word - test IR(3:2) zdroj
, 0 , 6, OPLD1 ; IR=001xxx11 OP1 byte - test IR(3:2) zdroj
}
DEC_010: {
, 0 , 3, OP2_10 ; IR=010xxx00 OP2 - test IR(4:2)
, 0 , 6, OPLD1 ; IR=010xxx01 OP1 short - test IR(3:2) zdroj
, 0 , 6, OPLD1 ; IR=010xxx10 OP1 word - test IR(3:2) zdroj
, 0 , 6, OPLD1 ; IR=010xxx11 OP1 byte - test IR(3:2) zdroj
}
DEC_011: {
, 0 , 3, OP2_11 ; IR=011xxx00 OP2 - test IR(4:2)
, 0 , 6, OPLD1 ; IR=011xxx01 OP1 short - test IR(3:2) zdroj
, 0 , 6, OPLD1 ; IR=011xxx10 OP1 word - test IR(3:2) zdroj
, 0 , 6, OPLD1 ; IR=011xxx11 OP1 byte - test IR(3:2) zdroj
}
DEC_100: {
OEW ECOUTWR , 0 , 5 , cil ; IR=100000xx ST W test IR(1:0) cil
OEPSW ECOUTWR , 0 , 5 , cil ; IR=100001xx ST PSW test IR(1:0) cil
OES ECOUTWR , 0 , 5 , cil ; IR=100010xx ST S test IR(1:0) cil
OED ECOUTWR , 0 , 5 , cil ; IR=100011xx ST D test IR(1:0) cil
, 0 , 5 , RRCJSW ; IR=100100xx RRC,JSW nebo nedef. test IR(1:0)
ECF CFS0 , 0 , 0 , INTCHECK ; IR=100101xx instrukce SCF IR(1:0) neni dek.
, 0 , 5 , RLCNOTSHR ; IR=100110xx RLC,NOT,SHR nebo nedef. test IR(1:0)
, 0 , 0 , INTCHECK ; IR=100111xx nedef.
}
DEC_101: {
SWW , 0 , 0 , FETCH ; IR=101x000x SWW (IR(4) a IR(0) nejsou dek.)
, 0 , 7 , JSRLD6PC ; IR=101x001x JSR nebo LD6PC, test IR(4) IR(0)
, 0 , 7 , LD5S ; IR=101x010x LD5 short test IR(4) IR(0)
, 0 , 9 , LD6SPLD5WB ; IR=101x011x LD6SP nebo LD5WB test IR(4)
, 0 , 0 , INTCHECK ; IR=101x100x nedef.
OEPC OEAB , 0 , 0 , LD3 ; IR=101x101x LD3
UCF , 0 , 0 , FETCH ; IR=101x110x UCF (IR(4) a IR(0) nejsou dek.)
, 0 , 7 , RETLD4 ; IR=101x111x RET/RETI/LD4, test IR(4) IR(0)
}
JP_DEC: {
, 0 , 0 , INTCHECK ; IR=1100xxxx nedef.
, 0 , 4 , JP_podm ; IR=1101xxxx JP
}
IT_DEC: {
, 0 , 0 , INTCHECK ; IR=1110xxxx nedef.
, 0 , 0 , SW_INT ; IR=1111xxxx instr. IT = SW interrupt
}
;-------------------------------------------------------------------------------------------------------
; TRETI UROVEN DEKODOVANI
;-------------------------------------------------------------------------------------------------------
OPLD1: {
OEPC OEAB, 0 , 0, OPLD1_PC;
OESP OEAB, 0 , 0, OPLD1_SP;
OES OEAB, 0 , 0, OPLD1_S;
OED OEAB, 0 , 0, OPLD1_D;
}
RRCJSW: {
ECW CFS1 ECF, 1 , 0 , INTCHECK ; IR=10010000 instrukce RRC
OES OEAB, 0, 0, SHIFT_LEFT_ROTATE ; IR=10010001 SHIFT_LEFT_ROTATE - DU
, 0 , 0 , INTCHECK ; IR=10010010 nedef.
OEPC ECOUTWR ECSP, 0 , 0 , JSW ; IR=10010011 realizace instrukce JSW
}
RLCNOTSHR: {
, 0 , 18 , RLC ; IR=10011000 instrukce RLC (musime testovat CF)
OEW ECF ECW , 3 , 0 , INTCHECK ; IR=10011001 not(W)->W
ECF , 15, 0 , SHR ; IR=10011010 SHR prvni krok (nastaveni CF dle znamenka)
, 0 , 0 , INTCHECK ; IR=10011011 nedef.
}
JSRLD6PC: {
OEPC OEAB, 0 , 0 , JSRW1 ; IR=10100010 JSR
, 0 , 0 , INTCHECK ; IR=10100011 nedef.
OEPC OEAB, 0 , 0 , LD6PCW1 ; IR=10110010 LD6PC WORD
OEPC OEAB, 0 , 0 , LD6PCB1 ; IR=10110011 LD6PC BYTE
}
RETLD4: {
, 0 , 0 , INTCHECK ; IR=10101110 nedef.
OEPC OEAB, 0 , 0 , LD3 ; IR=10101111 LD4 (sdili zacatek s LD3)
OESP OEAB, 0 , 0 , RETW1 ; IR=10111110 RET
OESP OEAB, 0 , 0 , RETW1 ; IR=10111111 RETI (sdili zacatek s RET)
}
LD5S: {
, 0 , 0 , INTCHECK ; IR=10100100 nedef.
OEW OEAB , 0 , 0 , LD5W1 ; IR=10100101 LD5 SHORT
, 0 , 0 , INTCHECK ; IR=10110100 nedef.
, 0 , 0 , INTCHECK ; IR=10110101 nedef.
}
LD6SPLD5WB: {
OEW OEAB , 0 , 0 , LD5W1 ; IR=1010011X LD5 WORD/BYTE
OESP OEAB, 0 , 0 , LD6SP ; IR=1011011X LD6 SP WORD/BYTE
}
;-------------------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------------------
; R E A L I Z A C E J E D N O T L I V Y C H I N S T R U K C I
;-------------------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------------------
;------------------------------------------
; Dokonceni "KRATKYCH" instrukci RLC a SHR
;------------------------------------------
RLC: {
ECF ECW , 15 , 0 , INTCHECK ; RLC pro CF=0
ECF ECW CI0, 15 , 0 , INTCHECK ; RLC pro CF=1
}
SHR: ECW CFS1 ECF, 1 , 0 , INTCHECK ; dokonceni SHR CF<-W(0), W(15)<-CF, W(14:0)<-W(15:1)
;------------------------------------------
; KOMPLETNI REALIZACE INSTRUKCE ST
;------------------------------------------
; volba cilove adresy + typ cile
cil: {
ECSP , 0 , 0 , SPW ; odskok na spw (cil (word) na adresu v SP)
ECSP , 0 , 0 , SPB ; odskok na spb (cil (byte) na adresu v SP)
OED OEAB , 0 , 0 , DW ; odskok na dw (cil (word) na adresu v D)
OED OEAB , 0 , 0 , DB ; odskok na db (cil (byte) na adresu v D)
}
; vlastni realizace instrukce ST
;----------------------------------
DW: {
OED OEAB MWR OEWR , 0 , 10 , DW ; - realizace instrukce ST (cil (word) na adresu v D)
OED OEAB OEWR ECD , 0 , 0 , ;
}
OED OEAB OEWR LH , 0 , 0 , ;
DW2: {
OED OEAB MWR OEWR LH , 0 , 10 , DW2; druha slabika
OED OEAB ECD OEWR LH , 0 , 0 , INTCHECK ;
}
DB: {
OED OEAB MWR OEWR , 0 , 10 , DB ; - realizace instrukce ST (cil (byte) na adresu v D)
OED OEAB OEWR ECD , 0 , 0 , INTCHECK ;
}
SPW: OESP OEAB OEWR LH, 0 , 0 , ; - realizace instrukce ST (cil (word) na adresu v SP)
SPW1: {
OESP OEAB MWR OEWR , 0 , 10 , SPW1;
OESP OEAB ECSP OEWR , 0 , 0 , ;
}
OESP OEAB OEWR LH, 0 , 0 , ;
SPW2: {
OESP OEAB MWR OEWR LH, 0 , 10 , SPW2; druha slabika
OESP OEAB OEWR LH, 0 , 0 , INTCHECK;
}
SPB: OESP OEAB OEWR LH, 0 , 0 , ; - realizace instrukce ST (cil (byte) na adresu v SP)
SPB1: {
OESP OEAB MWR OEWR , 0 , 10 , SPB1;
OESP OEAB OEWR, 0 , 0 , INTCHECK;
}
;------------------------------------------------
; REALIZACE INSTRUKCE JSW
;----------------------------------
JSW: OEW PEPC , 0 , 0 , SPW ;
;------------------------------------------------
;------------------------------------------------
; REALIZACE INSTRUKCE JSR
;----------------------------------
JSRW1: {
OEPC OEAB MRD ECINL, 0 , 10 , JSRW1 ;
ECPC , 0 , 0 , ;
}
OEPC OEAB ECSP , 0 , 0 , ;
JSRW2: {
OEPC OEAB MRD ECINH, 0 , 10 , JSRW2;
ECPC , 0 , 0 , ;
}
OEPC ECOUTWR , 0 , 0 , ; ulozeni stareho PC
OEINLH PEPC , 0 , 0 , SPW ; RETADR = SPW
;------------------------------------------------
; REALIZACE INSTRUKCE LD5
;----------------------------------
LD5W1: {
OEW OEAB MRD ECINL , 0 , 10 , LD5W1;
ECW CI0, 8 , 5 , LD5_DC ; dekodovani IR1 IR0
}
LD5_DC: {
, 0 , 0 , INTCHECK ; redundantni, sem se to nikdy nedostane
OEINSE ECW , 2 , 0 , INTCHECK ;
OEW OEAB , 0 , 0 , LD5W2 ;
OEINZE ECW , 2 , 0 , INTCHECK ;
}
LD5W2: {
OEW OEAB MRD ECINH , 0 , 10 , LD5W2;
OEINLH ECW , 2 , 0 , INTCHECK ;
}
;-----------------------------------------------
; REALIZACE INSTRUKCE LD3 (LD4)
;----------------------------------
LD3: {
OEPC OEAB MRD ECINL , 0 , 10 , LD3;
OESP ECW ECPC , 2 , 12 , LD3DC ; Test IR(2) - LD3 nebo LD4
}
LD3DC: {
OEINZE ECW CI0, 11 , 9 , LD3CIL ; SP-W->W test IR(4)
OEINZE ECW CI0, 11 , 0 , INTCHECK ; SP-W->W konec instrukce LD4
}
LD3CIL: {
OEW PES , 0 , 0 , INTCHECK ; LLA S
OEW PED , 0 , 0 , INTCHECK ; LLA D
}
;------------------------------------------------
; REALIZACE INSTRUKCE LD6
;----------------------------------
; zdroj SP
LD6SP: {
OESP OEAB MRD ECINH ECINL, 0 , 10 , LD6SP;
UDSP ECSP , 0 , 11 , testw ; dekodovani IR(0)
}
testw: {
OESP OEAB , 0 , 0 , LD6SPW2 ; (dale word)
OEINZE PEL , 0 , 0 , INTCHECK ; (byte)
}
LD6SPW2: {
OESP OEAB MRD ECINL , 0 , 10 , LD6SPW2;
OEINLH PEF PEL UDSP ECSP , 0 , 0 , INTCHECK ;
}
; zdroj PC (byte)
LD6PCB1: {
OEPC OEAB MRD ECINL , 0 , 10 , LD6PCB1;
OEINZE PEL ECPC, 0 , 0 , INTCHECK ;
}
; zdroj PC (word)
LD6PCW1: {
OEPC OEAB MRD ECINL , 0 , 10 , LD6PCW1;
ECPC , 0 , 0 , ;
}
OEPC OEAB , 0 , 0 , ;
LD6PCW2: {
OEPC OEAB MRD ECINH , 0 , 10 , LD6PCW2;
ECPC OEINLH PEF PEL , 0 , 0 , INTCHECK ;
}
;------------------------------------------------
; REALIZACE INSTRUKCE RET
;----------------------------------
RETW1: {
OESP OEAB MRD ECINH , 0 , 10 , RETW1;
UDSP ECSP , 0 , 0 , ;
}
OESP OEAB , 0 , 0 , ;
RETW2: {
OESP OEAB MRD ECINL , 0 , 10 , RETW2;
UDSP ECSP OEINLH PEPC , 0 , 11 , P3_11; dekodovani IR0 (RETI/RET)
}
P3_11: {
, 0 , 0 , INTCHECK ; instrukce RET
OESP OEAB , 0 , 0 , RETIW1 ; instrukce RETI
}
;------------------------------------------------
; REALIZACE INSTRUKCE RETI
;----------------------------------
RETIW1: {
OESP OEAB MRD ECINH , 0 , 10 , RETIW1;
UDSP ECSP , 0 , 0 , ;
}
OESP OEAB , 0 , 0 , ;
RETIW2: {
OESP OEAB MRD ECINL , 0 , 10 , RETIW2;
UDSP ECSP OEINLH PEF PEL , 0 , 0 , INTCHECK; DI -> PSW
}
;=======================================================================================================
; KOMPLETNI REALIZACE INSTRUKCE LD1 a OP1
;-----------------------------------------
;zdroj PC
;-----------------------------------------------------------------------------------
OPLD1_PC: {
OEPC OEAB MRD ECINL , 0 , 10, OPLD1_PC;
ECPC , 0 , 5 , OPLD1_PC_DE ; dekodovani IR1 IR0
}
OPLD1_PC_DE: {
, 0 , 0 , INTCHECK ; nedef. sem se to nedostane
, 0 , 2 , OPLD1_s ; dekodovani IR6 IR5 IR4 - znamenkove rozsireni
OEPC OEAB , 0 , 0 , OPLD1_PCW2 ; dalsi slabika (word)
, 0 , 2 , OPLD1_b ; dekodovani IR6 IR5 IR4 - nulove rozsireni
}
OPLD1_PCW2: {
OEPC OEAB MRD ECINH , 0 , 10 , OPLD1_PCW2 ;
ECPC , 0 , 2 , OPLD1_w ; dekodovani IR6 IR5 IR4
}
;zdroj SP
;-----------------------------------------------------------------------------------
OPLD1_SP: {
OESP OEAB MRD ECINL ECINH , 0 , 10 , OPLD1_SP ;
UDSP ECSP , 0 , 5 , ; dekodovani IR1 IR0
}
OPLD1_SPD: {
, 0 , 0 , INTCHECK ; nedef. sem se to nedostane
, 0 , 2 , OPLD1_s ; dekodovani IR6 IR5 IR4 - znamenkove rozsireni
OESP OEAB , 0 , 0 , OPLD1_SPW2 ;
, 0 , 2 , OPLD1_b ; dekodovani IR6 IR5 IR4 - nulove rozsireni
}
OPLD1_SPW2: {
OESP OEAB MRD ECINL , 0 , 10 , OPLD1_SPW2 ;
UDSP ECSP , 0 , 2 , OPLD1_w; dekodovani IR6 IR5 IR4
}
;zdroj S
;-----------------------------------------------------------------------------------
OPLD1_S: {
OES OEAB MRD ECINL , 0 , 10 , OPLD1_S;
ECS , 0 , 5 ,; dekodovani IR1 IR0
}
OPLD1_SD: {
, 0 , 0 , INTCHECK ; nedef. sem se to nedostane
, 0 , 2 , OPLD1_s ; dekodovani IR6 IR5 IR4 - znamenkove rozsireni
OES OEAB , 0 , 0 , OPLD1_SW2 ; word - dalsi slabiku
, 0 , 2 , OPLD1_b ; dekodovani IR6 IR5 IR4 - nulove rozsireni
}
OPLD1_SW2: {
OES OEAB MRD ECINH , 0 , 10 , OPLD1_SW2 ;
ECS , 0 , 2 , OPLD1_w; dekodovani IR6 IR5 IR4
}
;zdroj D
;-----------------------------------------------------------------------------------
OPLD1_D: {
OED OEAB MRD ECINL , 0 , 10 , OPLD1_D ;
, 0 , 5 , OPLD1_DC ; dekodovani IR1 IR0
}
OPLD1_DC: {
, 0 , 0 , INTCHECK ; nedef. sem se to nedostane
, 0 , 2 , OPLD1_s ; dekodovani IR6 IR5 IR4 - znamenkove rozsireni
ECD , 0 , 0 , OPLD1_D_w ; dekodovani IR6 IR5 IR4
, 0 , 2 , OPLD1_b ; dekodovani IR6 IR5 IR4 - nulove rozsireni
}
OPLD1_D_w: OED OEAB , 0 , 0 , ;
OPLD1_DW2: {
OED OEAB MRD ECINH , 0 , 10 , OPLD1_DW2 ;
UDD ECD , 0 , 2 , OPLD1_w; dekodovani IR6 IR5 IR4
}
;-----------------------------------------------------------------------------------
; (short, sign) znamenkove rozsireni
OPLD1_s: {
OEINSE PES , 0 , 0 , INTCHECK ; => S
OEINSE PED , 0 , 0 , INTCHECK ; => D
OEINSE ECF ECW , 10 , 0 , INTCHECK ; operace +
OEINSE ECF ECW CI0, 11 , 0 , INTCHECK ; operace -
OEINSE ECF ECW , 4 , 0 , INTCHECK ; operace AND
OEINSE ECF ECW , 5 , 0 , INTCHECK ; operace OR
OEINSE ECF ECW , 6 , 0 , INTCHECK ; operace XOR
OEINSE ECW , 2 , 0 , INTCHECK ; => W (not setting Flags !)
}
; word
OPLD1_w: {
OEINLH PES , 0 , 0 , INTCHECK ; => S
OEINLH PED , 0 , 0 , INTCHECK ; => D
OEINLH ECF ECW , 10 , 0 , INTCHECK ; operace +
OEINLH ECF ECW CI0, 11 , 0 , INTCHECK ; operace -
OEINLH ECF ECW , 4 , 0 , INTCHECK ; operace AND
OEINLH ECF ECW , 5 , 0 , INTCHECK ; operace OR
OEINLH ECF ECW , 6 , 0 , INTCHECK ; operace XOR
OEINLH ECW , 2 , 0 , INTCHECK ; => W (not setting Flags !)
}
; (byte) nulove rozsireni
OPLD1_b: {
OEINZE PES , 0 , 0 , INTCHECK ; => S
OEINZE PED , 0 , 0 , INTCHECK ; => D
OEINZE ECF ECW , 10 , 0 , INTCHECK ; operace +
OEINZE ECF ECW CI0, 11 , 0 , INTCHECK ; operace -
OEINZE ECF ECW , 4 , 0 , INTCHECK ; operace AND
OEINZE ECF ECW , 5 , 0 , INTCHECK ; operace OR
OEINZE ECF ECW , 6 , 0 , INTCHECK ; operace XOR
OEINZE ECW , 2 , 0 , INTCHECK ; => W (not setting Flags !)
}
;-----------------------------------------------------------------------------------
; KOMPLETNI REALIZACE INSTRUKCE LD2
;-----------------------------------
LD2: {
, 0 , 0 , INTCHECK ; nedef. IR=00000000
, 0 , 0 , INTCHECK ; nedef. IR=00000100
, 0 , 0 , INTCHECK ; nedef. IR=00001000
, 0 , 0 , INTCHECK ; nedef. IR=00001100
OEW PEPC , 0 , 0 , INTCHECK ; W => PC IR=00010000
OEW PESP , 0 , 0 , INTCHECK ; W => SP IR=00010100
OEW PES , 0 , 0 , INTCHECK ; W => S IR=00011000
OEW PED , 0 , 0 , INTCHECK ; W => D IR=00011100
}
;-----------------------------------------------------------------------------------
; KOMPLETNI REALIZACE INSTRUKCE OP2
;-----------------------------------
; operace + , -
OP2_01: {
OEW ECW ECF , 10 , 0 , INTCHECK ; IR(4:2)=000 OP=010 W
OEAF ECW ECF , 10 , 0, INTCHECK ; IR(4:2)=001 OP=010 XAF
OES ECW ECF , 10 , 0 , INTCHECK ; IR(4:2)=010 OP=010 S
OED ECW ECF , 10 , 0 , INTCHECK ; IR(4:2)=011 OP=010 D
OEW ECW ECF CI0 , 11 , 0 , INTCHECK ; IR(4:2)=100 OP=011 W
OEAF ECW ECF CI0, 11 , 0, INTCHECK ; IR(4:2)=101 OP=011 XAF
OES ECW ECF CI0, 11 , 0 , INTCHECK ; IR(4:2)=110 OP=011 S
OED ECW ECF CI0, 11 , 0 , INTCHECK ; IR(4:2)=111 OP=011 D
}
; operace AND , OR
OP2_10: {
OEW ECW ECF , 4 , 0 , INTCHECK ; IR(4:2)=000 OP=100 W
OEAF ECW ECF , 4 , 0, INTCHECK ; IR(4:2)=001 OP=100 XAF
OES ECW ECF , 4 , 0 , INTCHECK ; IR(4:2)=010 OP=100 S
OED ECW ECF , 4 , 0 , INTCHECK ; IR(4:2)=011 OP=100 D
OEW ECW ECF , 5 , 0 , INTCHECK ; IR(4:2)=100 OP=101 W
OEAF ECW ECF , 5 , 0, INTCHECK ; IR(4:2)=101 OP=101 XAF
OES ECW ECF , 5 , 0 , INTCHECK ; IR(4:2)=110 OP=101 S
OED ECW ECF , 5 , 0 , INTCHECK ; IR(4:2)=111 OP=101 D
}
; operace XOR , MOVE
OP2_11: {
OEW ECW ECF , 6 , 0 , INTCHECK ; IR(4:2)=000 OP=110 W
OEAF ECW ECF, 6 , 0 , INTCHECK ; IR(4:2)=001 OP=110 XAF
OES ECW ECF, 6 , 0 , INTCHECK ; IR(4:2)=010 OP=110 S
OED ECW ECF, 6 , 0 , INTCHECK ; IR(4:2)=011 OP=110 D
, 0 , 0 , INTCHECK ; W->W = instrukce NOP
OESP ECW , 2 , 0 , INTCHECK ; SP -> W (zde opravdu neni XAF)
OES ECW , 2 , 0 , INTCHECK ; IR(4:2)=110 OP=111 S
OED ECW , 2 , 0 , INTCHECK ; IR(4:2)=111 OP=111 D
}
;=======================================================================================================
; KOMPLETNI REALIZACE INSTRUKCI JP a IT
;--------------------------------------
; test IR(3:1) - typ podminky
; vsechny priznaky testovany xor IR(0) => 0 ... priznak=IR(0)
; 1 ... priznak<>IR(0)
JP_podm: {
, 0 , 24 , test_flag ; JC, JNC
, 0 , 23 , test_flag ; JZ, JNZ
, 0 , 22 , test_flag ; JS, JNS
, 0 , 21 , test_flag ; JO, JNO
ECL , 0 , 0 , LZERO_POM ; DJNZ, DJZ (L musi byt napred dekrementovan)
, 0 , 25 , test_flag ; JGE, JLT
, 0 , 0 , INTCHECK ; rezervovano
, 0 , 11 , jmp_test ; tato podminka je vzdy splnena, test IR(0)
}
LZERO_POM: ,0, 20, test_flag ; test LZERO
test_flag: {
OEPC OEAB, 0 , 0 , JP ; test splnen - skok na vykonnou cast JP
ECPC, 0 , 0 , nesplneno ; test nesplnen
}
nesplneno: ECPC , 0 , 0 , INTCHECK ; posledni inkrementace PC (nesplneny skok)
jmp_test: {
ECPC, 0 , 0 , nesplneno ; IR=11011110 , nikdy nesplneny skok
OEPC OEAB , 0 , 0 , JP ; IR=11011111 nepodmineny skok JMP
}
;---------------------------------------
; VLASTNI VYKONNA CAST INSTRUKCE JP
;---------------------------------------
JP: {
OEPC OEAB MRD ECINL , 0 , 10 , JP;
ECPC , 0 , 0 ,;
}
OEPC OEAB , 0 , 0 , ;
JPW2: {
OEPC OEAB MRD ECINH , 0 , 10 , JPW2 ;
OEINLH PEPC , 0 , 0 , INTCHECK ;
}
;--------------------------------------------
; VLASTNI VYKONNA CAST INSTRUKCE IT
; TEZ OBSLUHA HW PRERUSENI (DOP-v2 a novejsi)
;--------------------------------------------
SW_INT: OEPSW ECOUTWR ECSP , 0 , 0 , ; PSW -> DOUT SP++
OESP OEAB, 0 , 0 , ;
SW_INTW1: {
OESP OEAB OEWR MWR , 0 , 10 , SW_INTW1 ;
OESP ECSP OEWR , 0 , 0 , ; SP++
}
OESP OEAB OEWR LH, 0 , 0 , ;
SW_INTW2: {
OESP OEAB LH OEWR MWR , 0 , 10 , SW_INTW2 ;
OESP OEAB LH OEWR ECSP, 0 , 0 , ; SP++
}
OEINZE PEF, 0 , 0 , ; nulovani priznaku
OEPC ECOUTWR , 0 , 0 , ; PC -> DOUT
OEIT PEPC , 0 , 0 , SPW ; skok na zapis slova podle SP (drive RETADR)
;-------------------------------------------
;Posuňte cyklicky dvojité slovo uložené v paměti na adrese
;uložené v registru S vpravo o počet pozic, který je dán hodnotou registru L. Výsledek
;uložte do paměti na adresu určenou v registru D. Nastavte příznaky
;-------------------------------------------
;prvne rozvist na co nejdelsi, odeslat na git
SHIFT_LEFT_ROTATE: {
OES OEAB MRD ECINL, 0, 10, SHIFT_LEFT_ROTATE ; nacteme nizsi slabiku
ECS, 0, 0, ; zvysime ukazatel na pamet
}
OES OEAB, 0, 0, ; adresace pameti
READ_H2: {
OES OEAB MRD ECINH, 0, 10, READ_H2 ; nacetem vyssi slabiku
OEINLH PEU ECS, 0, 0, ; zapis do registru U - nizsi a zvysime ukazatel na pamet
}
;**********************************************************************************
init3: OES OEAB, 0, 0, ; adresace pameti
READ_L3: {
OES OEAB MRD ECINL, 0, 10, READ_L3 ; nacteme nizsi slabiku
ECS, 0, 0, ; zvysime ukazatel na pamet
}
OES OEAB, 0, 0, ; adresace pameti
READ_H3: {
OES OEAB MRD ECINH, 0, 10, READ_H3 ; nacetem vyssi slabiku
OEINLH PET, 0, 0, ; zapis do registru U - nizsi
}
ECS, 0, 0, ; zvysime ukazatel na pamet a rovnou testujem zero flag
;**********************************************************************************
;------------------------------vymaskování L s 00011111
OEL ECW ECF , 2, 0 , ; L -> W , amortizovani flagů kvůli carry!!
ECW , 15, 0, ; shift left
ECW , 15, 0, ; shift left
ECW , 15, 0, ; shift left
ECW , 1 , 0, ; shift right
ECW , 1 , 0, ; shift right
ECW , 1 , 0, ; shift right
OEW PEL , 0, 0, ; W -> L
, 0, 14, CHECK_ZERO_L ; checks if L is zero
;-------------------------------kontrola L!=0
CHECK_ZERO_L: {
OEU ECW , 2 , 0 , pre_shift ; nacteni U -> W, pokud neni nula
OEU ECW ECF UCF , 2, 0, check_higher; pokud je nula, ihned zapis zpet do pameti U -> W a setni flagy na nizsi slovo
}
pre_shift: CFS1 ECF, 7, 0, ; setne nejnizsi bit vyssiho slova jako carry flag
one_shift: OEW PEU, 0, 0, ; vrati U nazpet
;**********************************************************************************
lo_right: OET ECW, 2, 0, ; nacte T -> W
ECF ECW CFS1, 1, 0, ; posuv o 1 vpravo za pomoci carry z predesle ALU operace a opet setne nejnizsi bit
OEW PET , 0, 0, ; zapis w -> T
;**********************************************************************************
hi_right: OEU ECW , 2, 0, ; nacte U -> W
ECF ECW , 1, 0, ; posuv o 1 vpravo za pomoci carry z predesle ALU operace
;**********************************************************************************
ECL , 0, 0, ; L--
, 0, 14, ; loop
loop: {
CFS1 ECF, 7, 0, one_shift ; L neni nulove, rovnou setnu nejnizsi bit vyssiho slova jako carry flag
OEW PEU UCF, 0, 0, check_higher ; L je nula, zapisu w -> U A pripravim cumulative zero mode
}
;**********************************************************************************
check_higher: OET ECW ECF, 2, 0, ; T -> W a rovnou setnout flagy
write: OEU ECOUTWR, 0, 0, ; U->DOUT
OED OEAB, 0, 0, ; adresace pameti
wr_lo: {
OED OEAB MWR OEWR, 0, 10, wr_lo ; zapis dat do pameti lo
OED OEAB OEWR ECD, 0, 0, ; presah
}
OED OEAB, 0, 0, ; adresace pameti
wr_hi: {
OED OEAB MWR OEWR LH, 0, 10, wr_hi ; zapis dat do pameti hi
OED OEAB ECD OEWR LH, 0, 0, ;
}
;**********************************************************************************
write2: OET ECOUTWR, 0, 0, ; T->DOUT
OED OEAB, 0, 0, ; adresace pameti
wr_lo2: {
OED OEAB MWR OEWR, 0, 10, wr_lo2 ; zapis dat do pameti lo
OED OEAB OEWR ECD, 0, 0, ; presah
}
OED OEAB, 0, 0, ; adresace pameti
wr_hi2: {
OED OEAB MWR OEWR LH, 0, 10, wr_hi2 ; zapis dat do pameti hi
OED OEAB OEWR LH ECD, 0, 0, INTCHECK ;
}
;**********************************************************************************