Subversion Repositories pentevo

Rev

Rev 1186 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1186 Rev 1204
Line 1... Line 1...
1
 
1
 
2
; LAST UPDATE: 11.11.2024 savelij
2
; LAST UPDATE: 21.03.2025 savelij
3
 
3
 
4
; ((out&0ffff)==37f7)&&((val&0ff)==1)
4
; ((out&0ffff)==37f7)&&((val&0ff)==1)
5
; ((out&0ffff)==77f7)&&((val&0ff)==1)
5
; ((out&0ffff)==77f7)&&((val&0ff)==1)
6
; ((out&0ffff)==0b7f7)&&((val&0ff)==1)
6
; ((out&0ffff)==0b7f7)&&((val&0ff)==1)
7
; ((out&0ffff)==0f7f7)&&((val&0ff)==1)
7
; ((out&0ffff)==0f7f7)&&((val&0ff)==1)
8
; ((M(5CF4)==2)&&(M(5CF5)==1B))
8
; ((M(5CF4)==2)&&(M(5CF5)==1B))
9
; (((M(5CF4)==2)&&(M(5CF5)==1B))&&(SP<4000))
9
; (((M(5CF4)==2)&&(M(5CF5)==1B))&&(SP<4000))
10
; ((OUT&0FFFF)==1F)|((OUT&0FFFF)==3F)|((OUT&0FFFF)==7F)
10
; ((OUT&0FFFF)==1F)|((OUT&0FFFF)==3F)|((OUT&0FFFF)==7F)
11
 
11
 
12
                include ../../macros.a80
12
                include macros.a80
13
                include ../../global_vars.a80
13
                include global_vars.a80
14
                include ../../define.a80
14
                include define.a80
15
                include ../../evodos_vars.a80
15
                include evodos_vars.a80
-
 
16
                include version.a80
16
 
17
 
17
STACK           EQU 0x0DFF
18
STACK           EQU 0x0DFF
18
 
19
 
19
OLD_IF          EQU STACK-WORD*2
20
OLD_IF          EQU STACK - WORD * 2
20
OLD_AF          EQU STACK-WORD
21
OLD_AF          EQU STACK - WORD
21
 
22
 
-
 
23
 BITMASK RDWR,          7                       ; 1-запись, 0-чтение
-
 
24
 
22
; команда выхода и переход на обработчик
25
; команда выхода и переход на обработчик
23
JP_EMU          MACRO ADDRESS
26
JP_EMU          MACRO ADDRESS
24
        DUPL ADDRESS-$,0
27
                DB ADDRESS-$ DUP 0
25
                OUT (EXIT_PORT),A
28
                OUT (EXIT_PORT),A
26
                JP ADR_ADDRESS
29
                JP ADR_ADDRESS
27
                ENDM
30
                ENDM
28
 
31
 
29
; генерация адресов для таблицы
32
; генерация адресов для таблицы
Line 41... Line 44...
41
 
44
 
42
.WORK           EQU $
45
.WORK           EQU $
43
                ENDM
46
                ENDM
44
 
47
 
45
                ORG 0
48
                ORG 0
-
 
49
                DB "Emu TR-DOS v",VERS_DOS,"Build: "
-
 
50
                TEXTTIME
-
 
51
                DB " "
-
 
52
                TEXTDATE
-
 
53
 
46
        DUPL 0x0038 - $,0
54
                DB 0x0038 - $ DUP 0
47
                EI
55
                EI
48
                RET
56
                RET
49
 
57
 
50
        DUPL 0x006F - $,0
58
                DB 0x006F - $ DUP 0
51
                JP (HL)
59
                JP (HL)
52
 
60
 
53
        JP_EMU 0x02BE                           ; OUT      (0xFF), A
61
        JP_EMU 0x02BE                           ; OUT      (0xFF), A
54
 
62
 
55
        DUPL 0x0801 - $,0
63
                DB 0x0801 - $ DUP 0
56
;таблица адресов перехвата и вызыватора обработчиков
64
;таблица адресов перехвата и вызыватора обработчиков
57
TABLE_VIRT
65
TABLE_VIRT
58
        LABEL_GEN 0x02BE                        ; OUT      (0xFF), A
66
        LABEL_GEN 0x02BE                        ; OUT      (0xFF), A
59
        LABEL_GEN 0x1E3A                        ; OUT      (0x3F), A
67
        LABEL_GEN 0x1E3A                        ; OUT      (0x3F), A
60
        LABEL_GEN 0x1FDD                        ; IN    A, (0x1F)
68
        LABEL_GEN 0x1FDD                        ; IN    A, (0x1F)
Line 187... Line 195...
187
                JP OUT_FF
195
                JP OUT_FF
188
 
196
 
189
        EMU_JUMP 0x2B25                         ; IN A,(0x5F)
197
        EMU_JUMP 0x2B25                         ; IN A,(0x5F)
190
                JP IN_5F
198
                JP IN_5F
191
 
199
 
192
        DUPL 0x09FF - $,0
200
                DB 0x09FF - $ DUP 0
