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 |