Subversion Repositories pentevo

Rev

Rev 977 | Rev 1041 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. ; LAST UPDATE: 22.10.2022 savelij
  3.  
  4. PAGE   
  5.         TITLE "rst8service.a80 ROM_RST83"
  6.  
  7.                 include ../../macros.a80
  8.                 include ../../define.a80
  9.                 include ../../global_vars.a80
  10.                 include ../../ports_ide.a80
  11.                 include ../../ports_ngs.a80
  12.                 include ../../sdcomand.a80
  13.  
  14.  INIT_VAR BUF_TEKVOL
  15.                 include ../../fat_vars.a80
  16.  
  17.                 include ../../bootsecfat.a80
  18.                 include ../../evodos_vars.a80
  19.                 include ../../tmpkeys.a80
  20.                 include ../../nums_devices.a80
  21.                 include ../../version.a80
  22.                 include ../../cmd_cdhdd.a80
  23.                 include ../../fat_dir.a80
  24.                 include fat/sl811_equ.a80
  25.                 include struct_mount.a80
  26.  
  27. USB_ENABLE      EQU 0
  28.  
  29. CPU5            EQU CPU1
  30. CPU6            EQU CPU2
  31. WIN_A5          EQU WIN_A1
  32. WIN_A6          EQU WIN_A2
  33. WIN_P5          EQU WIN_P1
  34. WIN_P6          EQU WIN_P2
  35.  
  36. _CMP_FONT       EQU 0
  37. TXTMODE_DEBUG   EQU 0
  38.  
  39. H_FILES         EQU 60
  40. V_FILES         EQU 25
  41.  
  42. MAGIC_COLOR     EQU BLUE << 3 + WHITE + BR_INK
  43.  
  44.         PHASE 0
  45.                 JP $                            ; 0000
  46.  
  47.                 DUPL 0x0008-$,0xFF
  48.                 JP $                            ; 0008
  49.  
  50.                 DUPL 0x0010-$,0xFF
  51.                 JP $                            ; 0010
  52.  
  53.                 DUPL ADR_SEL_ROM-$,0xFF
  54.                 OUT (C),A                       ; 0014
  55.                 NOP
  56.                 RET
  57.  
  58.                 DUPL 0x0018-$,0xFF
  59.                 JP $                            ; 0018
  60.  
  61.                 DUPL 0x001C-$,0xFF
  62.                 JP RST8_DOS
  63.  
  64.                 DUPL 0x0020-$,0xFF
  65.                 JP CALL2RAMPAGE                 ; 0020
  66.  
  67.                 DUPL 0x0024-$,0xFF
  68.                 JP RST8PAGE0                    ; 0024
  69.  
  70.                 DUPL 0x0028-$,0xFF
  71.                 JP $                            ; 0028
  72.  
  73.                 DUPL CONT_RST8-$,0xFF           ; 002C
  74.                 JP NEXT_RST8
  75.  
  76. ; переход в страницу 4 с возвратом
  77.                 DUPL 0x0030-$,0xFF
  78.                 JP CALL2PAGE                    ; 0030
  79.  
  80. ; продолжение обработки нажатия MAGIC
  81.                 DUPL CONTINUE_MAGIC-$,0xFF      ; 0034
  82.                 JP CONT_MAGIC
  83.  
  84.                 DUPL 0x0038-$,0xFF              ; 0038
  85. ;               PUSH HL                         ; 11
  86. ;               LD HL,(ADR_INT)                 ; 16
  87. ;               EX (SP),HL                      ; 19
  88. ;               RET                             ; 10=56
  89.  
  90.                 EI                              ; 4
  91.                 RET                             ; 10=14
  92.  
  93.                 DUPL 0x003E-$,0xFF
  94.                 EI
  95.                 RET
  96.  
  97. ; выход из RST8
  98. EXIT_RST8       LD BC,P4_EXIT_RST8              ; адрес возврата в последней странице RAM
  99.                 PUSH BC
  100.                 LD BC,WIN_P0
  101.                 XOR A
  102.                 JP ADR_SEL_ROM
  103.  
  104. ; вход RST 8 для DOS
  105. RST8_DOS        LD HL,ERST8_DOS
  106.                 JP NEXT_RST
  107.  
  108. ; выход RST 8 для DOS
  109. ERST8_DOS       LD BC,WIN_A0
  110.                 LD A,6
  111.                 JP ADR_SEL_ROM
  112.  
  113. ; обработчик MAGIC
  114.                 DUPL 0x0066-$,0xFF
  115.                 NOP
  116. CONT_MAGIC      NOP
  117.                 DI
  118.                 LD HL,N_77
  119.                 CALL CONVERT_BPORT
  120.                 CALL STORE_AY                   ; сохранение состояния регистров и заглушение AY
  121.                 LD A,(CPU6+DEBUG_ONOFF)
  122.                 BIT B_TRACE_DBG,A
  123.                 JP NZ,DEBUGGER                  ; если активен отладчик, то переход на его запуск
  124.                 LD A,(N_BF)
  125.                 AND M_BREAK_BF
  126.                 JP Z,CONT_MAGIC2
  127.                 LD HL,(NADRRET_L)
  128.                 LD A,H
  129.                 CP 5
  130.                 JP NZ,CONT_MAGIC2
  131.                 LD A,L
  132.                 CP 0x6C
  133.                 JP NC,CONT_MAGIC2
  134.                 CP 0x67
  135.                 JP C,CONT_MAGIC2
  136.  
  137.                 CALL MAINPAGE3_TAP
  138.                 LD HL,(NREG_IXL)
  139.                 LD (RREG_IXL),HL
  140.                 LD HL,(NREG_E)
  141.                 LD (RREG_E),HL
  142.                 LD HL,(NREG_F)
  143.                 LD (RREG_F),HL
  144.         ROMCALL EMULOADTAP,ROM_RST82
  145.                 LD HL,(RREG_IXL)
  146.                 LD (NREG_IXL),HL
  147.                 LD HL,(RREG_E)
  148.                 LD (NREG_E),HL
  149.                 LD HL,0x56B
  150.                 LD (NADRRET_L),HL
  151.                 LD HL,(RREG_F)
  152.                 LD (NREG_F),HL
  153.                 JP CONTMAGIC3
  154.  
  155.                 DUPL 0x00FF-$,0xFF
  156.                 DW 0x0038
  157.  
  158. ; таблица переходов для RST 8
  159. CODE_TABL       DW AY_PRN_INIT_                 ; 40
  160.                 DW AY_PRN_A__                   ; 41
  161.                 DW AY_PRN_TOKEN_                ; 42
  162.                 DW AY_PRN_SCR_                  ; 43
  163.                 DW TAPE_INIT_                   ; 44
  164.                 DW TAPE_EMUL_                   ; 45
  165.                 DW WINW_                        ; 46
  166.                 DW PRINT_MESSAGE_               ; 47
  167.                 DW PRINT_A_                     ; 48
  168.                 DW SCRUP_                       ; 49
  169.                 DW SCRDN_                       ; 4A
  170.                 DW SET_MODE_                    ; 4B
  171.                 DW MATH                         ; 4C
  172.                 DW VERSION_                     ; 4D
  173.                 DW RESERVED                     ; 4E
  174.                 DW RESERVED                     ; 4F
  175.                 DW COM_DEV                      ; 50
  176.                 DW COM_FAT                      ; 51
  177.                 DW SORT_FINDFILES               ; 52
  178.                 DW MOUNTER                      ; 53
  179.                 DW INST_FATBOOT_                ; 54
  180.                 DW CMOS_RW_                     ; 55
  181.                 DW SETUP_PAL_                   ; 56
  182.                 DW SETUP_FONT_                  ; 57
  183. ECODE_TABL
  184.  
  185. ;===============
  186.  
  187. ; вход в основное меню MAGIC если не перехвачено отладчиком
  188. CONT_MAGIC2     LD BC,CONF_128
  189. ;               LD A,(N_7FFD)
  190.         READ_7FFD
  191.                 AND ZX_SCREEN!0xFF
  192.                 OUT (C),A                       ; включение отображения экрана 0
  193.                 LD A,(N_77)
  194.                 CALL CMP_SCRMODE                ; проверка видеорежима прерванной программы
  195.                 LD HL,EI_RET
  196.                 LD (ADR_INT),HL                 ; заглушка на прерывания
  197.         ROMCALL STORE_TXTMODE,ROM_RST82         ; сохранение текстмодного экрана
  198.         ROMCALL SCAN_FONT,ROM_RST80             ; чтение текущего загруженного шрифта
  199.         ROMCALL RD_SET_PAL,ROM_RST82            ; сохранение и установка палитры для MAGIC
  200. ;==========времянка
  201.         IF _CMP_FONT=1
  202.                 CALL CMP_FONT                   ; времянка, проверка считанного шрифта
  203.                 RLA
  204.                 LD (CMP_FONT_FLAG),A
  205.         ENDIF
  206. ;==========времянка
  207.         ROMCALL MAGIC_FONT,ROM_RST82            ; установка временного шрифта для MAGIC режима
  208. CONT_MAGIC1     LD A,(CPU6+DEBUG_ONOFF)
  209.                 BIT B_DBG_ACTIV,A
  210.                 JP NZ,DEBUGGER                  ; если активен отладчик, то переход на его запуск
  211.                 JP RESTART_NMI
  212.  
  213. VERSION_        LD HL,VERSBIN >> 16
  214.                 LD (RREG_C),HL
  215.                 LD HL,VERSBIN & 0xFFFF
  216.                 LD (RREG_E),HL
  217.         IFDEF DOS_FE
  218.                 LD L,1                          ; требует прошивки zxevo_fw.bin из standalone_base_trdemu
  219.         ELSE
  220.                 LD L,0                          ; прошивка не критична
  221.         ENDIF
  222.                 LD BC,FDD_EMU_PORT
  223.                 IN H,(C)                        ; сохраняем текущее значение порта
  224.                 LD E,%00001010
  225.                 OUT (C),E                       ; записали число
  226.                 IN A,(C)                        ; прочитали обратно
  227.                 CP E
  228.                 JR Z,.L1
  229.                 SET B_INCORRECTFPGA,L           ; при не совпадении зашито zxevo_fw.bin не той системы
  230. .L1             LD A,L
  231.                 LD (RREG_A),A                   ; выставили в A что получилось
  232.                 OUT (C),H                       ; восстановили текщее значение порта
  233.                 RET
  234.  
  235. SETUP_FONT_
  236.         ROMCALL SETUP_FONT,ROM_RST81
  237.                 RET
  238.  
  239. SET_MAP_
  240.         ROMCALL 0x40,ROM_ERS
  241.                 RET
  242.  
  243. SETUP_PAL_
  244.         ROMCALL SETUP_PAL,ROM_RST82
  245. RESERVED        RET
  246.  
  247. AY_PRN_INIT_
  248.         ROMCALL AY_PRN_INIT,ROM_RST82
  249.                 RET
  250.  
  251. AY_PRN_A__
  252.         ROMCALL AY_PRN_A_,ROM_RST82
  253.                 RET
  254.  
  255. AY_PRN_TOKEN_
  256.         ROMCALL AY_PRN_TOKEN,ROM_RST82
  257.                 RET
  258.  
  259. AY_PRN_SCR_
  260.         ROMCALL AY_PRN_SCR,ROM_RST82
  261.                 RET
  262.  
  263. TAPE_INIT_
  264.         ROMCALL TAPE_INIT,ROM_RST82
  265.                 RET
  266.  
  267. TAPE_EMUL_
  268.         ROMCALL TAPE_EMUL,ROM_RST82
  269.                 RET
  270.  
  271. WINW_
  272.                 ROMCALL WINW,ROM_RST82
  273.                 RET
  274.  
  275. PRINT_MESSAGE_
  276.         ROMCALL PRINT_MESSAGE,ROM_RST82
  277.                 RET
  278.  
  279. PRINT_A_
  280.         ROMCALL PRINT_A,ROM_RST82
  281.                 RET
  282.  
  283. SCRUP_          LD A,(RREG_A)
  284.                 LD (SCROLL_MODE),A
  285.         ROMCALL SCRUP,ROM_RST82
  286.                 RET
  287.  
  288. SCRDN_          LD A,(RREG_A)
  289.                 LD (SCROLL_MODE),A
  290.         ROMCALL SCRDN,ROM_RST82
  291.                 RET
  292.  
  293. SET_MODE_
  294.         ROMCALL SET_MODE,ROM_RST82
  295.                 RET
  296.  
  297. INST_FATBOOT_
  298.         ROMCALL UNP_MICRO_BOOT,ROM_RST80
  299.                 RET
  300.  
  301. CMOS_RW_
  302.         ROMCALL CMOS_RW,ROM_RST82
  303.                 RET
  304.  
  305. RST8PAGE0       LD HL,ERST8PAGE0
  306.                 JP NEXT_RST
  307.  
  308. ERST8PAGE0      LD BC,WIN_A0
  309.                 XOR A
  310.                 JP ADR_SEL_ROM
  311.  
  312. SELECT_MAPPER  
  313. ;               LD A,(R_7FFD)
  314.         READ_7FFD
  315.                 AND 0x10
  316.                 RET NZ
  317.                 LD A,-8
  318.                 ADD A,L
  319.                 LD L,A
  320.                 RET
  321.  
  322. RESTART_NMI
  323.         ROMCALL CLS_TXTMODE8,ROM_RST82          ; очистка текстмодного экрана
  324.         EVOPORT WIN_A5,ROM_RST83                ; включение этой страницы ROM во 2 окно проецирования
  325.                 LD HL,CPU5+TEXT_PORTREGS
  326.         ROMCALL PRTT_MSG,ROM_RST82              ; печать текста
  327.         ROMCALL PRT_PORTREGS,ROM_RST82          ; печать содержимого портов считанной конфигурации
  328. ;==========времянка
  329.         IF _CMP_FONT=1
  330.                 LD HL,CPU5+TXT_VERIFY_FONT
  331.         ROMCALL PRTT_MSG,ROM_RST82              ; печать текста о проверке шрифта
  332.                 LD A,(CMP_FONT_FLAG)
  333.                 RRA
  334.                 LD HL,CPU5+TXT_VERIFY_OK        ; текст если все совпало
  335.                 JR NC,CONTMAGIC3_
  336.                 LD HL,CPU5+TXT_VERIFY_ERR       ; текст если не совпало
  337. CONTMAGIC3_
  338.         ROMCALL PRTT_MSG,ROM_RST82              ; печать об ошибке
  339.         ENDIF
  340. ;==========времянка
  341.         EVOPORT WIN_A5,ROM_RST81                ; включение дополнений в 1 окно проецирования
  342.                 LD IX,MAIN_MENU
  343.         ROMCALL SETUP4SEL,ROM_RST82
  344.         ROMCALL ITWINW,ROM_RST82                ; вывод окна на текстмодный экран
  345.         ROMCALL ITSELECTOR,ROM_RST82
  346.                 AND A
  347.                 JR Z,CONTMAGIC2
  348.                 DEC A
  349.                 JR Z,RESTART_NMI
  350.                 DEC A
  351.                 JR Z,CONTMAGIC3
  352. CONTMAGIC2      XOR A
  353.                 IN A,(0xFE)
  354.                 CPL
  355.                 AND 0x1F
  356.                 JR NZ,CONTMAGIC2                ; ждем отпускания кнопок клавиатуры
  357.         ROMCALL RESTORE_TXTMODE,ROM_RST82       ; восстановление текстмодного экрана
  358.         ROMCALL RESTORE_FONT,ROM_RST82          ; восстановление шрифта
  359.         ROMCALL RESTORE_PAL,ROM_RST82           ; восстановление палитры
  360. CONTMAGIC3      CALL RESTORE_AY                 ; восстановление рагистров AY
  361.                 LD BC,EXITNMISERVICE
  362.                 PUSH BC
  363.                 LD BC,WIN_P0
  364.                 XOR A
  365.                 JP ADR_SEL_ROM
  366.  
  367. ; продолжение обработки RST8
  368. NEXT_RST8       LD HL,EXIT_RST8
  369. NEXT_RST        PUSH HL
  370.                 LD (INTERNAL_SP),SP
  371.                 LD HL,R_77
  372.                 CALL CONVERT_BPORT
  373.                 CALL P5_READ_BYTE
  374.                 LD A,(R_77)
  375.                 CALL CMP_SCRMODE
  376.                 LD HL,B1_CPU2
  377.                 CALL SELECT_MAPPER
  378. NEXT_RST1       LD B,(HL)
  379.                 INC HL
  380.                 LD A,(HL)
  381.                 AND 8
  382.                 LD A,B
  383.                 JR Z,NEXT_RST2
  384.                 OR 0xC0
  385. NEXT_RST2       LD (PAGE4READ),A
  386.                 LD A,(NEXTBYTERST8)
  387.                 AND 0x3F
  388.                 LD L,A
  389.                 LD H,0
  390.                 ADD HL,HL
  391.                 LD DE,CODE_TABL
  392.                 ADD HL,DE
  393.                 LD E,(HL)
  394.                 INC HL
  395.                 LD D,(HL)
  396.                 EX DE,HL
  397.                 JP (HL)
  398.  
  399. ; переконфигурация окон проецирования
  400. ; страница переменных в окно 1, основная память в зависимости от адреса в окна 2 и 3
  401. RESETUP_WINS    EXX
  402.                 LD BC,WIN_P5
  403.                 XOR A
  404.                 OUT (C),A                       ; страница переменных в окно 1
  405.                 LD HL,CPU3
  406.                 ADD HL,SP
  407.                 LD SP,HL                        ; стек тоже в окно 1
  408.                 LD HL,B1_CPU0-CPU5              ; для 0 маппера
  409.                 CALL SELECT_MAPPER
  410. RESETUPWINS1    EXX
  411.                 LD BC,CPU6                      ; адрес чтения/записи на 0x8000 выше
  412.                 LD A,H                          ; проверка старшего байта адреса
  413.                 EXX
  414.                 CP 0x40
  415.                 JR C,RESETUPWINS2               ; установка для окон 0,1
  416.                 INC HL
  417.                 INC HL
  418.                 EXX
  419.                 LD BC,CPU5                      ; адрес чтения/записи на 0x4000 выше
  420.                 EXX
  421.                 CP 0x80
  422.                 JR C,RESETUPWINS2               ; установка для окон 1,2
  423.                 INC HL
  424.                 INC HL
  425.                 EXX
  426.                 LD BC,CPU0                      ; адрес чтения/записи без изменений
  427.                 EXX
  428.                 CP 0xC0
  429.                 JR C,RESETUPWINS2               ; установка для окон 2,3
  430.                 INC HL
  431.                 INC HL
  432.                 EXX
  433.                 LD BC,CPU3                      ; адрес чтения/записи на 0x4000 ниже
  434.                 EXX
  435.                 LD B,HIGH (WIN_A6)              ; старший байт адреса порта окна 2
  436.                 CALL RESETUPWINS4
  437.                 LD DE,0xFFF8
  438.                 ADD HL,DE                       ; адрес где конфиг страниц основной памяти лежит
  439.                 JR RESETUPWINS5
  440.  
  441. RESETUPWINS2    LD B,HIGH (WIN_A6)              ; старший байт адреса порта окна 2
  442.                 CALL RESETUPWINS4
  443. RESETUPWINS5    LD B,HIGH (WIN_A3)              ; старший байт адреса порта окна 3
  444.                 CALL RESETUPWINS4
  445.                 EXX
  446.                 RET
  447.  
  448. RESETUPWINS4    LD E,(HL)                       ; байт для записи в порт
  449.                 INC HL                          ; указание на байт адреса порта
  450.                 BIT 3,(HL)
  451.                 JR NZ,RESETUPWINS3
  452.                 SET 3,B
  453.                 LD A,(HL)
  454.                 AND 3
  455.                 RRCA
  456.                 RRCA
  457.                 OUT (C),A                       ; сначала пишем в порт xFF7
  458.                 RES 3,B
  459. RESETUPWINS3    INC HL
  460.                 OUT (C),E                       ; теперь пишем в порт x7F7
  461.                 RET
  462.  
  463. ; чтение байта из области памяти вызвашей проги
  464. P5_READ_BYTE    PUSH HL
  465.                 PUSH DE
  466.                 PUSH BC
  467.                 PUSH AF
  468.                 LD A,(RADRRET_H)                ; старший байт адреса откуда читать
  469.                 CP 0x40
  470.                 JR NC,READBYTE_03
  471. ; если адрес чтения ниже 0x4000
  472.                 LD HL,B1_CPU0                   ; байты и адреса портов 0 маппера
  473.                 CALL SELECT_MAPPER
  474. READ_CPU0_01    LD D,(HL)                       ; байт для записи в порт
  475.                 INC HL
  476.                 LD A,(HL)                       ; старший байт адреса порта нужной страницы
  477.                 AND HIGH (WIN_A5)
  478.                 OR HIGH (WIN_P5)                ; преобразовали старший байт адреса для включения в 1 окне
  479.                 LD B,A
  480.                 LD C,LOW (WIN_A0)               ; BC = адрес порта
  481.                 LD A,(R_77)
  482.                 LD E,0x3F
  483.                 AND 0x10                        ; определяем DOS или не DOS
  484.                 JR Z,READ_CPU0_02
  485.                 DEC E
  486. READ_CPU0_02    LD A,D
  487.                 AND E
  488.                 OUT (C),A                       ; включаем пагу BASIC или DOS
  489.                 LD DE,CPU5                      ; смещение до 1 окна проецирования
  490.                 LD HL,(RADRRET_L)               ; адрес откуда читать
  491.                 ADD HL,DE                       ; читать через 1 окно проецирования
  492.                 LD A,(HL)                       ; прочитали байт
  493.                 SBC HL,DE                       ; вернули адрес байта
  494.                 INC HL                          ; увеличили адрес возврата
  495.                 LD (RADRRET_L),HL               ; вернули адрес возврата
  496.                 JR READBYTE_02
  497.  
  498. ; если адрес чтения выше 0x4000
  499. READBYTE_03     LD HL,B1_CPU0                   ; байты и адреса портов 0 маппера
  500.                 CALL SELECT_MAPPER
  501. READBYTE_01     LD A,(RADRRET_H)                ; старший байт адреса откуда читать
  502.                 AND 0xC0
  503.                 LD C,A
  504.                 RLCA
  505.                 RLCA
  506.                 RLCA
  507.                 LD E,A
  508.                 LD D,0                          ; DE = смещение в таблице байта и старшего байта страницы чтения
  509.                 ADD HL,DE
  510.                 LD D,(HL)                       ; байт для записи в порт
  511.                 INC HL
  512.                 LD A,(HL)
  513.                 AND HIGH (WIN_A5)
  514.                 OR HIGH (WIN_P5)
  515.                 LD B,A
  516.                 LD C,LOW (WIN_A5)               ; BC = адрес порта для 1 окна проецирования
  517.                 LD HL,(RADRRET_L)               ; адрес откуда читать
  518.                 OUT (C),D                       ; включили страницу для чтения байта
  519.                 LD E,L                          ; младший байт адреса чтения
  520.                 LD A,H
  521.                 AND HIGH (WIN_A5)
  522.                 OR HIGH (CPU5)
  523.                 LD D,A                          ; старший байт адреса чтения
  524.                 LD A,(DE)                       ; прочитали байт
  525.                 INC HL                          ; увеличили адрес возврата
  526.                 LD (RADRRET_L),HL               ; вернули адрес возврата
  527. READBYTE_02     LD (NEXTBYTERST8),A             ; положили прочитанный байт
  528.                 CALL MAIN_MEM13                 ; вернули страницы в 1 и 3 окно проецирования
  529.                 POP AF
  530.                 POP BC
  531.                 POP DE
  532.                 POP HL
  533.                 RET
  534.  
  535. LDIR_BYTES      EXX
  536.                 LD BC,INT_ONLY_RET
  537.                 PUSH BC
  538.                 LD BC,LDIR__BYTES
  539.                 PUSH BC
  540.                 LD BC,WIN_P0
  541.                 XOR A
  542.                 JP ADR_SEL_ROM
  543.  
  544. ; восстановлениe страниц в окнах проецирования 1 и 3
  545. MAIN_MEM13      LD HL,B1_CPU1                   ; для 0 маппера
  546.                 CALL SELECT_MAPPER
  547. MAINMEM1        CALL MAINMEM3                   ; вернули для 1 окна проецирования
  548.                 INC HL                          ; далее возвращаем для 3 окна проецирования
  549.                 INC HL
  550.                 CALL MAINMEM3
  551. SET_7FFD        DEC HL
  552.                 BIT 3,(HL)
  553.                 RET Z
  554.                 DEC HL
  555.                 BIT 7,(HL)
  556.                 RET Z
  557.         READ_7FFD
  558.                 LD D,A
  559.                 LD E,0
  560.                 LD HL,PAGES_7FFD_ALL
  561.                 JR NZ,SET7FFD1
  562.                 AND 0xE0
  563.                 RRCA
  564.                 RRCA
  565.                 LD E,A
  566. SET7FFD1        LD A,D
  567.                 AND 7
  568.                 OR E
  569.                 LD E,A
  570.                 LD D,0
  571.                 ADD HL,DE
  572.                 LD A,(HL)
  573.                 OUT (C),A
  574.                 RET
  575.  
  576. XXF7_7FFD       MACRO B
  577. PLUSIK := B
  578.                 REPT 8
  579.                 DB PLUSIK
  580. PLUSIK := PLUSIK-1
  581.                 ENDM
  582.                 ENDM
  583.  
  584. PAGES_7FFD_ALL  XXF7_7FFD 0xFF
  585.                 XXF7_7FFD 0xEF
  586.                 XXF7_7FFD 0xDF
  587.                 XXF7_7FFD 0xCF
  588.  
  589.                 XXF7_7FFD 0xF7
  590.                 XXF7_7FFD 0xE7
  591.                 XXF7_7FFD 0xD7
  592.                 XXF7_7FFD 0xC7
  593.  
  594. MAINPAGE3_TAP   LD HL,B1_CPU3
  595.                 CALL SELECT_MAPPER
  596.                 CALL MAINMEM3
  597.                 JR SET_7FFD
  598.  
  599. MAINMEM3        LD C,LOW (WIN_A0)
  600.                 LD E,(HL)
  601.                 INC HL
  602.                 LD A,8
  603.                 AND (HL)
  604.                 LD A,E
  605.                 JR Z,MAINMEM4
  606.                 OR 0xC0
  607. MAINMEM4        LD E,A
  608.                 LD A,(HL)
  609.                 OR 0x3F
  610.                 LD B,A
  611.                 LD A,0x40
  612.                 OUT (C),A
  613.                 RES 3,B
  614.                 INC HL
  615.                 OUT (C),E
  616. INT_ONLY_RET    RET
  617.  
  618. ; конверсия считанных значений из портов конфигурации
  619. ; HL = адрес откуда брать считанные значения для конверсии
  620. ; DE = биты 7,6 для декодирования
  621. ; BC = куда складывать декодированное
  622. ;  A = считанное значение для конверсии для порта xx77
  623. CONVERT_BPORT   LD A,(HL)
  624.                 PUSH AF
  625.                 INC HL
  626.                 INC HL
  627.                 INC HL
  628.                 LD E,(HL)
  629.                 INC HL
  630.                 LD D,(HL)
  631.                 LD BC,8
  632.                 LD A,C                          ; конвертить 8 байт
  633.                 ADD HL,BC
  634.                 LD BC,B0_CPU0
  635.                 LD IYL,HIGH (WIN_A3)&0xF8
  636. CBPORT03        EX AF,AF'
  637.                 LD A,(HL)
  638.                 CP 0xC0
  639.                 JR NC,CBPORT01
  640. ; если число менее, то восстанавливать в порты x7F7
  641.                 LD (BC),A                       ; номер страницы для записи в порт при восстановлении
  642.                 INC BC
  643.                 LD A,IYL
  644.                 ADD A,0x40
  645.                 LD IYL,A
  646.                 AND 0xF0
  647.                 SRL E
  648.                 SRL D
  649.                 LD (BC),A                       ; старший байт адреса порта
  650.                 INC BC
  651.                 JR CBPORT02
  652.  
  653. ; если число больше, то восстанавливать в порты xFF7
  654. CBPORT01        LD A,(HL)
  655.                 RLCA
  656.                 RLCA
  657.                 SRL D
  658.                 RRA
  659.                 SRL E
  660.                 RRA
  661.                 LD (BC),A                       ; номер страницы для записи в порт при восстановлении
  662.                 INC BC
  663.                 LD A,IYL
  664.                 ADD A,0x40
  665.                 LD IYL,A
  666.                 LD (BC),A                       ; старший байт адреса порта
  667.                 INC BC
  668. CBPORT02        DEC HL
  669.                 EX AF,AF'
  670.                 DEC A
  671.                 JR NZ,CBPORT03
  672.                 POP HL
  673.                 LD L,0xBC
  674.                 LD A,H
  675.                 AND 0x0F
  676.                 OR 0xA0
  677.                 LD (BC),A                       ; байт для записи в порт при восстановлении
  678.                 INC BC
  679.                 LD A,H
  680.                 AND 0x80
  681.                 RRCA
  682.                 OR L
  683.                 LD L,A
  684.                 LD A,H
  685.                 AND 0x60
  686.                 RLCA
  687.                 RLCA
  688.                 RLCA
  689.                 OR L
  690.                 LD (BC),A                       ; старший байт адреса порта
  691.                 RET
  692.  
  693. READ_KEYS
  694.                 RET
  695.  
  696. ; драйвера
  697.                 include fat/mounter.a80
  698.                 include fat/dev_drv.a80
  699.                 include fat/ngs_sd_drv.a80
  700.                 include fat/z_sd_drv.a80
  701.                 include fat/nemo_drv.a80
  702.                 include fat/read_fat.a80
  703.                 include fat/usb_drv.a80
  704.  
  705. STORE_AY        LD HL,AY_REGS
  706.                 LD DE,0xFFC0
  707.                 LD C,0xFD
  708.                 LD A,0x0D
  709. STORE_AY1       LD B,D
  710.                 OUT (C),A
  711.                 LD B,E
  712.                 INI
  713.                 DEC A
  714.                 JP P,STORE_AY1
  715.                 DEC E
  716.                 LD H,0
  717.                 LD A,0x0D
  718. STORE_AY2       LD B,D
  719.                 OUT (C),A
  720.                 LD B,E
  721.                 OUT (C),H
  722.                 DEC A
  723.                 JP P,STORE_AY2
  724.                 RET
  725.  
  726. RESTORE_AY      LD HL,AY_REGS
  727.                 LD DE,0xFFC0
  728.                 LD C,0xFD
  729.                 LD A,0x0D
  730. RESTORE_AY1     LD B,D
  731.                 OUT (C),A
  732.                 LD B,E
  733.                 OUTI
  734.                 DEC A
  735.                 JP P,RESTORE_AY1
  736.                 RET
  737.  
  738. SYMS4SORT       DB ".!#$%&'()-0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`{}~",0x7F
  739.                 DB "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯЁ",0
  740.  
  741. X_OFFSET        EQU 63
  742. Y_OFFSET        EQU 2
  743. TEXT_PORTREGS   DB 0x17,MAGIC_COLOR
  744.                 DB 0x16,Y_OFFSET+0x01,X_OFFSET+0,"SP:      PC:"
  745.                 DB 0x16,Y_OFFSET+0x02,X_OFFSET+0,"IR:"
  746.                 DB 0x16,Y_OFFSET+0x03,X_OFFSET+0,"AF:     AF':"
  747.                 DB 0x16,Y_OFFSET+0x04,X_OFFSET+0,"BC:     BC':"
  748.                 DB 0x16,Y_OFFSET+0x05,X_OFFSET+0,"DE:     DE':"
  749.                 DB 0x16,Y_OFFSET+0x06,X_OFFSET+0,"HL:     HL':"
  750.                 DB 0x16,Y_OFFSET+0x07,X_OFFSET+0,"IX:      IY:"
  751.                 DB 0x16,Y_OFFSET+0x08,X_OFFSET+0," INT      IM"
  752.                 DB 0x16,Y_OFFSET+0x0A,X_OFFSET+0,"  MAP  0 1"
  753.                 DB 0x16,Y_OFFSET+0x0B,X_OFFSET+0,"CPU3:"
  754.                 DB 0x16,Y_OFFSET+0x0C,X_OFFSET+0,"CPU2:"
  755.                 DB 0x16,Y_OFFSET+0x0D,X_OFFSET+0,"CPU1:"
  756.                 DB 0x16,Y_OFFSET+0x0E,X_OFFSET+0,"CPU0:"
  757.                 DB 0x16,Y_OFFSET+0x10,X_OFFSET+0,"7FFD:   FF:"
  758.                 DB 0x16,Y_OFFSET+0x11,X_OFFSET+0,"EFF7:   7F:"
  759.                 DB 0x16,Y_OFFSET+0x12,X_OFFSET+0,"  77:   5F:"
  760.                 DB 0x16,Y_OFFSET+0x13,X_OFFSET+0,"  BF:   3F:"
  761.                 DB 0x16,Y_OFFSET+0x14,X_OFFSET+0," DOS:   1F:"
  762.                 DB 0x16,Y_OFFSET+0x15,X_OFFSET+0,"BREAK:"
  763.                 DB 0x16,1,0x10,0x17,0x32," EVO Magic Service beta ",0
  764.  
  765. TXT_VERIFY_FONT DB 0x16,0x18,0,0x17,0x22,"  VERIFY READING FONT ",0
  766. TXT_VERIFY_OK   DB " OK    ",0
  767. TXT_VERIFY_ERR  DB "ERROR  ",0
  768.  
  769. ; проверка считанного фонта
  770.         IF _CMP_FONT=1
  771. CMP_FONT        LD H,CMOS_BYTE_00
  772.         ROMCALL READCMOS,ROM_RST82
  773.                 AND M_TYPE_FONT
  774.                 LD HL,CP866_FONT
  775.                 JR NZ,CMPFONT1
  776.                 LD HL,ATM_FONT
  777. CMPFONT1        LD DE,CPU1+OFFSET_BUFSYM
  778.                 PUSH DE
  779.         ROMCALL UNPACK,ROM_RST80
  780.                 POP DE
  781.                 INC D
  782.                 LD BC,0x700
  783.                 LD HL,CPU1+OFFSET_FNTSAVE+0x100
  784. CMPFONT2        LD A,(DE)
  785.                 INC DE
  786.                 CP (HL)
  787.                 SCF
  788.                 RET NZ
  789.                 CPI
  790.                 JP PE,CMPFONT2
  791.                 XOR A
  792.                 RET
  793.         ENDIF
  794.  
  795. CMP_SCRMODE     LD HL,FLAGS
  796.                 RES B_VIDEO_MODE,(HL)
  797.                 AND 7
  798.                 CP 3
  799.                 RET Z
  800.                 SET B_VIDEO_MODE,(HL)
  801.                 RET
  802.  
  803. SD_CARD_LOST    LD HL,FLAGS_DRV
  804.                 LD A,B_NEW_SD
  805.                 OR (HL)
  806.                 LD (HL),A
  807.         PEC_ON M_SHADOW_BF
  808.                 CALL MAIN_MEM13
  809.                 LD IX,SDCARD_LOST
  810.         ROMCALL IWINW,ROM_RST82
  811.                 JR $
  812.  
  813.                 include math.a80
  814.                 include sortfiles.a80
  815.  
  816. FREE_MAIN       EQU 0x3FF6-$
  817.  
  818.                 DUPL FREE_MAIN,0xFF
  819.                 DW FREE_MAIN                    ; размер свободного места
  820.                 DB "RST_08"
  821.                 DW DATA_VERS
  822.         DEPHASE
  823.  
  824.                 include addons.a80
  825.                 include addon1.a80
  826.                 include addon2.a80
  827.                 include mainmenu.a80
  828.