193
                DW 0xFFFF
201
                DW 0xFFFF
194
 
202
 
195
        EMU_JUMP 0x2C07                         ;IN A,(0x5F)
203
        EMU_JUMP 0x2C07                         ;IN A,(0x5F)
196
                JP IN_5F
204
                JP IN_5F
197
 
205
 
Line 381... Line 389...
381
                POP HL
389
                POP HL
382
                LD (OLD_AF),HL
390
                LD (OLD_AF),HL
383
                RET
391
                RET
384
 
392
 
385
; стек и обработчики
393
; стек и обработчики
386
        DUPL STACK - $,0
394
                DB STACK - $ DUP 0
387
                DW INT_BREAK
395
                DW INT_BREAK
388
 
396
 
389
        DUPL STACK + 0x41 - $,0
-
 
390
INT_BREAK       PUSH AF
397
INT_BREAK       PUSH AF
391
                PUSH HL
398
                PUSH HL
392
                PUSH DE
399
                PUSH DE
393
                LD A,(FLAG_RW_BREAK)
400
                LD A,(FLAG_RW_BREAK)
394
                AND A
401
                AND A
395
                JR NZ,IB1
402
                JR NZ,.L1
396
                LD HL,(OLD_IF)
403
                LD HL,(OLD_IF)
397
                LD L,0xFF
404
                LD L,0xFF
398
                LD E,(HL)
405
                LD E,(HL)
399
                INC HL
406
                INC HL
400
                LD D,(HL)
407
                LD D,(HL)
Line 408... Line 415...
408
                POP HL
415
                POP HL
409
                POP AF
416
                POP AF
410
                EI
417
                EI
411
                RET
418
                RET
412
 
419
 
413
IB1             PUSH BC
420
.L1             PUSH BC
414
                LD (INT_SP),SP
421
                LD (INT_SP),SP
415
                CALL READ_TMP_CPU12
422
                CALL READ_TMP_CPU12
416
                CALL WRITE_CPU12
423
                CALL WRITE_CPU12
417
                LD A,(OLD_PORT_BF)
424
                LD A,(OLD_PORT_BF)
418
                OUT (PEVO_CONF),A
425
                OUT (PEVO_CONF),A
Line 479... Line 486...
479
                LD SP,0                         ; восстановление SP
486
                LD SP,0                         ; восстановление SP
480
OLD_SP          EQU $-2
487
OLD_SP          EQU $-2
481
                JP 0
488
                JP 0
482
ADR_EXIT        EQU $-2        
489
ADR_EXIT        EQU $-2        
483
 
490
 
484
        DUPL STACK + 0x101 - $,0
-
 
485
; вход в обработчик
491
; вход в обработчик
486
WORKER          LD (NUM_ADR),A
492
WORKER          LD (NUM_ADR),A
487
                LD (OLD_SP),SP
493
                LD (OLD_SP),SP
488
                LD SP,STACK-WORD
494
                LD SP,STACK - WORD
489
                PUSH AF
495
                PUSH AF
490
                EX (SP),HL
496
                EX (SP),HL
491
                LD A,L
497
                LD A,L
492
                LD (OLD_AF),A
498
                LD (OLD_AF),A
493
                POP HL
499
                POP HL
494
                LD A,I
500
                LD A,I
495
                JP PE,WORKER1
501
                JP PE,.L1
496
                LD A,I
502
                LD A,I
497
WORKER1         PUSH AF                         ; IF
503
.L1             PUSH AF                         ; IF
498
                IN A,(PEVO_CONF)
504
                IN A,(PEVO_CONF)
499
                LD (OLD_PORT_BF),A              ; порт BF
505
                LD (OLD_PORT_BF),A              ; порт BF
500
                OR 1
506
                OR 1
501
                OUT (PEVO_CONF),A
507
                OUT (PEVO_CONF),A
502
                LD A,HIGH (STACK)
508
                LD A,HIGH (STACK)
Line 524... Line 530...
524
                JP (HL)
530
                JP (HL)
525
 
531
 
526
; чтение/запись примонтированного диска
532
; чтение/запись примонтированного диска
527
MOUNT_RW        DI
533
MOUNT_RW        DI
528
                LD A,(RDWR_MODE)
534
                LD A,(RDWR_MODE)
529
                AND 0x80
535
                AND M_RDWR
530
                LD L,A
536
                LD L,A
531
                LD A,(WR_FF)
537
                LD A,(WR_FF)
532
                AND 3
538
                AND 3
533
                OR L
539
                OR L
534
                BIT 7,A
540
                BIT B_RDWR,A
535
                PUSH AF
541
                PUSH AF                         ; флаг чтения/записи на стек
536
                LD HL,0x2A77
542
                LD HL,0x2A77
537
                PUSH HL
543
                PUSH HL                         ; адрес возврата на стек
538
                LD HL,MNT_RW
544
                LD HL,MNT_RW + CPU1
539
                PUSH HL
545
                PUSH HL                         ; адрес вызова RST 8 для чтения/записи на стек
540
                JR Z,.L1
546
                JR Z,.L1
