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 |