-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathnemiga-406.lst
1284 lines (1257 loc) · 43.5 KB
/
nemiga-406.lst
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
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
; Дизассемблированное ПЗУ компьютера НЕМИГА ПК 588 версия 4.06
;
000004: DW ; Адрес прерывания
000006: DW ; PSW прерывания
000010: DW ; Адрес прерывания
000012: DW ; PSW прерывания
000014: DW ; Адрес прерывания - прерывание по T-разряду или команда BPT
000016: DW ; PSW прерывания
000020: DW ; Адрес прерывания - команда IOT
000022: DW ; PSW прерывания
000024: DW ; Адрес прерывания - питание
000026: DW ; PSW прерывания
000030: DW ; Адрес прерывания - команда EMT
000032: DW ; PSW прерывания
000034: DW ; Адрес прерывания - команда TRAP
000036: DW ; PSW прерывания
000060: DW ; Прерывание клавиатура
000062: DW ; PSW прерывания
000064: DW ; Прерывание дисплей
000066: DW ; PSW прерывания
000100: DW ; Адрес прерывания - таймер
000104: DW ; Адрес подпрограммы обработки сигнала Н4 - от сетевой карты
000110; DW ; Прерывание "мелодия закончилась кодом 040"
000112: DW ; PSW прерывания
000204: DW ; WORK - рабочий регистр
000206: DW ; VFORM - регистр вертикального формата
000210: DW ; BRIGHT - регистр яркости (0..3)
000212: DW ; XNEW - регистр новой X-координаты
000214: DW ; YNEW - регистр новой Y-координаты
000216: DW ; XOLD - регистр старой X-координаты
000220: DW ; YOLD - регистр старой Y-координаты
; ==== Начало ПЗУ - см. PULT.MAC =====================================================
160000: DW 177570 ; ??
160002: DW 160210, 000341 ; Вектор прерывания сигнала/команды HALT
160006: DW 161726, 000340 ; Вектор прерывания - дв.ошибка канала, запуск
160012: DW 161142, 000340 ; Вектор прерывания - ошибка ввода адреса вектора
160016: JMP @#163466 ; MODE3 - Вызов с запретом системных прерываний
160022: JMP @#163504 ; SYSLIN - Вывод в служебную строку
160026: JMP @#163722 ; TT.OUT - Системный вывод через MODE
160032: JMP @#163726 ; SYSOUT - Системный вывод
160036: JMP @#162274 ; PRINT - Вывод текста
160042: JMP @#165346 ; DRAW - Нарисовать линию, сохранив XOLD,YOLD
160046: JMP @#165340 ; QDRAW то же для QUASIC
160052: JMP @#165342 ; FDRAW то же для FORTRAN
160056: JMP @#165376 ; LINE - Нарисовать линию
160062: JMP @#165370 ; QLINE то же для QUASIC
160066: JMP @#165372 ; FLINE то же для FORTRAN
160072: JMP @#165606 ; POINT - Нарисовать точку
160076: JMP @#165600 ; QPOINT то же для QUASIC
160102: JMP @#165602 ; FPOINT то же для FORTRAN
160106: JMP @#165672 ; RPOINT - Читать яркость точки
160112: JMP @#162236 ; QRPOIN то же для QUASIC
160116: JMP @#165664 ; FRPOIN то же для FORTRAN
160122: JMP @#162236 ; DUMP - напечатать восьмеричное число R3
160126: JMP @177754 ; SOUND
; ==== HALT MONITOR
.RESET - Обработка канального сигнала СБРОС
160142: MOV #000357, @#000206 ; 239. -> VFORM
160150: CLR @#177560 ; Сброс состояния клавиатуры
160154: MOV #000200, @#177564 ; Уст. состояние терминала - не готов, запрет прерывания
160162: CLR @#177770
160166: BIC #177541, @#177766 ; Режим дисплея - оставляем только флаги #136
HOUT:
160174: MOV (SP)+, R0
160176: JMP @#161074 ; .PULT - Завершаем обработку прерывания HALT
;
; Обработка нажатия СТОП и кнопки ОСТ
PULT: ; УПР/СТОП или команда HALT
160202: MOV (SP)+, R0 ; Восстанавливаем R0
160204: JMP @#161142 ; Переходим к сохранению регистров и пульту
;
; Обработчик прерывания по сигналу/команде HALT
HMON:: ; диспетчер HALT прерываний.
160210: CMP #056364, @#177776 ; Проверка, настроена ли память режима HALT
160216: BEQ 160224 ; да, настроена
160220: JMP @#161720 ; нет => DOUBL - перезапуск
O.K.:
160224: MOV R0, -(SP) ; Сохраняем R0 чтобы не испортить
160226: BIS #000200, @#177564 ; ТТ: всегда готов !
160234: BIT #176000, @#170006 ; Проверка старших 6 бит регистра фиксации HALT
160242: BMI 160142 ; была команда RESET
160244: BEQ 160202 ; была команда HALT
160246: BIT #004000, @#170006 ; Сигнал Н4? - адаптер локальной сети
160254: BEQ 160262 ; нет
160256: CALL @000104 ; SH4 - локальная сеть.
.DISP:
160262: BIT #040000, @#170006 ; SH1 - по записи в TTD
160270: BEQ 160302 ; нет => переходим
160272: MOV @#177566, R0 ; Регистр данных терминала - символ для вывода на экран
160276: CALL @#163726 ; SYSOUT Вывод символа R0 на экран
.RDKEY:
160302: BIT #020000, @#170006 ; SH2 - по чтению из KBD
160310: BEQ 160334 ; нет => переходим
160312: MOVB @#177767, R0 ; Провека буферной ячейки клавиатуры
160316: BEQ 160326 ; буфер пуст => переходим
160320: CLRB @#177767 ; Очищаем буфер
160324: BR 160526 ; вывод второй части.
EMPTY:
160326: BIC #177677, @#177560 ; сброс бита прерывания клавиатуры.
.KEY::
160334: MOV @#170006, R0 ; KEY - по нажатию клавиши.
160340: BIT #002000, R0 ; Пришёл байт с клавиатуры?
160344: BEQ 160606 ; нет =>
160346: BIC #177400, R0 ; код КОИ-8
160352: BEQ 160202 ; код 0 -- УПР/СТОП.
160354: TSTB @#177560 ; Состояние клавиатуры - готов к приёму?
160360: BMI 160606 ; нет =>
; Нажата клавиша - выдаём звук нажатия клавиши
160362: MOV R1, -(SP)
160364: MOV R2, -(SP)
160366: TSTB @#177761 ; Флаг блокировки вызова SOUND
160372: BNE 160410 ; играет мелодия.
160374: CALL @#160126 ; SOUND
160400: BR 160410 ;
160402: DW 160404 ; Адрес мелодии нажатия клавиши
160404: DB 011, 214, 001, 000 ; Мелодия - звук длиной 1/50 сек
; Обработка нажатой клавиши
160410: MOV #177766, R1 ; Адрес Режим дисплея
160414: MOV #000100, R2
160420: TSTB (R1) ; проверяем бит 7 в Режим дисплея
160422: BPL 160522 l бит 7 = 0 ? => переход
160424: BITB #000300, R0
160430: BEQ 160500
160432: BPL 160462
160434: BIT R2, R0
160436: BEQ 160522
160440: BIC #177600, R0
160444: BITB R2, (R1)+
160446: BNE 160522
160450: MOVB R0, (R1)
160452: MOV #000016, R0
160456: BISB R2, -(R1)
160460: BR 160522
LAT:
160462: BITB R2, (R1)+ ; лат. регистр установлен ?
160464: BEQ 160522
160466: MOVB R0, (R1) ; нет - двойной код: ЛАТ-символ.
160470: MOV #000017, R0
160474: BICB R2, -(R1)
160476: BR 160522
160500: CMPB R0, #000040 ; >= ' ' ?
160504: BHIS 160522 ; да =>
160506: MOVB 161102(R0), @#177767 ; управляющие последовательности.
160514: BEQ 160522 ; типа: АР2-код.
160516: MOV #000033, R0 ; код ESC
REG2:
160522: MOV (SP)+, R2
160524: MOV (SP)+, R1
160526: MOV R0, @#177562 ; стандартная клавиатура.
160532: MOV (SP)+, R0
160534: BIS #000200, @#177560 ; Состояние клавиатуры - сброс бита готовности
160542: BIT #000100, @#177560 ; Состояние клавиатуры - разрешено прерывание?
160550: BEQ 161074 ; нет => Завершаем обработку прерывания HALT
160552: BISB #000001, @#177766 ; Запрещаем прерывание по вектору 000064
160560: TSTB 000002(SP)
160564: BMI 161074 ; => Завершаем обработку прерывания HALT
INT.K: ; эмуляция прерывания от клавиатуры.
160566: BICB #000001, @#177766 ; Разрешаем прерывание по вектору 000064
160574: MOV @#000062, -(SP) ; Кладём в стек PSW
160600: MOV @#000060, -(SP) ; адрес прерывания по вектору 60
160604: BR 161074 ; HOUT1 - Завершаем обработку прерывания HALT
.CLOCK:: ; SH3 - по системным часам.
160606: MOV (SP)+, R0 ; Восстанавливаем R0
160610: BIT #010000, @#170006 ; Сигнал Н3?
160616: BEQ 161074 ; нет => Завершаем обработку прерывания HALT
; Обработка сигнала Н3
160620: MOV R4, -(SP) ; Сохраняем R4
160622: TST @#177760 ; Флаг блокировки SOUND
160626: BPL 160750 ; bit7=0 => переходим
160630: MOV @#177752, R4 ; Берём адрес продолжения мелодии
160634: INCB @#177760 ; Увеличиваем счётчик длительности ноты
160640: CMPB @#177760, 177777(R4) ; Сравниваем с длительностью ноты
160646: BLO 160750 ; пока не кончилась => переходим
160650: TSTB (R4) ; 200 ?
160652: BMI 160744 ; да => переходим
160654: BITB #000037, (R4) ; Есть ещё нота мелодии?
160660: BNE 160740 ; да => переходим
160662: BIC #100000, @#177760 ; Снимаем флаг блокировки SOUND
; Обработка флагов завершения мелодии
160670: BITB #000040, (R4) ; 040 и 140 ?
160674: BNE 160712 ; да => переходим
160676: TSTB (R4) ; 000 ? (никаких действий по окончании мелодии)
160700: BEQ 160750 ; да => переходим
160702: CALL @#160126 ; SOUND
160706: BR 160750
160710: DW 000000
; Окончание мелодии байтом 040 либо 140
160712: BITB #000100, (R4)+ ; байт 140?
160716: BNE 160734 ; да => переход
160720: MOV (SP)+, R4
160722: MOV @#000112, -(SP) ; Сохраняем в стеке переход
160726: MOV @#000110, -(SP) ; на прерывание по вектору 110
160732: BR 161074 ; к разрешению прерываний и RTI
; Окончание мелодии байтом 140
160734: CLRB (R4) ; Очистка байта после конца мелодии
160736: BR 160750 ; переходим к работе с курсором
;
160740: MOVB (R4)+, @#170030 ; Октава и громкость
160744: CALL @#162520 ; Обработка продолжения мелодии
; Мигание курсора
160750: DECB @#177756 ; Уменьшаем счётчик мигания
160754: BPL 161034 ; значение >= 0 ? => переходим
160756: MOVB #000007, @#177756 ; Новое значение счётчика
160764: COMB @#177757 ; Инвертировать состояние курсора при мигании
160770: MOV @#177772, R4 ; Смещение курсора
160774: BMI 161034
160776: TSTB @#177771 ; Состояние курсора??
161002: BMI 161034
161004: ADD @#177746, R4 ; + адрес 25-й строки экрана
161010: BMI 161034
161012: ROL R4
161014: BMI 161034
161016: BIS #000001, @#177574 ; Включаем экран в основную память
161024: COM (R4) ; Инвертирование восьми пикселей - курсор
161026: BIC #000001, @#177574 ; Отключаем экран из основной памяти
161034: MOV (SP)+, R4 ; Восстанавливаем R4
161036: TSTB 000002(SP) ; приоритет ССП < 4 ?
161042: BMI 161074 ; ?? => Завершаем обработку прерывания HALT
161044: BITB #000001, @#177766 ; был запрос от клавиатуры ?
161052: BNE 160566
161054: BIT #000100, @#177564 ; прерывание от дисплея нужно ?
161062: BEQ 161074 ; нет => Завершаем обработку прерывания HALT
; Эмуляция прерывания от дисплея
161064: MOV @#000066, -(SP) ; сохраняем PSW
161070: MOV @#000064, -(SP) ; и адрес для перехода по вектору 000064
; HOUT1: Завершение обработки прерывания HALT
161074: CLRB @#170006 ; Разрешаем системные прерывания
161100: RTI
; Таблица байт - маппинг кодов клавиш 000..037 в ESC-коды
; TCK: таблица перекодировки управяющиx клавиш в режимe VT-52
161102: DB ...
; Обработка прерывания по вектору 160012 - Сохранение регистров и переход к пульту
.PULT::
161142: MOV (SP)+, @#177736 ; убрать вектор состояния.
161146: MOV (SP)+, @#177740 ; из стека.
161152: MOV SP, @#177734 ; установить системный стек.
161156: MOV #177734, SP ;
161162: MOV R5, -(SP) ; -> 177732
161164: MOV R4, -(SP) ; -> 177730
161166: MOV R3, -(SP) ; -> 177726
161170: MOV R2, -(SP) ; -> 177724
161172: MOV R1, -(SP) ; -> 177722
161174: MOV R0, -(SP) ; -> 177720 - начало блока регистров
161176: MOV @#000004, -(SP) ; Адрес прерывания
161202: MOV @#000006, -(SP) ; PSW прерывания
161206: MOV @#177766, -(SP) ; Сохраняем Режим дисплея
161212: CLR @#177766 ; Очищаем Режим дисплея - режим немига.
161216: MOV #000340, @#000006 ; есть ли локальная сеть ?
161224: MOV #161444, @#000004 ;
161232: MOV #000060, @#170010 ; в сети - режим останов.
161240: BR 161444 ; ..CSI - Переход к пультовому терминалу
;
; ==== Программа пультового терминала
;
; NEXT: Просмотр ячеек памяти - переход к следующему слову
161242: INC R2 ; открыть следующую.
161244: INC R2
; Команда '/' - просмотр ячеек памяти
; OPEN: ; открыть ячейку.
161246: CMP R2, @#177744 ; Сравниваем с нижней границей
161252: BLO 161270 ; меньше => переходим
161254: CMP R2, #177600
161260: BHIS 161546 ; => выводим признак ошибки и в пульт
161262: CMP R2, #170000
161266: BLO 161546 ; => выводим признак ошибки и в пульт
161270: MOV #162716, R5 ; Строка
161274: CALL @# ; PRINT
161300: MOV R2, R3 ; Печатаем адрес
161302: CALL @#162236 ; DUMP Вывод R3 как 8-ричного числа
161306: MOV (R2), R3 ; Печатаем значение
161310: CALL @#162236 ; DUMP Вывод R3 как 8-ричного числа
161314: CALL @#162310
161320: TST R1
161322: BEQ 161326
161324: MOV R5, (R2) ; Заносим новое значение
161326: CMPB #000012, R0 ; Нажали ПС?
161332: BEQ 161242 ; Да, переходим к следующему слову памяти
161334: CMPB #000015, R0 ; Нажали ВВОД?
161340: BEQ 161444 ; Да, возвращамся в пульт
161342: CMPB #000136, R0 ; Нажали '^' ?
161346: BNE 161546 ; Нет - выводим признак ошибки и в пульт
161350: DEC R2 ; Переходим к предыдущему слову памяти
161352: DEC R2
161354: BR 161246
;
; Команда 'G' - продолжение выполнения программы
GO: ; старт/продолжение программы.
161356: MOV (SP)+, @#177766 ; Восстанавливаем Режим дисплея
161362: TST R1 ; Параметр задан?
161364: BEQ 161400 ; нет => восстановление регистров и возврат
161366: CLR @#177740
161372: MOV R5, @#177736 ; Адрес запуска
161376: RESET
; Восстановление всех регистров, возврат из прерывания
EXIT:
161400: MOV (SP)+, @#000006
161404: MOV (SP)+, @#000004
161410: MOV (SP)+, R0
161412: MOV (SP)+, R1
161414: MOV (SP)+, R2
161416: MOV (SP)+, R3
161420: MOV (SP)+, R4
161422: MOV (SP)+, R5
161424: MOV (SP), SP
161426: MOV @#177740, -(SP) ; PSW
161432: MOV @#177736, -(SP) ; PC
161436: RTI
;
; Вывод символа и переход к пульту
CLEAR: ; очистить экран.
161440: CALL @#163722 ; TT.OUT Вывод символа
; Вывод приглашения пульта и ожидание команды
; ..CSI: ; прием и интерпретация команд.
161444: MOV #162704, R5 ; Строка "Пульт>"
PRIERR:
161450: MOV #177712, SP
161454: MOV #000340, @#000006 ; PSW для прерывания
161462: MOV #161546, @#000004 ; Адрес прерывания по вектору 4
161470: CALL @#162274 ; PRINT Вывод строки, адрес в R5
161474: CALL @#162310 ; Получаем команду с клавиатуры
161500: MOV R5, R2
161502: CMPB #000057, R0 ; Символ '/' - просмотр ячеек памяти
161506: BEQ 161246
161510: CMPB #000123, R0 ; Символ 'S' - вывод регистров ЦП
161514: BEQ 161554
161516: CMPB #000107, R0 ; Символ 'G' - выполнение программы
161522: BEQ 161356
161524: CMPB #000104, R0 ; Символ 'D' - загрузка с диска MD
161530: BEQ 161676
161532: CMPB #000116, R0 ; Символ 'N' - загрузка с сети
161536: BEQ 161726 ; => начальный пуск
161540: CMPB #000014, R0 ; Нажат УПР + L - очистка экрана
161544: BEQ 161440
; Вывод знака вопроса (ошибка выполнения команды) и возврат в пультовый режим
ERROR: ; ошибочная команда.
; также используется как адрес прерывания по вектору 4
161546: MOV #162703, R5 ; Строка " ?"
161552: BR 161450
;
; Команда 'S' - вывод на экран регистров процессора
; LOOK: ; просмотр регистров.
161554: MOV #000011, R2 ; 9 регистров
161560: MOV #161606, R5 ; Строка с названиями регистров
161564: CALL @#162274 ; Вывод строки
161570: MOV #177720, R4
161574: MOV (R4)+, R3
161576: CALL @#162236 ; Вывод R3 как 8-ричного числа
161602: SOB R2, 161574
161604: BR 161444 ; Возврат в пульт
161606: DB ... ; Строка с названиями регистров ЦП
;NOTE: Команда 'X' - загрузка с устройства DX - удалена
;
; Команда 'D' - загрузка с диска MD
BOOT: ; загрузка с дисков MD
161676: CMP R5, #7 ; Номер устройства больше 7?
161702: BHI 161546 ; да => ERROR
161704: CALL @#162726 ; MDBOOT - Загрузка данных с дисковода
161710: MOV #000200, @#177766 ; Режим дисплея = VT52
161716: CLR PC ; Запуск полученного блока
;
161720: MOV #160000, @#177744 ; Нижняя граница памяти доступной для команд пульта
;
; ==== Программа холодного старта - COLD START & BOOTSTRAP FROM LOCNET
;
; Холодный старт при включении питания
DOUBLE::
LOCNET:
161726: MOV #001000, SP ; Устанавливаем стек
161732: CLR R0
161734: MOV #056364, -(R0) ; -> (177776)
161740: MOV #164042, -(R0) ; Адрес стандартной п/п вывода символа -> (177774)
161744: CLR @#177574 ; Отключаем экран из основной памяти
161750: MOV #000007, R1
161754: CLR -(R0) ; <|
161756: SOB R1, 161754 ; / Очищаем 7 слов 177756-177773
161760: MOV #162516, -(R0) ; -> (177754)
161764: MOV #162002, @#000004 ; Адрес прерывания 4
161772: CLR @#170024 ; Сброс длительности
161776: MOV #162426, (R0) ; Адрес SOUND -> (177754)
162002: MOV #165036, -(R0) ; Адрес мелодии BELL -> (177752)
162006: MOV (R0), -(R0) ; тот же адрес -> (177750)
162010: MOV #003100, -(R0) ; #003100 -> (177746)
162014: RESET ; сброс всех устройств
162016: MOV #000021, R0 ; символ "очистка экрана"
162022: CALL @#163722 ; TT.OUT Вывод символа
162026: MOV #161142, @#000004 ; Адрес прерывания 4 - сохранить регистры и выход в пульт
162034: MOV #000340, @#000006 ; PSW для прерывания
; Попытка загрузки из сети
162042: MOV #170010, R4 ; Адрес регистра состояния локальной сети
162046: CALL @#163504 ; SYSLIN - Вывод в служебную строку
162052: BR 162056
162056: MOV #000014, (R4) ; Настройка состояния сетевого адаптера
162062: MOV #162671, R5
162066: CALL @#162274
162072: MOV #162226, @#000004
162100: BIT #100040, (R4)
162104: BMI 162226
162106: BEQ 162100
162110: TST (R4)
162112: MOVB #000003, @#170006 ; Запрещение прерываний
162120: MOV #000016, (R4)
162124: CALL @#162206 ; Ожидаем слово из сети
162130: MOV 000002(R4), R2
162134: MOV #177712, SP
162140: MOV #177572, R0
162144: CLR (R0)
162146: CALL @#162206 ; Ожидаем слово из сети
162152: MOV 000002(R4), 177776(R0)
162160: INC (R0)
162162: SOB R2, 162146
162164: MOV #000020, (R4)
162170: CLR -(SP)
162172: CLR -(SP)
162174: BIS #000200, @#177766 ; Режим дисплея
162202: JMP @#161074
; Подпрограмма - ожидание слова из сети
162206: CLR R1 ; счётчик ожидания
162210: BIT #100040, (R4)
162214: BMI 162226 ; ошибка сети, выходим
162216: BEQ 162224
162220: TST (R4)
162222: RETURN
162224: SOB R1, 162210 ; продолжаем цикл ожидания
ERRLN:
162226: MOV #002060, (R4) ; ошибка в сети, ОСТАНОВ.
162232: JMP @#161546
;
; ==== Программы вывода на экран чисел и строк
;
; Подпрограмма DUMP Вывод слова как 8-ричного числа; R3 = число
DUMP::
162236: MOV #000006, R1 ; Шесть разрядов
DUMP1::
162242: CLR R0
162244: ROL R3
162246: ROL R0
162250: ADD #000060, R0 ; '0'
162254: CALL @#163722 ; TT.OUT Вывод символа
162260: CLR R0
162262: ROL R3
162264: ROL R0
162266: ROL R3
162270: ROL R0
162272: SOB R1, 162244
; Подпрограмма PRINT - Вывод строки на экран; R5 = адрес строки
PRINT::
162274: MOVB (R5)+, R0 ; Очередной символ
162276: BNE 162302 ; Не ноль? => продолжаем
162300: RETURN ; Конец строки, выходим
162302: CALL @#163722 ; TT.OUT Вывод символа
162306: BR 162274 ; Продолжаем вывод строки
;
; Ввод команды; команда это символ либо 8-ричное число (параметр) и символ
GET: ; ввод строки.
162310: CLR R1 ; R0 - последний введенный код.
162312: CLR R5 ; R1 - число введенных цифр.
162314: TSTB @#177560 ; R5 - введенное значение, OCT
162320: BPL 162314
162322: MOVB @#177562, R3 ; Считываем символ
162326: CMPB R3, #000177 ; забой ?
162332: BNE 162362
162334: DEC R1
162336: BMI 162310
162340: ASH R5, #177775
162344: BIC #160000, R5
162350: MOV #000134, R0
162354: CALL @#163722 ; TT.OUT Вывод символа
162360: BR 162314
162362: MOV R3, R0
162364: CMPB R0, #000040
162370: BLO 162300
162372: CALL @#163722 ; TT.OUT Вывод символа
162376: BIC #177407, R3
162402: CMP #000060, R3 ; символ '0' ?
162406: BNE 162300
162410: BIC #177770, R0
162414: ASH R5, #000003
162420: BIS R0, R5
162422: INC R1
162424: BR 162314
;
; Подпрограмма SOUND
SOUND:: ; музыка.
162426: MOV R4, -(SP) ; Сохраняем R4
162430: BICB #000200, @#177761
162436: CLR @#170024 ; Сброс длительности
162442: MOV 000002(SP), R4 ; Откуда вызвали SOUND
162446: MOV 000002(R4), R4 ; Получаем адрес мелодии
162452: BNE 162460
162454: MOV @#177750, R4
162460: TSTB (R4)
162462: BEQ 162514
162464: MOV R4, @#177750 ; Запоминаем адрес начала мелодии
162470: MOV #001516, @#170020 ; Пишем в регистр состояния таймера
162476: MOVB (R4)+, @#170030 ; Октава и громкость
162502: CALL @#162520 ; Обработка продолжения мелодии
162506: BISB #000200, @#177761 ; Возвращаем флаг блокировки SOUND: bit7=1
162514: MOV (SP)+, R4 ; Восстанавливаем R4
162516: RETURN
; Обработка продолжения мелодии
162520: MOV R3, -(SP) ; Сохраняем R3
162522: MOVB (R4)+, R3
162524: BIC #177760, R3 ; Оставляем нижние 4 бита - 00..17
162530: ASL R3 ; и умножаем на 2
162532: MOV 162564(R3), @#170022 ; Выбираем по R3 слово и пишем в регистр частоты
162540: MOVB (R4)+, @#170024 ; Задаём длительность звука
162544: CLRB @#177760 ; Очищаем счётчик длительности ноты
162550: MOV R4, @#177752 ; Запоминаем адрес продолжения мелодии
162554: TST @#170026 ; Включение звука
162560: MOV (SP)+, R3 ; Восстанавливаем R3
162562: RETURN
; Значения задержки первого таймера для нот
NOTY:
162564: DW 000000, 002253, 002150, 002050, 001755, 001664, 001577, 001515
162604: DW 001435, 001361, 001306, 001237, 001171, 000000, 000000, 000000
; Строковые буферы
HELLO:: .BYTE 4,6,5
AUTOR: .RUS <mrti>
.BYTE 11,11,11
NAME: .RUS <kw>
.BYTE 5
.RUS < nemiga>
VERS: .BYTE 5
.ASCII / 4.07/
.BYTE 6,11
H.END:: .BYTE 40,0
RMP:: .RUS <rmp >
.BYTE 0
RMU:: .RUS <rmu >
.BYTE 0
LOCBO: .BYTE 14
.RUS <VDITE...>
.BYTE 0
ERR: .ASCII /?/
PROMPT: .BYTE 6,15,12
.RUS <pULXT>
.ASCIZ />/
MODI: .BYTE 12,15,,':,40,,40,0
;
; ==== Подпрограммы работы с дисководом MD - см. BOOT.MAC ============================
;
; Чтение с дисковода для загрузки; R5 = номер устройства
MDBOOT::
162726: CALL @#163466 ; MODE3
162732: MOV #000001, R4
162736: MOV R5, -(SP) ; логический No устройства.
162740: ASR R5
162742: BHIS 162750
162750: MOV R5, @#004002 ; -> B$PDN Физический номер устройства.
162754: MOV #000400, -(SP) ; один блок по адресу 0 с 1-го сектора
162760: CLR -(SP)
162762: MOV R4, -(SP)
162764: MOV #000006, R1
162770: MOV #000070, R0
162774: CALL @#163256
163000: SOB R1, 162770
163002: MOV #000030, R0
163006: CALL @#163256
163012: CLR @#177106
163016: BIT R4, @#177106
163022: BNE 163016
163024: BIT #000010, (R5)
163030: BNE 163002
163032: CLR @#177106
163036: BIT R4, (R5)
163040: BEQ 163046
163042: SOB R2, 163032
163044: HALT
; Мы на 0-й дорожке, читаем первый сектор
ERR1::
163046: MOVB R4, R0 ; чтение описателя
163050: MOV #004004, R3 ; B$Area
163054: CALL @#163316
163060: CLR @#004000 ; B$Trck
163064: MOV @#004000, R0 ; B$Trck
163070: MOVB 004016(R0), R0 ; дорожка в буфер.
163074: MOV #004140, R3
163100: CALL @#163316
163104: CLR R1
163106: MOV #004016, R5
163112: MOV #000120, R4
163116: MOVB (R5)+, R2
163120: MOV R1, R0
163122: ADD R2, R1
163124: CMP R1, (SP)
163126: BHI 163134
163130: SOB R4, 163116
163132: HALT
ERR2::
163134: MOV (SP), R3 ; абсолютный No сектора.
163136: SUB R0, R3 ; относительный No сектора на дорожке.
163140: SUB #000120, R4 ; (-No) нужной дорожки.
163144: ADD @#004000, R4
163150: BEQ 163204
163152: MOV #000030, R0
163156: SUB R4, @#004000
163162: TST R4
163164: BPL 163174
163166: MOV #000070, R0
163172: NEG R4
163174: CALL @#163256
163200: SOB R4, 163174
163202: BR 163064
;
163204: INC R3
163206: MOV #003750, R5
163212: ADD #000202, R5
163216: SOB R3, 163212
163220: MOV #000100, R4
163224: MOV (SP)+, R3
163226: MOV (SP)+, R2
163230: MOV (R5)+, (R2)+
163232: DEC (SP)
163234: BEQ 163250
163236: SOB R4, 163230
163240: INC R3
163242: MOV R2, -(SP)
163244: MOV R3, -(SP)
163246: BR 163104
163250: TST (SP)+
163252: MOV (SP)+, R0
163254: RETURN
;
; Подготовка и запуск операции; R0 = операция
.SCOM:
163256: MOV #177106, R5
163262: MOV #000006, R2
163266: CLR (R5)
163270: BIT #000001, (R5)
163274: BNE 163270
163276: SOB R2, 163266
163300: BIS @#004002, R0
163304: MOV R0, -(R5)
163306: TST -(R5)
163310: MOV #000001, -(R5)
163314: RETURN
;
; Чтение секторов; R0 = кол-во секторов, R3 = адрес буфера куда читать
.RDTR:
163316: MOV R3, R1
163320: MOV R0, -(SP)
163322: MOV #000012, R4
163326: ADD #000202, R4
163332: SOB R0, 163326
163334: MOV #000010, R0
163340: CALL @#163256
163344: MOV #177102, R2
163350: TSTB (R5)
163352: BPL 163350
163354: MOVB (R2), (R1)+
163356: SOB R4, 163350
163360: MOV (R5), R0
163362: CLR (R5) ; Окончание операции чтения
163364: BIT #000141, R0 ; RELOAD или OP-FAILED или LOST-DATA ?
163370: BEQ 163374 ; Нет => переходим
163374: ADD #000012, R3
163400: MOV #000100, R0
163404: CLR R2 ; Начинаем считать контрольную сумму
163406: MOVB @#004007, R4 ; Берём байт для ксорирования
163412: MOV @#004012, R5 ; Берём слово для ксорирования
163416: COM R5 ; инвертируем слово для ксорирования
163420: CLC
163422: XOR R4, (R3)
163424: XOR R5, (R3)
163426: ROL R4
163430: ROR R5
163432: ROL R0
163434: MOVB (R3)+, R1
163436: ADD R1, R2 ; Добавляем к сумме
163440: MOVB (R3)+, R1
163442: ADD R1, R2 ; Добавляем к сумме
163444: ASR R0
163446: SOB R0, 163422
163450: CMP R2, (R3)+
163452: BEQ 163456
163454: HALT ; Выход в Пульт
163456: DEC (SP)
163460: BNE 163400
163462: TST (SP)+
163464: RETURN
; ==== Эмуляция дисплея - см. TTIO.MAC ===============================================
; MODE3 - Переключение моды HALT-монитора.
163466: MOVB #000003, @#170006 ; Запрещение прерываний
163474: CALL @(SP)+
163476: CLRB @#170006 ; Разрешение прерываний
163502: RETURN
;
; SYSLIN - Вывод служебной строки.
163504: CALL @#163466 ; MODE3
163510: MOV R0, -(SP)
163512: MOV R1, -(SP)
163514: MOV #177772, R0 ; POSITN
163520: MOV (R0), -(SP) ; сохранить позицию,
163522: MOV -(R0), -(SP) ; AR2,RGMOUT
163524: MOV 000012(SP), R1 ; параметр.
163530: CMP (R0)+, (R1)+ ; R0=@POSITN
163532: MOV (R1), R1 ; R1=@STRING
163534: MOVB (R1)+, (R0)+ ; POSITN+1
163536: CLRB (R0)+ ; POS+2
163540: ADD #176000, -(R0) ; POS
163544: CLR -(R0) ; AR2,RGMOUT=0
163546: BIS #000010, -(R0) ; RGMIOT - вывод сл.строки.
163552: CMP @#177772, #176060 ; CMP POSITN,#BEG.SL+LENGHT
163560: BGE 163574 ; выход за пределы.
163562: MOVB (R1)+, R0 ; Получаем следующий символ
163564: BEQ 163700 ; конец строки.
163566: CALL @#163726 ; SYSOUT Вывод символа на экран
163572: BR 163552
163574: MOV R1, -(SP)
163576: MOV #162702, R5
163602: MOV @#167776, R3
163606: CALL @#162236
163612: MOV (SP)+, R1
163614: MOV (R4), R3
163616: INC @#177772
163622: MOV #000004, R2
163626: BIC #102777, R3
163632: BEQ 163700
163634: ROL R3
163636: COM R3
163640: BIC #007777, R3
163644: BEQ 163650
163650: MOVB (R1)+, R0 ; Получаем следующий символ
163652: CALL @#163726 ; SYSOUT Вывод символа на экран
163656: SOB R2, 163650
163660: TST R3
163662: BEQ 163700
163700: MOV #177766, R0 ; Адрес Режим дисплея
163704: BIC #000010, (R0)+
163710: MOV (SP)+, (R0)+
163712: MOV (SP)+, (R0)+
163714: MOV (SP)+, R1
163716: MOV (SP)+, R0
163720: RETURN
;
; Программа вывода символов на экран
; TT.OUT Вывод символа на экран с переключением моды; мл.байт R0 = символ
163722: CALL @#163466 ; MODE3
; SYSOUT - Системный вывод - вывод символа R0 на экран
163726: MOV SP, @#177642
163732: MOV #177642, SP
163736: BIS #000001, @#177574 ; Включаем экран в основную память
163744: CALL @177774 ; Вызов процедуры вывода символа
163750: BIC #000001, @#177574 ; Отключаем экран от основной памяти
163756: MOV (SP), SP
163760: RETURN
; SETCRS - Прямая адресация курсора.
163762: MOV #177772, R4
163766: SUB #000040, R5
163772: BPL 163776
163774: CLR R5
163776: DECB @#177770
164002: BEQ 164026
164004: CMP R5, #000027 ; 23. = макс. номер строки.
164010: BHI 164360
164012: MUL R5, #001200 ; вычислить отн.адрес.
164016: BIC #177700, (R4)
164022: BIS R5, (R4)
164024: BR 164360
164026: CMP R5, #000077 ; макс. номер позиции.
164032: BHI 164360
164034: BIC #000077, (R4)
164040: BR 164022
; Стандартная п/п вывода символа, ставится по умолчанию в 177774 SYMGEN
; MODOUT - Вывод символов режиме переключения памяти.
164042: MOV R0, -(SP)
164044: MOV R1, -(SP)
164046: MOV R2, -(SP)
164050: MOV R3, -(SP)
164052: MOV R4, -(SP)
164054: MOV R5, -(SP)
164056: CALL @#165206 ; CURSOR: Убрать курсор если он виден
164062: MOV 000012(SP), R5
164066: BIC #177400, R5
164072: MOV #000100, R1
164076: MOV #177770, R2 ; Адрес SIZE
164102: TSTB (R2) ; авторегистр ?
164104: BPL 164136
164106: CLRB (R2)
164110: CMP R5, #000131 ; коды командных последова-
164114: BEQ 164354 ; тельностей VT-52
164116: CMP R5, #000113
164122: BHI 164360
164124: SUB R1, R5
164126: BMI 164360
164130: MOVB 165310(R5), R4
164134: BR 164340
164136: BNE 163762 ; АР2>0 --> прям.адр.курсора.
164140: MOVB @#177766, R4 ; Режим дисплея VT52 или Немига ?
164144: BPL 164176 ; Немига.
164146: CLR @#177762
164152: CLR @#177764
164156: ROLB R5
164160: CLC
164162: BPL 164174 ; не буква.
164164: BITB #000040, R4
164170: BEQ 164174 ; латинский регистр.
164172: SEC ; русская.
164174: RORB R5
164176: CMP R5, #000040
164202: BLO 164302 ; не отображаемый символ.
VISI:
164204: ROLB R5
164206: BPL 164212
164210: BIC R1, R5
164212: BHIS 164216
164214: BIS R1, R5
164216: ASR R5
164220: ADD #002000, R3 ; абсол. адрес позиции.
164224: ASL R3
164226: SUB #000040, R5
164232: MUL R5, #000012
164236: ADD #166064, R5 ; адрес матрицы в знакогенераторе.
164242: MOV #000012, R4 ; 10. кол-во линий.
164246: ASL R1
LOOP:
164250: MOVB (R5), R2 ; линия матрицы символа.
164252: SWAB R2
164254: CLRB R2
164256: BISB (R5)+, R2 ; в обоих байтах: 3/3 яркости.
164260: BIC @#177764, R2 ; код яркости.
164264: MOV @#177762, R0 ; инверсия.
164270: XOR R0, R2
164272: MOV R2, (R3)
164274: ADD R1, R3
164276: SOB R4, 164250
164300: BR 164470 ; STEP смещение курсора.
; Отработка управляющих кодов - символов с кодом меньше #040
164302: MOV #165324, R2 ; T.SYLN - таблица разрешенных кодов.
164306: BITB #000010, R4 ; R4 = RGMIOT
164312: BNE 164324 ; " SYSLIN "
164314: CMP (R2)+, (R2)+ ; "VT-52"
164316: TSTB R4
164320: BMI 164324
164322: CMP (R2)+, (R2)+ ; "NEMIGA"
164324: MOV (R2)+, R0 ; ст.слово.
164326: MOV (R2), R1 ; мл.слово.
164330: ASHC R0, R5 ; сдвинуть до нужного бита.
164332: BPL 164600 ; .OUTT функция разрешена.
164334: MOVB 165250(R5), R4
164340: BIC #177400, R4 ; переход на отработку функции.
164344: ASL R4
164346: MOV #177770, R2
164352: ADD R4, PC
; ..PC.. ;** ключ прямой адрес.курсора.
164354: MOVB #2, (R2)
164360: BR 164600 ; .OUTT
; CL.SL: ;** очистка служ. строки.
164362: CLR R5
164364: MOV #002000, R3
164370: CLR (R5)+
164372: SOB R3, 164370
164374: BR 164600
; VT52: ;** переход в режим VT-52
164376: BIC #000400, (R2)
164402: BIS #000200, -(R2)
164406: BR 164600
; ..AR2:: ;** авторегистр.
164410: BIT #000200, 177776(R2)
164416: BNE 164432
; CLRRS: ; ВКЛ/ВЫКЛ звука.
164420: MOV #040000, R5
164424: XOR R5, @#177760
164430: BR 164600
; NOCLR: DECB @R2 ; -1 - ключ авторегистра.
164432: DECB (R2)
164434: BR 164600
; RRGM: ;** сброс режимов вывода.
164436: CLR (R2)
164440: TST -(R2)
164442: CLR -(R2) ; M.BIC = 0
164444: CLR -(R2) ; M.XOR = 0
164446: BR 164600
; SRGM: ;** установка режима вывода.
164450: COMB 177760(R5)
164454: BR 164600
; IC: ;** ВКЛ/ВЫКЛ курсора.
164456: MOV #000200, R5
; ROLLON: ;** ВКЛ/ВЫКЛ ролика.
164462: SWAB R5
164464: XOR R5, (R2)
164466: BR 164600
; STEP: ;** шаг вправо.
164470: MOV #177772, R2 ; Текущая позиция курсора
164474: INC (R2) ; Следующая позиция
164476: MOV (R2), R3 ; R3=POSITN
164500: MOV R3, R4
164502: BIC #177700, R4 ; Позиция в пределах строки
164506: BNE 164600
; LF: ;** LINE FEED - перевод строки.
164516: ADD #001200, R3
164522: CMP R3, #034700 ; конец строки ?
164526: BLO 164606
164600: BR 165116
; ???
164602: BIC #000077, R3 ; на первую позицию.
164606: MOV R3, @#177772
164612: BR 165116
; HT: ;** горизонтальная табуляция.
164614: MOV R3, R4
164616: BIC #177700, R4
164622: CMP R4, #000077 ; табуляция невозможна.
164626: BHIS 165116
164630: ADD #000010, R3
164634: BIC #000007, R3
164640: BR 164606
; R.RUS ; ** русский регистр.
164642: BIS #000040, -(R2)
164646: BR 165116
; R.LAT ; ** латинский регистр.
164650: BIC #000040, -(R2)
164654: BR 165116
; NEMIGA ; ** переход в режим "Немига".
164656: BIC #177600, -(R2)
164662: BR 165116
164664: ADD #000200, R3
164670: SUB #000100, R3
164674: BMI 164664
164676: CMP R3, #034700
164702: BHIS 164670
164704: BR 164714
164706: SUB #001200, R3
164712: BMI 165116
164714: MOV R3, @#177772
164720: BR 165116
164722: ADD #001200, R3
164726: CMP R3, #034700
164732: BHIS 165116
164734: BR 164714
164736: INC R3
164740: MOV R3, R4
164742: BIC #177700, R4
164746: BEQ 165116
164750: BR 164714
164752: CLR R3
164754: BR 164714
164756: SUB #001200, R3
164762: BPL 164714
; Скроллинг экрана
164764: MOV #100000, R5 ; Адрес куда копировать
164770: MOV #075400, R3 ; Адрес откуда копировать
164774: MOV #034600, R2 ; Сколько слов копировать
165000: MOV -(R3), -(R5) ; копируем слово
165002: SOB R2, 165000 ; повторяем
; Очистка строки
165004: MOV #001200, R2 ; Сколько слов очищать
165010: CLR (R3)+ ; стираем слово
165012: SOB R2, 165010 ; повторяем
165014: BR 165116 ; => к завершению обработки символа
; COD7:: ;** звук.
165016: BITB #000100, @#177761 ; Проверяем байт блокировки SOUND
165024: BNE 165116 ; => к завершению обработки символа
165026: CALL @#160126 ; SOUND
165032: BR 165116 ; => к завершению обработки символа
165034: DW 165036 ; адрес мелодии
165036: DB 001, 205, 017, 000 ; .COD7 - мелодия
; DELL: ;** стирание строки от позиции курсора.
165042: CALL @#165140 ; Очистка строки от текущей позиции до конца строки
165046: BR 165116 ; => к завершению обработки символа
; DELS: ;** стирание кадра от позиции курсора.
165050: CALL @#165140 ; Очистка строки от текущей позиции до конца строки
165054: BIC #000077, R3
165060: MOV R3, R5
165062: ADD #002000, R5
165066: BMI 165116 ; => к завершению обработки символа
165070: BR 165106
; ES: ;** очистка экрана.
165072: CLR R5
165074: BR 165102 ; => EES
; FF: ;** FORM FEED - очистка кадра.
165076: MOV #002000, R5
165102: CLR @#177772
165106: ASL R5
165110: CLR (R5)+
165112: TST R5
165114: BPL 165110
; +???
; OUTT - Завершение обработки символа
165116: CALL @#165206 ; Восстановление курсора
165122: MOV (SP)+, R5
165124: MOV (SP)+, R4
165126: MOV (SP)+, R3