541
; копируем сектор который будем записывать на смонтированный образ
547
; запись, копируем в буфер сектор который будем записывать на смонтированный образ
542
                LD HL,(OLD_HL)
548
                LD HL,(OLD_HL)
543
                LD DE,MNT_SECTOR
549
                LD DE,MNT_SECTOR
544
                CALL COPY_BLOCK
550
                CALL COPY_BLOCK
545
                LD (OLD_HL),HL
551
                LD (OLD_HL),HL
546
; переключаем паги для работы с маунтом
552
; переключаем паги для работы с маунтом
Line 551... Line 557...
551
                LD B,HIGH (WIN_P1)
557
                LD B,HIGH (WIN_P1)
552
                LD A,RAM_EVODOS
558
                LD A,RAM_EVODOS
553
                OUT (C),A
559
                OUT (C),A
554
                POP AF
560
                POP AF
555
; переставляем стек
561
; переставляем стек
556
                LD HL,0x4000
562
                LD HL,CPU1
557
                ADD HL,SP
563
                ADD HL,SP
558
                LD SP,HL
564
                LD SP,HL
559
                JP 0x2A53
565
                JP 0x2A53
560
 
566
 
561
        PHASE $ + 0x4000
567
; чтение/запись сектора в образе
562
 
-
 
563
MNT_RW          LD L,A
568
MNT_RW          LD L,A
564
                LD A,(PORT_3F + 0x4000)         ; взяли номер трека
569
                LD A,(PORT_3F + CPU1)           ; взяли номер трека
565
                ADD A,A                         ; сторон 2
570
                ADD A,A                         ; сторон 2
566
                LD D,A
571
                LD D,A
567
                LD A,(WR_FF + 0x4000)
572
                LD A,(WR_FF + CPU1)
568
                AND 0x10                        ; проверка какая сторона диска
573
                AND 0x10                        ; проверка какая сторона диска
569
                JR NZ,WRRDSECM1
574
                JR NZ,.L1
570
                INC D                           ; для стороны 1
575
                INC D                           ; для стороны 1
571
WRRDSECM1       LD A,(PORT_5F + 0x4000)         ; взяли номер сектора
576
.L1             LD A,(PORT_5F + CPU1)           ; взяли номер сектора
572
                LD E,A                          ; D-трек, E-сектор
577
                LD E,A                          ; D-трек, E-сектор
573
                LD A,L
578
                LD A,L
574
                LD HL,MNT_SECTOR + 0x4000
579
                LD HL,MNT_SECTOR + CPU1
575
        RST8 _MOUNTER,_RDWR_MOUNT
580
        RST8 _MOUNTER,_RDWR_MOUNT
576
                JP 0x3D2F
581
                JP 0x3D2F
577
 
582
 
578
        DEPHASE
-
 
579
 
-
 
-
 
583
; возврат после чтения/записи в образе
580
RET_MNT_RW      LD HL,-0x4000
584
RET_MNT_RW      LD HL,-CPU1
581
                ADD HL,SP
585
                ADD HL,SP
582
                LD SP,HL
586
                LD SP,HL
583
                CALL WRITE_CPU12
587
                CALL WRITE_CPU12
584
                LD HL,(OLD_IF)
-
 
585
                PUSH HL
-
 
586
                POP AF
588
                POP AF
-
 
589
                RET NZ                          ; для записи выходим
-
 
590
; для чтения переносим сектор в указанный адрес
-
 
591
                LD HL,MNT_SECTOR                ; буфер откуда переносить
587
                JP PO,.DI_MODE                  ; прерывания разрешены?
592
                LD DE,(OLD_HL)                  ; адрес куда переносить
-
 
593
                LD A,D
-
 
594
                CP 0x40                         ; чтение в адреса 0x0000...0x3FFF?
-
 
595
                JR NC,.L5
588
                CP 0x3F
596
                CP 0x3F
-
 
597
                JR NZ,.L3                       ; если не 0x3Fxx, пропускаем
589
                JR Z,.DI_MODE
598
                LD A,E
-
 
599
                AND A
-
 
600
                JR Z,.L3                        ; для адрес 0x3F00 просто пропуск
-
 
601
; для смещения в адресе 0x3Fxx
590
                EI
602
                NEG
-
 
603
                LD C,A
-
 
604
                LD B,0
-
 
605
                ADD HL,BC                       ; сколько пропустить от начала буфера
-
 
606
                PUSH DE
-
 
607
                LD C,E                          ; сколько копировать
591
.DI_MODE        POP AF
608
                LD DE,CPU1
-
 
609
                LDIR
592
                RET NZ
610
                POP DE
-
 
611
                JR .L3
-
 
612
 
-
 
613
; проверка для адресов чтения 0xFFxx
-
 
614
.L5             INC A
-
 
615
                JR NZ,.L1
-
 
616
; проверка на адрес 0xFF00
593
                LD HL,MNT_SECTOR
617
                LD A,E
-
 
618
                AND A
-
 
619
                JR Z,.L1
-
 
