-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBDOS0.MAC
1574 lines (1527 loc) · 33.5 KB
/
BDOS0.MAC
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
; находится в банке 1
.PHASE SYSADDR
IO_BYTE EQU 3
SIGKILL equ 9 ; kill driver
SIGHUP equ 1 ; refresh driver
BDOS1: LD (RG_DE),DE
LD A,E
LD (RG_E),A
LD HL,0
LD (EXITRG_A),HL
LD A,B
LD (CALSEGM),A ; ВЫЗЫВАЮЩИЙ СЕГМЕНТ
LD B,4
MKADDR: RRA
RR H
DJNZ MKADDR
LD (CALADDR),HL ; ВЫЗЫВАЮЩИЙ АДРЕС
AND 0FH
LD (RG_B),A ; ВЫЗЫВАЮЩИЙ БАНК
LD (RG_SP),SP
LD SP,(STK_PTR)
ld a, DEFAULT_DISK
LD (ACT_DISK),A; текущий диск
xor a
;(исп временно при операции с явно указанным диском в FCB )
LD (DISK_FN),A ; сбр. флаг - дисковая операция
; ( исп. при EXIT_ST )
LD (RETOK),A ; сбр. флаг - возврат FCB
LD (FCB_DRIVE),A
LD (PATHFLG),A
LD (ISCREAT),A
LD A,C
LD (FUNCNUM),A
CP 29H
LD HL,EXIT_ST ; точка возврата старых ф-ций
JR C,NOPUSH
LD HL,RETURN
NOPUSH: PUSH HL
CP 100
JP NC,EMMFUNC
LD C,E
LD HL,BDOSF ; таблица векторов ф-ций BDOS
LD E,A
LD D,0
ADD HL,DE
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
LD HL,(RG_DE)
EX DE,HL
JP (HL)
;
; таблица векторов ф-ций BDOS
BDOSF: DW RESTART ; 0 - "горячий старт"
DW F1 ; 1 - ввод символа с консоли
DW OUTPUT ; 2 - вывод символа на консоль
DW F3 ; 3 - ввод символа с логического
; устройства RDR
DW @AUXOUT ; 4 - вывод символа на логическое
; устройство PUN
DW @OUT_PRNT; 5 - вывод символа на логическое
; устройство LST
DW F6 ; 6 - прямой ввод/вывод символа
; с консоли
DW F7 ; 7 - получить байт назначения
; устройств (БНУ)
DW F8 ; 8 - установить БНУ
DW F9 ; 9 - вывод строки символов
DW FA ; 10 - чтение консольного буфера
DW FB ; 11 - опрос статуса консоли
DW FC ; 12 - ПОЛУЧЕНИЕ НОМЕРА ВЕРСИИ CPM
; В HL: H=0 - СP/M , H=11 - MP/M
; L=20...2F НА CP/M 2.0 ... 2.15
DW FD ; 13 - СБРОС ДИСКОВОЙ СИСТЕМЫ
DW FE ; 14 - активизация диска
DW FF ; 15 - открытие файла
DW F10 ; 16 - закрытие файла
DW F11 ; 17 - ПОИСК ПЕРВОГО - ПОИСК ФАЙЛА
; В КАТАЛОГЕ ДИСКА
DW F12 ; 18 - ПОИСК СЛЕДУЮЩЕГО - ТО ЖЕ
; ЧТО И 17 НО С ТЕКУЩЕГО
DW F13 ; 19 - стирание файла
DW F14 ; 20 - последовательное чтение
DW F15 ; 21 - последовательная запись
DW F16 ; 22 - создать файл
DW F17 ; 23 - переименовать файл
DW F18 ; 24 - получить вектор зарегистри-
; рованных дисков
DW F19 ; 25 - получить номер акт. диска
DW F1A ; 26 - установить адрес DMA
DW F1B ; 27 - ПОЛУЧЕНИЕ АДРЕСА РАЗМЕЩЕНИЯ
; В HL
DW F1C ; 28 - записать ключ защиты диска
DW F1D ; 29 - пол. вектор R/O для дисков
DW F1E ; 30 - установить индикатор досту-
; па файла
DW F1F ; 31 - ПОЛУЧЕНИЕ АДРЕСА БЛОКА ПАРА-
; МЕТРОВ ДИСКА В HL
DW F20 ; 32- УСТАНОВКА/ПОЛУЧЕНИЕ КОДА
; ПОЛЬЗОВАТЕЛЯ
DW F21 ; 33 - прямое чтение
DW F22 ; 34 - прямая запись
DW F23 ; 35 - вычислить размер файла
DW F24 ; 36 - установить номер записи для
; прямого доступа
DW F25 ; - , (но какая-то функция есть)
DW F26 ; - RET
DW F27 ; - RET
DW F28 ; 40 - прямая запись на обнуленный
; блок
;
; НОВЫЕ ДИСКОВЫЕ ФУНКЦИИ
;
DW FN29 ; В МАССИВ С АДРЕСОМ В DE В ТЕКУЩЕМ
; БАНКЕ ВОЗВРАЩ.16 СИМВ.МЕТКА ДИСКА
DW FN2A ; ИЗ МАССИВА (ПО DE) НА ДИСК ЗАПИС.
; 16-И СИМВОЛЬНАЯ МЕТКА ДИСКА
DW FN2B ; В МАССИВ (ПО DE) ВОЗВРАЩ. 16 СИМВ.
; ИМЯ ТЕКУЩЕГО ЮЗЕРА
DW FN2C ; ТЕКУЩЕМУ ЮЗЕРУ УСТАНАВЛ. НОВОЕ ИМЯ
; ИЗ МАССИВА (ПО DE) - 16 СИМВ.
DW FN2D ; УСТАНОВКА ЮЗЕРА ПО ИМЕНИ ИЗ МАСИВА
; (ПО DE)
DW FN2E ; ПОЛУЧИТЬ ИЗ БУФЕРА ТИМПЛЕТА СТРОКУ
; В МАССИВ (ПО DE).
DW FN2F ; ДОБАВИТЬ СТРОКУ В БУФЕР ТИМПЛЕТА
; ИЗ МАССИВА (по DE).
DW FN30 ; ПОЛУЧИТЬ ИЗ БУФЕРА ПОДМЕН СТРОКУ
; В МАССИВ (ПО DE).
DW FN31 ; ДОБАВИТЬ СТРОКУ В БУФЕР ПОДМЕН
; ИЗ МАССИВА (по DE).
DW FN32 ; ПОЛУЧИТЬ СТРОКУ ИЗ BAT-БУФЕРА В
; МАССИВ (ПО DE).МАСИВ СОКРАЩАЕТСЯ
DW FN33 ; ДОБАВИТЬ СТРОКУ В BAT-БУФЕР ИЗ
; МАССИВА (ПО DE).
DW FN34 ; ПОЛУЧИТЬ ДАТУ СОЗДАНИЯ ФАЙЛА.
; ВХОД: DE=ADDR(FCB).
DW FN35 ; УСТАНОВИТЬ ДАТУ СОЗДАНИЯ ФАЙЛА.
; ВХОД: DE=ADDR(FCB).
DW FN36 ; ПОЛУЧИТЬ СТРОКУ РЕГСТРАЦИИ ДИСКОВ
; (16 БАЙТ) В МАССИВ (ПО DE)
DW FN37 ; УСТАНОВИТЬ/ПОЛУЧИТЬ PATH-USER
; ВХОД: РЕГ.Е=(0..0FН)/0FFН
DW FN38 ; ДОВЕСОК K FN34
DW FN39 ; ДОВЕСОК К FN35
DW FN3A ; ПОЛУЧИТЬ АДРЕС DMA
; >>>>>>
; вывод "BAD SECTOR"
R_BADS: LD HL,MSG_BADS
CALL FATAL
CALL INPUT
CP 3 ; введено ^C
JR Z,RESTART
DB 31H ; LD SP,...
ERRSTACK:DW 0
XOR A
RET
; вывод "SELECT"
R_SELD: LD HL,MSG_SELD
JR ALLERR
; вывод "DISK R/O"
R_DSKRO:LD HL,MSG_DSKRO
JR ALLERR
; вывод "FILE R/O"
R_FLRO: LD HL,MSG_FLRO
ALLERR: CALL FATAL
RESTART:LD HL,WARMSTART
JP TOBIOS2
MSG_ERR:DEFB 13,10,'BDOS ERROR ON '
DRV_ERR:DEFB ' : $'
MSG_BADS:DEFB 'BAD SECTOR$'
MSG_SELD:DEFB 'Select$'
MSG_FLRO:DEFB 'File '
MSG_DSKRO:DEFB 'R/O$'
;MSG_CRLF:DEFB 10,13,36
;
FATAL: PUSH HL
; LD DE,MSG_CRLF
; CALL PRINTT
LD A,(ACTDISK)
ADD A,'A'
LD (DRV_ERR),A
LD DE,MSG_ERR
CALL PRINTT
POP DE
PRINTT: LD A,(DE)
CP '$'
RET Z
PUSH DE
LD C,A
CALL @CONOUT
POP DE
INC DE
JR PRINTT
; <<<<<<<
;
; вывод "BAD SECTOR"
; ЭТО В BIOS
P_BADS: LD HL,BERR1
JR ISERROR
; вывод "SELECT"
P_SELD: LD HL,BERR2
JR ISERROR
; вывод "DISK R/O"
P_DSKRO:LD HL,BERR3
JR ISERROR
; вывод "FILE R/O"
P_FLRO: LD HL,BERR4
ISERROR:LD (ERRSTACK),SP
LD SP, MOVESP
CALL BLDB2
PUSH BC ; B=BANK
INC HL
CALL BLDB2
LD C,B
PUSH BC ; C=L.ADDR
INC HL
CALL BLDB2 ; B=H.ADDR
POP HL ; L=L.ADDR
LD H,B
POP AF
JP BJMP
;
BLDB2: LD A,TPAPAGE
JP BLDB
;
; ф-ция 1 (ввод с консоли с эхопечатью)
F1: CALL INPUT ; !!!
CP ' '
JP C,SETEXITRG_A
LD C,A
CALL XOUTPUT
JP SETEXITRG_A
;
;F6: LD A,C
; INC A
; JP Z,F6NEXT
; INC A
; JP Z,FB
; LD HL,CONOUT ; BIOS+0CH
; JP TOBIOS2
;
;F6NEXT: CALL @CONSTAT ; BIOS+6
; OR A
; CALL NZ,@CONIN ; BIOS+9
; JP SETEXITRG_A
;
F9: EX DE,HL
LD A,(RG_B)
CALL BLDB
LD A,B
INC HL
CP '$'
RET Z
LD C,A
PUSH HL
CALL OUTPUT
POP HL
JR F9+1
; ф-ция 0Ah ввод строки с консоли в буфер
; СОАВТОР: А.БАЛДИН
FA: CALL GETSTRING ; ЭТО В BIOS2.MAC
DEC HL ; HL=NEWBUFF
XOR A
LD (FL0),A
LD E,A ; E=СКОЛЬКО ВВЕДЕНО
LD B,A ; В=ПОЗИЦИЯ КУРСОРА
LD D,(HL) ; в D макс. длина строки
INC HL
PUSH HL ; HL=NEWBUFF+1
; в стеке указатель на реальную длину строки
LD A,(VALUE)
RLCA
JR NC,BIT7RES
LD A,(HL)
OR A
JR Z,BIT7RES
LD E,A
INC HL
PUSH DE
CALL SHOWLEFT
POP DE
LD B,E
LCYCL: CALL CLEFT
DJNZ LCYCL
DEC HL
BIT7RES:INC HL
; HL указывает на рабочую часть буфера строки
LOOP_INP:
PUSH HL
PUSH DE
PUSH BC
LD A,E
LD (FN10QN),A
CALL INPUT ; XINPUT
POP BC
POP DE
POP HL ; !!!
LD C,A ; сохр. данные в C
CP 8 ; кл
JP Z,CRLEFT
CP 13 ; вк
JR Z,CRCR
CP 10 ; пс
JR Z,CRCR
CP 7Fh ; del
JP Z,CRDEL
CP 4 ; кп
JP Z,CRNEXT
CP 27 ; esc
JP Z,CRESC
CP 5 ; кп
JP Z,CRUP
CP 24 ; кн
JP Z,CRDOWN
CP 3 ; ^C
CALL Z,CRCTRLC
LD A,(VALUE)
RLCA
JR NC,BIT7RSS
LD A,C
CP ' '
JR C,LOOP_INP
BIT7RSS:
LD A,D
OR A
JR Z,LOOP_INP ; игнор. ввода, буфер заполнен
DEC D ; иначе уменьшить счетчик
LD A,E
SUB B
INC A
; A = E - B + 1
PUSH BC
LD B,A
FA_L0: LD A,C
CALL CTRL_OUT
LD C,(HL)
LD (HL),A
INC HL
DEC B
JR NZ,FA_L0
POP BC
LD A,E
SUB B
JR Z,FA_L1
FA_L2: PUSH AF
CALL CLEFT
POP AF
DEC A
JR NZ,FA_L2
FA_L1: INC E
INC B
JR LOOP_INP
;
CRCTRLC:LD A,E
OR A
RET NZ
LD A,(VALUE)
RLCA
RET C
LD HL,VALUE
RES 3,(HL) ; СБРОСИТЬ ПРИЗНАК РАБОТЫ В CCP
JP RESTART
; Вывести остаток буфера (справа после курсора)
SHOWLEFT:
LD A,E
SUB B
LD C,A
RET Z
FA_L3: LD A,(HL)
CALL CTRL_OUT
INC HL
INC B
DEC C
JR NZ,FA_L3
RET
;
CRCR: CALL SHOWLEFT
LD C,13
LD (HL),C
CALL XOUTPUT
POP HL
LD (HL),E
LD A,E
OR A
JR Z,EXITFA ; ВЫХОД, ЕСЛИ ПУСТОЙ БУФЕР
LD A,(VALUE)
AND 8
JR Z,EXITFA ; ВЫХОД, ЕСЛИ ВЫЗОВ НЕ ИЗ CCP
CALL @SAVETIM ; ЗАПИСАТЬ СТРОКУ В БУФЕР ТИМПЛЕТА
EXITFA: LD A,(RG_B) ; КУДА
LD HL,(RG_DE)
EXX
EX AF,AF'
LD HL,NEWBUFF
LD BC,(FALEN)
BLDIRF1:LD A,WORKPAGE ; ОТКУДА
JP BLDIR ; !!!
;
; ESC - СТЕРЕТЬ ВСЮ СТРОКУ
CRESC: LD A,E
OR A
JP Z,LOOP_INP
CALL SHOWLEFT
FA_L8: CALL KILLSYM
JR NZ,FA_L8
JP LOOP_INP
; КУРСОР ВЛЕВО
CRLEFT: LD A,B
OR A
JP Z,LOOP_INP
DEC B
CALL CLEFT
JP LOOP_INP
;
CLEFT: LD C,8 ; кл
DEC HL
CALL XOUTPUT
LD A,(HL)
CP ' '
CALL C,XOUTPUT
RET
; КУРСОР ВПРАВО
CRNEXT: LD A,E
CP B
JP Z,LOOP_INP
LD C,24 ; кп
CALL XOUTPUT
LD A,(HL)
CP ' '
CALL C,XOUTPUT
INC HL
INC B
JP LOOP_INP
; DELETE
CRDEL: LD A,B
OR A
JP Z,LOOP_INP
CALL KILLSYM
JP LOOP_INP
; УДАЛИТЬ СИМВОЛ В СТРОКЕ
KILLSYM:LD C,8
DEC HL
CALL XOUTPUT
LD A,(HL)
CP ' '
CALL C,XOUTPUT
PUSH AF
LD A,E
SUB B
LD C,A
JR Z,FA_L9
FA_L10: INC HL
LD A,(HL)
DEC HL
LD (HL),A
INC HL
CALL CTRL_OUT
DEC C
JR NZ,FA_L10
FA_L9: POP AF
LD C,' '
CALL XOUTPUT
CALL C,XOUTPUT
LD C,8
CALL XOUTPUT
CALL C,XOUTPUT
LD A,E
SUB B
JR Z,FA_L11
FA_L19: PUSH AF
CALL CLEFT
POP AF
DEC A
JR NZ,FA_L19
FA_L11: DEC E
INC D
DEC B
RET
; КУРСОР ВВЕРХ - ПОЛУЧИТЬ СТРОКУ ИЗ БУФЕРА ТИМПЛЕТА
CRUP: LD A,(FL1)
OR A
JP Z,LOOP_INP ; ВЫХОД, БУФЕР ТИМПЛЕТА ПУСТОЙ
LD A,(VALUE)
AND 8
JP Z,LOOP_INP ; ПЕРЕХОД, ЕСЛИ ВЫЗОВ НЕ ИЗ CCP
JR FA_DL13
;
CRDOWN: LD A,(FL1)
OR A
JP Z,LOOP_INP ; ВЫХОД, БУФЕР ТИМПЛЕТА ПУСТОЙ
LD A,(VALUE)
AND 8
JP Z,LOOP_INP ; ПЕРЕХОД, ЕСЛИ ВЫЗОВ НЕ ИЗ CCP
LD A,(FL0)
CP 2
JR NC,FA_L14 ; IF FL0>1
LD A,(FL1) ; УСТ. В РЕГ. А НОМЕР СТРОКИ
JR FA_L13 ; ИЗ БУФЕРА ТИМПЛЕТА
FA_L14: DEC A
FA_L13: CP 2
JR NC,FA_CL14
LD A,(FL1) ; УСТ. В РЕГ. А НОМЕР СТРОКИ
JR FA_CL13 ; ИЗ БУФЕРА ТИМПЛЕТА
FA_CL14:DEC A
FA_CL13:LD (FL0),A ; ЗАНЕСТИ В FL0 НОМЕР СТРОКИ
FA_DL13: ; ТИМПЛЕТА
LD A,E
OR A
JR Z,FA_L15
CALL SHOWLEFT
FA_L16: CALL KILLSYM ; УБРАТЬ СТАРУЮ СТРОКУ
JR NZ,FA_L16
FA_L15: LD A,B
POP HL ; HL - УКАЗАТЕЛЬ НА STRING SIZE
CALL @GETTIM ; ПОЛУЧИТЬ СТРОКУ ИЗ БУФЕРА
DEC HL
LD A,(HL)
SUB E ; A=MAX-REAL
LD D,A ; УСТАНОВИТЬ РЕГ. D,E,HL
INC HL
PUSH HL
INC HL
CALL SHOWLEFT ; ВЫДАТЬ НОВУЮ СТРОКУ НА ЭКРАН
JP LOOP_INP
;
XOUTPUT:PUSH HL
PUSH DE
PUSH BC
PUSH AF
CALL OUTPUT
POP AF
POP BC
POP DE
POP HL
RET
; вывод символа из C, если меньше 20h, то вывод с '^'
CTRL_OUT:
PUSH BC
PUSH AF
CP ' '
JR NC,C_OUT0
PUSH AF
LD C,'^'
CALL XOUTPUT
POP AF
ADD A,40h
C_OUT0: LD C,A
CALL XOUTPUT
POP AF
POP BC
RET
;
OUTPUT: PUSH BC
LD HL,CONOUT ; BIOS+0Ch
CALL TOBIOS2
POP BC
LD A,(FL_PRINT)
OR A
RET Z
JP @OUT_PRNT ; BIOS+0Fh
;
INPUT: CALL @CONIN ; BIOS+9
CP 16 ; ^P
RET NZ
LD A,(FL_PRINT)
CPL
LD (FL_PRINT),A
JR INPUT
;
; Функция 3 - ввести байт с устр. ввода
F3: CALL @AUXIN
JP SETEXITRG_A
; Функция 7 - получить байт назначения устройств
F7: LD HL, IO_BYTE
CALL BLDB2
LD A,B
SETEXITRG_A:
LD (EXITRG_A),A
F6:
FB:
F26:
F27: RET
; Функция 8 - установить байт назначения устройств
F8: LD HL, IO_BYTE
LD B,E
BSTB2: LD A,TPAPAGE
JP BSTB
;
;FB: CALL @CONSTAT ; BIOS+6
; JP SETEXITRG_A
;
; установить ячейку, в которой хранится значение рг. A для
; тех ф-ций, которые возвращают выходной параметр в рг. A
;
SETEXRGA_1:
LD A,1
JR SETEXITRG_A
COPY: INC C ; ПОХОЖЕ НА LDIR
ACF50: DEC C
RET Z
LD A,(DE)
LD (HL),A
INC DE
INC HL
JP ACF50
;
ACF59: LD A,(ACTDISK)
LD C,A
CALL @SELDISK ; (HL)=DPH
LD A,H
OR L
RET Z
;
ld de,XLTPT ; bigfiles
ld bc,2
ldir
LD (SYSW1),HL ; УК-ЛЬ НА СЛУЖЕБ. СЛОВО 1
ld c,6
add hl,bc
ld de,DIRBPT
ld c,8
ldir
ld hl,(DPB_ADR)
ld de,DPBCOPY
ld c,0FH
ldir ; bigfiles
; LD E,(HL)
; INC HL
; LD D,(HL) ; (DE)=XLT
; INC HL
; LD (SYSW1),HL ; УК-ЛЬ НА СЛУЖЕБ. СЛОВО 1
; INC HL
; INC HL
; LD (SYSW2),HL ; --"--"--"--"--"--"--"- 2
; INC HL
; INC HL
; LD (SYSW3),HL ; --"--"--"--"--"--"--"- 3
; INC HL
; INC HL
; EX DE,HL ; DE=АДР. УК-ЛЯ НА DIRBUF
; LD (XLTPT),HL ; УК-ЛЬ НА XLT
; LD HL,DIRBPT
; LD C,8
; CALL COPY ; БЕРЕМ ПАРАМЕТРЫ ИЗ DPH
; LD HL,(DPB_ADR)
; EX DE,HL
; LD HL,DPBCOPY
; LD C,0FH
; CALL COPY ; КОПИЯ DPB ДИСКА
LD HL,(DSM)
LD A,H
LD HL,DSM255
LD (HL),0FFH
OR A
JR Z,ACF9D
LD (HL),0
; DSM255 = FF, если об'ем дисковода < 256 групп
; DSM255 = 00, если об'ем дисковода > 255 групп
ACF9D: xor a ; LD A,0FFH ; уст. Z=0 - ок!
dec a ; OR A
RET
;
HOME EQU @SETTR00 ; bigfiles
;HOME: CALL @SETTR00
; XOR A
; LD HL,(SYSW2)
; LD (HL),A
; INC HL
; LD (HL),A
; LD HL,(SYSW3)
; LD (HL),A
; INC HL
; LD (HL),A
; RET
;
RDSEC: CALL @READSEC
JR COMMSEC
;
WRSEC: CALL @WRITESEC
COMMSEC:OR A
CALL NZ,P_BADS
RET
;
; ОБСЛУГА РАСШИРЕННОЙ ПАМЯТИ - Ф. 100..114
;
EMMFUNC:PUSH AF ; A=НОМЕР ФУНКЦИИ
ld a,(CALSEGM)
ld e,a
call GETSEGM
ld (DRVCODE),a ; код вызывающей программы
POP AF
LD C,A
ld hl,FUNCTAB-200
ld b,0
cp 100
jr z,NEXT3
cp 105
jr nc,NEXT3
ld a,d
or a ; ф-ии 101..104 нельзя
jp z,BADRET ; вызывать с рег. D=0
NEXT3: add hl,bc
add hl,bc
ld e,(hl)
inc hl
ld d,(hl)
ld hl,(RG_DE)
ex de,hl
ld a,(RG_B)
jp (hl)
;
FUNCTAB:DW F100
DW F101
DW F102
DW F103
DW F104
DW F105
DW F106
DW F107
DW F108
DW F109
DW F110
DW F111
DW F112
DW F113
DW F114
DW F115
;
VMEM1: DB 1 ; memory allocation method: 0=upper_to_lower, 1=lower_to_upper
;
; Установка адреса REW из DE. Банк считается автоматически.
;
F100: ld (REWADDR),de
; ld a,(RG_B)
ld (REWBANK),a
ret
;
; Копирование сегментoв в буфер.
; Вход: D=количество сегментов, E=начальный сегмент. Выход:
; A = 0, если нормально, A = FF если сегмент отсутствует
;
F101: xor a
F101A: push de
push af
push af
call GETSEGM
cp 0fh
jp z,BADRET
ex af,af'
exx
ld bc,(REWADDR) ; куда
pop hl ; h=A
ld l,0
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,bc ; hl=(REWADDR)+A*1000h
ld a,(REWBANK)
ex af,af'
exx
call f112 ; B=0
ld a,l
ld l,b ; ,0 ; откуда
ld bc,1000h ; сколько
call BLDIR
pop af
pop de
inc e
inc a
cp d
jr c,F101A
xor a
ret
;
; Запись сегментов из буфера обмена.
; Вход: D=количество сегментов, E=начальный сегмент. Выход:
; A = 0, если нормально, A = FF если сегмент отсутствует
;
F102: xor a
F102A: push de
push af
push af
call GETSEGM
cp 0fh
jp z,BADRET
ex af,af'
exx
ld de,(RG_DE)
call f112 ; B=0
ld a,l
ld l,b ; ,0 ; куда
ex af,af'
exx
ld bc,(REWADDR) ; откуда
pop hl ; h=A
ld l,0
add hl,hl
add hl,hl
add hl,hl
add hl,hl ; hl=(REWADDR)+A*1000h
add hl,bc
ld a,(REWBANK)
ld bc,1000h ; сколько
call BLDIR
pop af
pop de
inc e
inc a
cp d
jr c,F102A
xor a
ret
;
; Резервирование N последовательных сегментов.
; Вход: D=количество сегментов
; E=начальный сегмент (0FFh если любой)
; Выход: A=начальный сегмент, если резервирование прошло
; нормально, A=FF, если области такого размера нет
;
F103: ld a,e ;D=1 E=3B
cp 0FFh
jr z,IFFF
push af
push de
ld b,d ; b=кол-во сегм.
F103A: push bc
call GETSEGM ; е=текущий сегм.
or a
jr nz,NOSPARC
pop bc
inc e
djnz F103A
pop bc ; b=кол-во сегм.
F103B: call SETSEGM ; c=текущий сегм.
inc c
djnz F103B
pop af
ret
NOSPARC:pop af
NOSP0: pop af
pop af
NOSP1: xor a
dec a ; a = ff
ret
IFFF: ld a, (VMEM1)
or a
jr nz, LtoU
dec e ; e=0feh..0
jr IFFF1
LtoU: inc e ; e=0..0feh
IFFF1: ld a, e
inc a
jr z,NOSP1 ; if a=e=0FFh
push de
call F103
pop de
cp e
ret z
jr IFFF
;
; Oсвободить N последовательных сегментов
; Вход: D=количество сегментов, Е=начальный сегмент
; Выход: A=начальный сегмент, если освобождение прошло
; нормально, A=FF, если была ошибка (освобождение
; системного или отсутствующего ОЗУ)
;
F104: ld a,e
push af
ld b,d
F104A: push bc
ld hl,WARMMAP
call GETSEG1
cp 0Eh
jr nc,NOSP0
ld c,e
xor a
call SETSEG1
ld e,c
inc e
pop bc
djnz F104A
pop af
ret
;
; 105(69h) - инсталлировать драйвер пользователя
; Вход: DE = адрес строки - описателя драйвера
; Выход: А=номер драйвера в таблице (1..13), если
; инсталляция прошла удачно; А=FF - иначе
; Формат строки - описателя драйвера (в ТРА):
; +0 - номер банка, где будет расп. драйвер (FF-ЛЮБОЙ)
; +1..+8 - имя драйвера
; +9..+10 - начальный адрес драйвера в ОЗУ ТРА СРМ(16 бит)
; +11..+12 - длина драйвера (16 бит)
; +13..+14 - адрес п/п захвата векторов (в ОЗУ доп. стр.)
; +15..+16 - адрес п/п извещения о предстоящем удалении
; +17..+18 - начальный адрес драйвера (в ОЗУ доп. страницы)
; или 0FFFFh если можно сажать на любой адрес
;
F105: ld A,WORKPAGE
ld hl,MBUF ; куда
exx
ex af,af'
ld a,(RG_B)
ld hl,(RG_DE) ; откуда
ld bc,40
call BLDIR ; строка-описатель
ld hl,DRVQN ;
ld a,(hl)
cp 13
jp nc,BADRET
call FINDDRV ; hl=запись о драйвере
inc a
jp nz,BADRET ; если уже присутствует
ld a,(EFLAG)
or a
jr nz,EEFLG
ld a,(DRVQN)
inc a
EEFLG: ld (DRVCODE),a
push hl
ex de,hl
inc de
ld hl,DRVNAME
ld bc,16 ; пересылаем имя драйвера
ldir
push de
ld hl,(DSTADDR)
ld a,h
ld c,h
inc a
jr nz,NOFFFF
ld h,a
ld l,a ; ld hl,0
NOFFFF: ld a,0fh
and h
ld h,a
ld de,(LENGTH)
add hl,de
ex de,hl
ld e,0
call F111
inc a ; А=полный размер в сегм.
pop de
ld (de),a
push af
ld a,(DRVBANK)
ld d,c
ld e,a
call F111 ; A=начальный сегмент
ld e,a ; с какого резервировать
pop af
ld d,a ; сколько резервировать
call RESERVE ; резервируем место
inc a ; возвр. нач сегмент или FF
jp z,BADRET