620
; для загрузки в адрес выше 0xFF00 переносим только до адреса 0, остальное в игнор
-
 
621
.L4             PUSH DE
-
 
622
                NEG
-
 
623
                LD C,A
-
 
624
                LD B,0
-
 
625
                LDIR
-
 
626
                POP DE
-
 
627
.L3             INC D
594
                LD DE,(OLD_HL)
628
                LD (OLD_HL),DE
-
 
629
                RET
-
 
630
 
595
                CALL COPY_BLOCK
631
.L1             CALL COPY_BLOCK
596
                LD (OLD_HL),DE
632
                LD (OLD_HL),DE
597
                RET
633
                RET
598
 
634
 
599
; инфа для создания 9 сектора нового диска
635
; инфа для создания 9 сектора нового диска
600
DSKINFO         DB 0                            ; + 0xE1 - номер первого свободного сектора
636
DSKINFO         DB 0                            ; + 0xE1 - номер первого свободного сектора
Line 602... Line 638...
602
                DB 0x16                         ; + 0xE3 - тип дискеты
638
                DB 0x16                         ; + 0xE3 - тип дискеты
603
                DB 0                            ; + 0xE4 - количество файлов на дискете
639
                DB 0                            ; + 0xE4 - количество файлов на дискете
604
SECFREE         DW 2544                         ; + 0xE5 - количество свободных секторов
640
SECFREE         DW 2544                         ; + 0xE5 - количество свободных секторов
605
                DB 0x10                         ; + 0xE7 - идентификационный код TRDOS
641
                DB 0x10                         ; + 0xE7 - идентификационный код TRDOS
606
                DW 0                            ; + 0xE8 - 2 байта 0
642
                DW 0                            ; + 0xE8 - 2 байта 0
607
        DUPL 9," "                              ; + 0xEA - 9 байт 0x20
643
                DB 9 DUP " "                    ; + 0xEA - 9 байт 0x20
608
                DB 0                            ; + 0xF3 - 1 байт 0
644
                DB 0                            ; + 0xF3 - 1 байт 0
609
                DB 0                            ; + 0xF4 - количество удаленных файлов
645
                DB 0                            ; + 0xF4 - количество удаленных файлов
610
                DB "RAMDISKO"                   ; + 0xF5 - имя дискеты
646
                DB "RAMDISKO"                   ; + 0xF5 - имя дискеты
611
DSK_END
647
DSK_END
612
 
648
 
613
        DUPL LOW (-$),0
649
                DB LOW (-$) DUP 0
614
MNT_SECTOR
650
MNT_SECTOR
615
 
651
 
616
; адреса перехвата
652
; адреса перехвата
617
        JP_EMU 0x1E3A                           ; OUT      (0x3F), A
653
        JP_EMU 0x1E3A                           ; OUT      (0x3F), A
618
        JP_EMU 0x1FDD                           ; IN    A, (0x1F)
654
        JP_EMU 0x1FDD                           ; IN    A, (0x1F)
Line 629... Line 665...
629
        JP_EMU 0x2748                           ; OUT      (0x7F), A
665
        JP_EMU 0x2748                           ; OUT      (0x7F), A
630
        JP_EMU 0x2A53                           ; OUT      (C),    A
666
        JP_EMU 0x2A53                           ; OUT      (C),    A
631
 
667
 
632
; первая команда в обработчике MAGIC для возврата в пагу FE
668
; первая команда в обработчике MAGIC для возврата в пагу FE
633
;       JP_EMU 0x2A71                           ; OUT      (0xFF), A
669
;       JP_EMU 0x2A71                           ; OUT      (0xFF), A
634
        DUPL 0x2A71 - $,0
670
                DB 0x2A71 - $ DUP 0
635
                OUT (EXIT_PORT),A
671
                OUT (EXIT_PORT),A
636
                JP INT_RET                      ; возвращение из обработчика INT
672
                JP INT_RET                      ; возвращение из обработчика INT
637
 
673
 
638
;       JP_EMU 0x2A77                           ; IN    A, (0x1F)
674
;       JP_EMU 0x2A77                           ; IN    A, (0x1F)
639
        DUPL 0x2A77 - $,0
675
                DB 0x2A77 - $ DUP 0
640
                OUT (EXIT_PORT),A
676
                OUT (EXIT_PORT),A
641
                JP RET_MNT_RW                   ; возвращение после вызова RST 8
677
                JP RET_MNT_RW                   ; возвращение после вызова RST 8
642
 
678
 
643
        JP_EMU 0x2AD9                           ; OUT      (0xFF), A
679
        JP_EMU 0x2AD9                           ; OUT      (0xFF), A
644
        JP_EMU 0x2B25                           ; IN    A, (0x5F)
680
        JP_EMU 0x2B25                           ; IN    A, (0x5F)
Line 648... Line 684...
648
        JP_EMU 0x2D80                           ; OUT      (0x1F), A
684
        JP_EMU 0x2D80                           ; OUT      (0x1F), A
649
        JP_EMU 0x2D87                           ; IN    A, (0x1F)
685
        JP_EMU 0x2D87                           ; IN    A, (0x1F)
650
        JP_EMU 0x2F0C                           ; OUT      (0xFF), A
686
        JP_EMU 0x2F0C                           ; OUT      (0xFF), A
651
        JP_EMU 0x2F1D                           ; OUT      (0x5F), A
687
        JP_EMU 0x2F1D                           ; OUT      (0x5F), A
652
 
688
 
653
        DUPL 0x2F24 - $,0                       ; для адреса 0x2F4D
689
                DB 0x2F24 - $ DUP 0             ; для адреса 0x2F4D
654
                JP ADR_0x2F4D
690
                JP ADR_0x2F4D
655
 
691
 
656
        JP_EMU 0x2F28                           ; OUT      (0x1F), A
692
        JP_EMU 0x2F28                           ; OUT      (0x1F), A
657
        JP_EMU 0x2F2F                           ; IN    A, (0x1F)
693
        JP_EMU 0x2F2F                           ; IN    A, (0x1F)
658
        JP_EMU 0x2F3C                           ; OUT      (0xFF), A
694
        JP_EMU 0x2F3C                           ; OUT      (0xFF), A
659
 
695
 
660
        DUPL 0x2F4D - $,0                       ; OUT      (0xFF), A
696
                DB 0x2F4D - $ DUP 0             ; OUT      (0xFF), A
661
                OUT (EXIT_PORT),A
697
                OUT (EXIT_PORT),A
662
                DB 0x18                         ; JR 0x2F24
698
                DB 0x18                         ; JR 0x2F24
663
 
699
 
664
        JP_EMU 0x2F50                           ; OUT      (0x7F), A
700
        JP_EMU 0x2F50                           ; OUT      (0x7F), A
665
 
701
 
666
        DUPL 0x2F57 - $,0                       ; OUT      (0x1F), A
702
                DB 0x2F57 - $ DUP 0             ; OUT      (0x1F), A
667
                OUT (EXIT_PORT),A
703
                OUT (EXIT_PORT),A
668
                JR JUMP_0x2F57
704
                JR JUMP_0x2F57
669
 
705
 
670
                JR JUMP_0x2F59                  ; IN    A, (0xFF)
706
                JR JUMP_0x2F59                  ; IN    A, (0xFF)
671
 
707
 
Line 675... Line 711...
675
JUMP_0x2F57     JP ADR_0x2F57
711
JUMP_0x2F57     JP ADR_0x2F57
676
 
712
 
677
        JP_EMU 0x2FB1                           ; OUT      (0xFF), A
713
        JP_EMU 0x2FB1                           ; OUT      (0xFF), A
678
        JP_EMU 0x2FC3                           ; OUT      (0x1F), A
714
        JP_EMU 0x2FC3                           ; OUT      (0x1F), A
679
 
715
 
680
        DUPL 0x32A2 - $,0
716
                DB 0x32A2 - $ DUP 0
681
; обработчики чтения/записи портов
717
; обработчики чтения/записи портов
682
; запись "A" в порт 0x1F
718
; запись "A" в порт 0x1F
683
OUT_1F          LD A,(OLD_AF + 1)
719
OUT_1F          LD A,(OLD_AF + 1)
684
                LD (WR_1F),A
720
                LD (WR_1F),A
685
 
-
 
686
                AND %11110000
721
                AND %11110000
687
                RRCA
722
                RRCA
688
                RRCA
723
                RRCA
689
                RRCA
724
                RRCA
690
                ADD A,LOW (.TABL_CMD)
725
                ADD A,LOW (.TABL_CMD)
Line 829... Line 864...
829
 
864
 
830
; запись в порты ATM/PENTEVO
865
; запись в порты ATM/PENTEVO
831
WRCA3           LD A,B
866
WRCA3           LD A,B
832
                LD HL,BB_CPU1
867
                LD HL,BB_CPU1
833
                CP HIGH (WIN_A1)
868
                CP HIGH (WIN_A1)
834
                JR Z,WRCA2
869
                JR Z,.L1
835
                CP HIGH (WIN_P2)
870
                CP HIGH (WIN_P2)
836
                JR Z,WRCA2
871
                JR Z,.L1
837
                LD HL,BB_CPU2
872
                LD HL,BB_CPU2
838
                CP HIGH (WIN_A2)
873
                CP HIGH (WIN_A2)
839
                JR Z,WRCA2
874
                JR Z,.L1
840
                CP HIGH (WIN_P2)
875
                CP HIGH (WIN_P2)
841
                JR NZ,WR_C_D
876
                JR NZ,WR_C_D
842
WRCA2           LD E,B
877
.L1             LD E,B
843
                PUSH DE
878
                PUSH DE
844
                PUSH HL
879
                PUSH HL
845
                CALL READ_CPU12
880
                CALL READ_CPU12
846
                POP HL
881
                POP HL
847
                POP DE
882
                POP DE
Line 1056... Line 1091...
1056
                LD (ADR_EXIT),HL
1091
                LD (ADR_EXIT),HL
1057
                JP OUT_1F.INFF_BIT6
1092
                JP OUT_1F.INFF_BIT6
1058
 
1093
 
1059
; чтение сектора
1094
; чтение сектора
1060
READ_SECTOR_1   XOR A
1095
READ_SECTOR_1   XOR A
1061
                JR WRITE_SECTOR_1
1096
                JR WRITE_SECTOR.L1
1062
 
1097
 
1063
; запись сектора
1098
; запись сектора
1064
WRITE_SECTOR    LD A,0xFF
1099
WRITE_SECTOR    LD A,0xFF
1065
WRITE_SECTOR_1  LD (RDWR_MODE),A
1100
.L1             LD (RDWR_MODE),A
1066
                LD A,1
1101
                LD A,1
1067
                LD (FLAG_RW_BREAK),A
1102
                LD (FLAG_RW_BREAK),A
1068
                LD HL,(OLD_IF)
1103
                LD HL,(OLD_IF)
1069
                PUSH HL
1104
                PUSH HL
1070
                POP AF
1105
                POP AF
Line 1158... Line 1193...
1158
                INC C
1193
                INC C
1159
; HL = смещение в странице до начала сектора
1194
; HL = смещение в странице до начала сектора
1160
.L5             LD A,C                          ; смещение до номера страницы, где указанный сектор начинается
1195
.L5             LD A,C                          ; смещение до номера страницы, где указанный сектор начинается
1161
                ADD A,RAM_DATARAMD              ; прибавили номер начала рамдиск и +1. в 0 странице рамдиска описатели секторов
1196
                ADD A,RAM_DATARAMD              ; прибавили номер начала рамдиск и +1. в 0 странице рамдиска описатели секторов
1162
                LD (RDWR_PAGE),A                ; сохранили номер вычисленной страницы
1197
                LD (RDWR_PAGE),A                ; сохранили номер вычисленной страницы
1163
                LD DE,(OLD_HL)
1198
                LD DE,(OLD_HL)                  ; адрес куда/откуда копировать
1164
                LD BC,(BB_CPU1)
1199
                LD BC,(BB_CPU1)
1165
                LD A,C
1200
                LD A,C
1166
                LD C,LOW (WIN_A0)
1201
                LD C,LOW (WIN_A0)
1167
                OUT (C),A                       ; вернули стандартную 5 страницу
1202
                OUT (C),A                       ; вернули стандартную 5 страницу
1168
.S9             LD A,D                          ; проверка границы откуда/куда копировать
1203
.S9             LD A,D                          ; проверка границы откуда/куда копировать
Line 1324... Line 1359...
1324
                LD (HL),L
1359
                LD (HL),L
1325
                LDIR                            ; очистили страницу
1360
                LDIR                            ; очистили страницу
1326
                POP DE                          ; адрес начала страницы
1361
                POP DE                          ; адрес начала страницы
1327
                LD HL,0                         ; смещение в блоках и страницах
1362
                LD HL,0                         ; смещение в блоках и страницах
1328
                LD A,0xA0
1363
                LD A,0xA0
1329
ELT2            PUSH AF
1364
.L1             PUSH AF
1330
                LD BC,0x1000                    ; счетчик номеров секторов и их номера
1365
                LD BC,0x1000                    ; счетчик номеров секторов и их номера
1331
                LD A,L
1366
                LD A,L
1332
                RRCA
1367
                RRCA
1333
                RRCA
1368
                RRCA
1334
                LD (DE),A                       ; смещение в блоках дорожки в странице
1369
                LD (DE),A                       ; смещение в блоках дорожки в странице
1335
                INC D
1370
                INC D
1336
                LD A,H
1371
                LD A,H
1337
                LD (DE),A                       ; смещение в страницах до дорожки
1372
                LD (DE),A                       ; смещение в страницах до дорожки
1338
                INC D
1373
                INC D
1339
ELT1            INC C
1374
.L2             INC C
1340
                LD A,C
1375
                LD A,C
1341
                LD (DE),A                       ; номер сектора
1376
                LD (DE),A                       ; номер сектора
1342
                INC D
1377
                INC D
1343
                LD A,2
1378
                LD A,2
1344
                LD (DE),A                       ; размер сектора
1379
                LD (DE),A                       ; размер сектора
1345
                INC D
1380
                INC D
1346
                DJNZ ELT1                       ; вносим в таблицу все номера секторов с размерами
1381
                DJNZ .L2                        ; вносим в таблицу все номера секторов с размерами
1347
                LD D,HIGH (CPU1)                ; вернули указатель в начало
1382
                LD D,HIGH (CPU1)                ; вернули указатель в начало
1348
                INC E                           ; для следующей дорожки
1383
                INC E                           ; для следующей дорожки
1349
                LD BC,0x40
1384
                LD BC,0x40
1350
                ADD HL,BC                       ; переход к следующей дорожке
1385
                ADD HL,BC                       ; переход к следующей дорожке
1351
                POP AF
1386
                POP AF
1352
                DEC A
1387
                DEC A
1353
                JR NZ,ELT2                      ; повторяем для всех дорожек
1388
                JR NZ,.L1                       ; повторяем для всех дорожек
1354
                LD HL,CPU1 + 0x3FFF
1389
                LD HL,CPU1 + 0x3FFF
1355
                LD (HL),"R"                     ; вносим маркер рамдиска
1390
                LD (HL),"R"                     ; вносим маркер рамдиска
1356
                DEC H
1391
                DEC H
1357
                LD (HL),"D"
1392
                LD (HL),"D"
1358
                LD BC,WIN_P1
1393
                LD BC,WIN_P1
Line 1462... Line 1497...
1462
                LD HL,CPU1 + 0x3FFF
1497
                LD HL,CPU1 + 0x3FFF
1463
                LD A,(HL)
1498
                LD A,(HL)
1464
                DEC H
1499
                DEC H
1465
                CP "R"
1500
                CP "R"
1466
                SCF
1501
                SCF
1467
                JR NZ,DISK_NONE1
1502
                JR NZ,.L1
1468
                LD A,(HL)
1503
                LD A,(HL)
1469
                CP "D"
1504
                CP "D"
1470
                SCF
1505
                SCF
1471
                JR NZ,DISK_NONE1
1506
                JR NZ,.L1
1472
                XOR A
1507
                XOR A
1473
DISK_NONE1      PUSH AF
1508
.L1             PUSH AF
1474
                CALL WRITE_CPU12
1509
                CALL WRITE_CPU12
1475
                POP AF
1510
                POP AF
1476
                POP BC
1511
                POP BC
1477
                POP HL
1512
                POP HL
1478
                RET
1513
                RET
Line 1489... Line 1524...
1489
                AND A
1524
                AND A
1490
                RET
1525
                RET
1491
 
1526
 
1492
        JP_EMU 0x3C30                           ; IN    A, (0x1F)
1527
        JP_EMU 0x3C30                           ; IN    A, (0x1F)
1493
 
1528
 
1494
        DUPL 0x3D2F - $,0
1529
                DB 0x3D2F - $ DUP 0
1495
                NOP
1530
                NOP
1496
                RET
1531
                RET
1497
 
1532
 
1498
        JP_EMU 0x3D4D                           ; OUT      (0xFF), A
1533
        JP_EMU 0x3D4D                           ; OUT      (0xFF), A
1499
        JP_EMU 0x3D9A                           ; OUT      (0x1F), A
1534
        JP_EMU 0x3D9A                           ; OUT      (0x1F), A
Line 1503... Line 1538...
1503
        JP_EMU 0x3DD5                           ; OUT      (0xFF), A
1538
        JP_EMU 0x3DD5                           ; OUT      (0xFF), A
1504
        JP_EMU 0x3E30                           ; IN    A, (0x1F)
1539
        JP_EMU 0x3E30                           ; IN    A, (0x1F)
1505
        JP_EMU 0x3E3A                           ; IN    A, (0x1F)
1540
        JP_EMU 0x3E3A                           ; IN    A, (0x1F)
1506
        JP_EMU 0x3E44                           ; OUT      (0x7F), A
1541
        JP_EMU 0x3E44                           ; OUT      (0x7F), A
1507
 
1542
 
1508
        DUPL 0x3E49 - $,0
1543
                DB 0x3E49 - $ DUP 0
1509
                JP ADR_0x3E4C                   ; для адреса 0x3E4C
1544
                JP ADR_0x3E4C                   ; для адреса 0x3E4C
1510
 
1545
 
1511
;               JP_EMU 0x3E4C                   ; OUT      (0x7F), A
1546
;               JP_EMU 0x3E4C                   ; OUT      (0x7F), A
1512
        DUPL 0x3E4C - $,0
1547
                DB 0x3E4C - $ DUP 0
1513
                OUT (EXIT_PORT),A
1548
                OUT (EXIT_PORT),A
1514
                JR 0x3E49
1549
                JR 0x3E49
1515
 
1550
 
1516
        JP_EMU 0x3E50                           ; IN    A, (0x3F)
1551
        JP_EMU 0x3E50                           ; IN    A, (0x3F)
1517
        JP_EMU 0x3E78                           ; IN    A, (0x3F)
1552
        JP_EMU 0x3E78                           ; IN    A, (0x3F)
Line 1522... Line 1557...
1522
        JP_EMU 0x3EBC                           ; IN    A, (0x3F)
1557
        JP_EMU 0x3EBC                           ; IN    A, (0x3F)
1523
        JP_EMU 0x3EC9                           ; OUT      (0x1F), A
1558
        JP_EMU 0x3EC9                           ; OUT      (0x1F), A
1524
        JP_EMU 0x3ECE                           ; IN    A, (0xFF)
1559
        JP_EMU 0x3ECE                           ; IN    A, (0xFF)
1525
        JP_EMU 0x3EDF                           ; OUT      (0x1F), A
1560
        JP_EMU 0x3EDF                           ; OUT      (0x1F), A
1526
 
1561
 
1527
        DUPL 0x3EF3 - $,0                       ; IN    H, (C)
1562
                DB 0x3EF3 - $ DUP 0             ; IN    H, (C)
1528
                OUT (EXIT_PORT),A
1563
                OUT (EXIT_PORT),A
1529
                JR JUMP_0x3EF3
1564
                JR JUMP_0x3EF3
1530
 
1565
 
1531
                JR JUMP_0x3EF5                  ; IN    A, (0xFF)
1566
                JR JUMP_0x3EF5                  ; IN    A, (0xFF)
1532
 
1567
 
Line 1540... Line 1575...
1540
 
1575
 
1541
                JP_EMU 0x3F1B                   ; OUT      (0x5F), A
1576
                JP_EMU 0x3F1B                   ; OUT      (0x5F), A
1542
                JP_EMU 0x3F25                   ; OUT      (0x1F), A
1577
                JP_EMU 0x3F25                   ; OUT      (0x1F), A
1543
                JP_EMU 0x3F33                   ; IN    A, (0x1F)
1578
                JP_EMU 0x3F33                   ; IN    A, (0x1F)
1544
 
1579
 
1545
        DUPL 0x3F40 - $,0                       ; для адреса 0x3EF3
1580
                DB 0x3F40 - $ DUP 0             ; для адреса 0x3EF3
1546
                JP ADR_0x3EF3
1581
                JP ADR_0x3EF3
1547
 
1582
 
1548
        JP_EMU 0x3F4D                           ; OUT      (0x1F), A
1583
        JP_EMU 0x3F4D                           ; OUT      (0x1F), A
1549
        JP_EMU 0x3F55                           ; IN    A, (0x3F)
1584
        JP_EMU 0x3F55                           ; IN    A, (0x3F)
1550
        JP_EMU 0x3F5A                           ; IN    A, (0x5F)
1585
        JP_EMU 0x3F5A                           ; IN    A, (0x5F)
1551
        JP_EMU 0x3F69                           ; IN    A, (0x3F)
1586
        JP_EMU 0x3F69                           ; IN    A, (0x3F)
1552
        JP_EMU 0x3F72                           ; IN    A, (0x5F)
1587
        JP_EMU 0x3F72                           ; IN    A, (0x5F)
1553
 
1588
 
1554
        JP_EMU 0x3FBC                           ; IN    A, (0xFF)       ;запись сектора
1589
        JP_EMU 0x3FBC                           ; IN    A, (0xFF)       ;запись сектора
1555
 
1590
 
1556
        DUPL 0x3FC7 - $,0
1591
                DB 0x3FC7 - $ DUP 0
1557
JUMP_0x3FF0     JP ADR_0x3FF0
1592
JUMP_0x3FF0     JP ADR_0x3FF0
1558
 
1593
 
1559
        JP_EMU 0x3FCA                           ; IN    A, (0xFF)       ;запись сектора
1594
        JP_EMU 0x3FCA                           ; IN    A, (0xFF)       ;запись сектора
1560
        JP_EMU 0x3FD1                           ; OUTI                  ;запись сектора
1595
        JP_EMU 0x3FD1                           ; OUTI                  ;запись сектора
1561
 
1596
 
Line 1565... Line 1600...
1565
JUMP_0x3FF3     JP ADR_0x3FF3
1600
JUMP_0x3FF3     JP ADR_0x3FF3
1566
 
1601
 
1567
        JP_EMU 0x3FE5                           ; IN    A, (0xFF)       ;чтение сектора
1602
        JP_EMU 0x3FE5                           ; IN    A, (0xFF)       ;чтение сектора
1568
 
1603
 
1569
;       JP_EMU 0x3FEC                           ; INI                   ;чтение сектора
1604
;       JP_EMU 0x3FEC                           ; INI                   ;чтение сектора
1570
        DUPL 0x3FEC - $,0
1605
                DB 0x3FEC - $ DUP 0
1571
                OUT (EXIT_PORT),A
1606
                OUT (EXIT_PORT),A
1572
                JR JUMP_0x3FEC
1607
                JR JUMP_0x3FEC
1573
 
1608
 
1574
;       DUPL 0x3FF0 - $,0                       ; OUT      (C), A
1609
;               DB 0x3FF0 - $ DUP 0             ; OUT      (C), A
1575
                OUT (EXIT_PORT),A
1610
                OUT (EXIT_PORT),A
1576
                DB 0x18                         ; JR 0x3FC7
1611
                DB 0x18                         ; JR 0x3FC7
1577
 
1612
 
1578
;       DUPL 0x3FF5 - $,0                       ; IN    A, (C)
1613
;               DB 0x3FF5 - $ DUP 0             ; IN    A, (C)
1579
                OUT (EXIT_PORT),A
1614
                OUT (EXIT_PORT),A
1580
                JP JUMP_0x3FF3
1615
                JP JUMP_0x3FF3
1581
 
1616
 
1582
        DUPL 0x3FF8 - $,0
1617
                DB 0x3FF8 - $ DUP 0
1583
                DB "EVOSFE"
1618
                DB "EVOSFE"
1584
                DW DATA_VERS
1619
                DW DATA_VERS