Subversion Repositories pentevo

Rev

Rev 1041 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ; LAST UPDATE: 14.10.2023 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 M_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
  361. ;               CALL RESTORE_AY                 ; восстановление рагистров AY
  362.                 LD BC,EXITNMISERVICE
  363.                 PUSH BC
  364.                 LD BC,WIN_P0
  365.                 XOR A
  366.                 JP ADR_SEL_ROM
  367.  
  368. ; продолжение обработки RST8
  369. NEXT_RST8       LD HL,EXIT_RST8
  370. NEXT_RST        PUSH HL
  371.                 LD (INTERNAL_SP),SP
  372.                 LD HL,R_77
  373.                 CALL CONVERT_BPORT
  374.                 CALL P5_READ_BYTE
  375.                 LD A,(R_77)
  376.                 CALL CMP_SCRMODE
  377.                 LD HL,B1_CPU2
  378.                 CALL SELECT_MAPPER
  379. NEXT_RST1       LD B,(HL)
  380.                 INC HL
  381.                 LD A,(HL)
  382.                 AND 8
  383.                 LD A,B
  384.                 JR Z,NEXT_RST2
  385.                 OR 0xC0
  386. NEXT_RST2       LD (PAGE4READ),A
  387.                 LD A,(NEXTBYTERST8)
  388.                 AND 0x3F
  389.                 LD L,A
  390.                 LD H,0
  391.                 ADD HL,HL
  392.                 LD DE,CODE_TABL
  393.                 ADD HL,DE
  394.                 LD E,(HL)
  395.                 INC HL
  396.                 LD D,(HL)
  397.                 EX DE,HL
  398.                 JP (HL)
  399.  
  400. ; переконфигурация окон проецирования
  401. ; страница переменных в окно 1, основная память в зависимости от адреса в окна 2 и 3
  402. RESETUP_WINS    EXX
  403.                 LD BC,WIN_P5
  404.                 XOR A
  405.                 OUT (C),A                       ; страница переменных в окно 1
  406.                 LD HL,CPU3
  407.                 ADD HL,SP
  408.                 LD SP,HL                        ; стек тоже в окно 1
  409.                 LD HL,B1_CPU0-CPU5              ; для 0 маппера
  410.                 CALL SELECT_MAPPER
  411. RESETUPWINS1    EXX
  412.                 LD BC,CPU6                      ; адрес чтения/записи на 0x8000 выше
  413.                 LD A,H                          ; проверка старшего байта адреса
  414.                 EXX
  415.                 CP 0x40
  416.                 JR C,RESETUPWINS2               ; установка для окон 0,1
  417.                 INC HL
  418.                 INC HL
  419.                 EXX
  420.                 LD BC,CPU5                      ; адрес чтения/записи на 0x4000 выше
  421.                 EXX
  422.                 CP 0x80
  423.                 JR C,RESETUPWINS2               ; установка для окон 1,2
  424.                 INC HL
  425.                 INC HL
  426.                 EXX
  427.                 LD BC,CPU0                      ; адрес чтения/записи без изменений
  428.                 EXX
  429.                 CP 0xC0
  430.                 JR C,RESETUPWINS2               ; установка для окон 2,3
  431.                 INC HL
  432.                 INC HL
  433.                 EXX
  434.                 LD BC,CPU3                      ; адрес чтения/записи на 0x4000 ниже
  435.                 EXX
  436.                 LD B,HIGH (WIN_A6)              ; старший байт адреса порта окна 2
  437.                 CALL RESETUPWINS4
  438.                 LD DE,0xFFF8
  439.                 ADD HL,DE                       ; адрес где конфиг страниц основной памяти лежит
  440.                 JR RESETUPWINS5
  441.  
  442. RESETUPWINS2    LD B,HIGH (WIN_A6)              ; старший байт адреса порта окна 2
  443.                 CALL RESETUPWINS4
  444. RESETUPWINS5    LD B,HIGH (WIN_A3)              ; старший байт адреса порта окна 3
  445.                 CALL RESETUPWINS4
  446.                 EXX
  447.                 RET
  448.  
  449. RESETUPWINS4    LD E,(HL)                       ; байт для записи в порт
  450.                 INC HL                          ; указание на байт адреса порта
  451.                 BIT 3,(HL)
  452.                 JR NZ,RESETUPWINS3
  453.                 SET 3,B
  454.                 LD A,(HL)
  455.                 AND 3
  456.                 RRCA
  457.                 RRCA
  458.                 OUT (C),A                       ; сначала пишем в порт xFF7
  459.                 RES 3,B
  460. RESETUPWINS3    INC HL
  461.                 OUT (C),E                       ; теперь пишем в порт x7F7
  462.                 RET
  463.  
  464. ; чтение байта из области памяти вызвашей проги
  465. P5_READ_BYTE    PUSH HL
  466.                 PUSH DE
  467.                 PUSH BC
  468.                 PUSH AF
  469.                 LD A,(RADRRET_H)                ; старший байт адреса откуда читать
  470.                 CP 0x40
  471.                 JR NC,READBYTE_03
  472. ; если адрес чтения ниже 0x4000
  473.                 LD HL,B1_CPU0                   ; байты и адреса портов 0 маппера
  474.                 CALL SELECT_MAPPER
  475. READ_CPU0_01    LD D,(HL)                       ; байт для записи в порт
  476.                 INC HL
  477.                 LD A,(HL)                       ; старший байт адреса порта нужной страницы
  478.                 AND HIGH (WIN_A5)
  479.                 OR HIGH (WIN_P5)                ; преобразовали старший байт адреса для включения в 1 окне
  480.                 LD B,A
  481.                 LD C,LOW (WIN_A0)               ; BC = адрес порта
  482.                 LD A,(R_77)
  483.                 LD E,0x3F
  484.                 AND 0x10                        ; определяем DOS или не DOS
  485.                 JR Z,READ_CPU0_02
  486.                 DEC E
  487. READ_CPU0_02    LD A,D
  488.                 AND E
  489.                 OUT (C),A                       ; включаем пагу BASIC или DOS
  490.                 LD DE,CPU5                      ; смещение до 1 окна проецирования
  491.                 LD HL,(RADRRET_L)               ; адрес откуда читать
  492.                 ADD HL,DE                       ; читать через 1 окно проецирования
  493.                 LD A,(HL)                       ; прочитали байт
  494.                 SBC HL,DE                       ; вернули адрес байта
  495.                 INC HL                          ; увеличили адрес возврата
  496.                 LD (RADRRET_L),HL               ; вернули адрес возврата
  497.                 JR READBYTE_02
  498.  
  499. ; если адрес чтения выше 0x4000
  500. READBYTE_03     LD HL,B1_CPU0                   ; байты и адреса портов 0 маппера
  501.                 CALL SELECT_MAPPER
  502. READBYTE_01     LD A,(RADRRET_H)                ; старший байт адреса откуда читать
  503.                 AND 0xC0
  504.                 LD C,A
  505.                 RLCA
  506.                 RLCA
  507.                 RLCA
  508.                 LD E,A
  509.                 LD D,0                          ; DE = смещение в таблице байта и старшего байта страницы чтения
  510.                 ADD HL,DE
  511.                 LD D,(HL)                       ; байт для записи в порт
  512.                 INC HL
  513.                 LD A,(HL)
  514.                 AND HIGH (WIN_A5)
  515.                 OR HIGH (WIN_P5)
  516.                 LD B,A
  517.                 LD C,LOW (WIN_A5)               ; BC = адрес порта для 1 окна проецирования
  518.                 LD HL,(RADRRET_L)               ; адрес откуда читать
  519.                 OUT (C),D                       ; включили страницу для чтения байта
  520.                 LD E,L                          ; младший байт адреса чтения
  521.                 LD A,H
  522.                 AND HIGH (WIN_A5)
  523.                 OR HIGH (CPU5)
  524.                 LD D,A                          ; старший байт адреса чтения
  525.                 LD A,(DE)                       ; прочитали байт
  526.                 INC HL                          ; увеличили адрес возврата
  527.                 LD (RADRRET_L),HL               ; вернули адрес возврата
  528. READBYTE_02     LD (NEXTBYTERST8),A             ; положили прочитанный байт
  529.                 CALL MAIN_MEM13                 ; вернули страницы в 1 и 3 окно проецирования
  530.                 POP AF
  531.                 POP BC
  532.                 POP DE
  533.                 POP HL
  534.                 RET
  535.  
  536. LDIR_BYTES      EXX
  537.                 LD BC,INT_ONLY_RET
  538.                 PUSH BC
  539.                 LD BC,LDIR__BYTES
  540.                 PUSH BC
  541.                 LD BC,WIN_P0
  542.                 XOR A
  543.                 JP ADR_SEL_ROM
  544.  
  545. ; восстановлениe страниц в окнах проецирования 1 и 3
  546. MAIN_MEM13      LD HL,B1_CPU1                   ; для 0 маппера
  547.                 CALL SELECT_MAPPER
  548. MAINMEM1        CALL MAINMEM3                   ; вернули для 1 окна проецирования
  549.                 INC HL                          ; далее возвращаем для 3 окна проецирования
  550.                 INC HL
  551.                 CALL MAINMEM3
  552. SET_7FFD        DEC HL
  553.                 BIT 3,(HL)
  554.                 RET Z
  555.                 DEC HL
  556.                 BIT 7,(HL)
  557.                 RET Z
  558.         READ_7FFD
  559.                 LD D,A
  560.                 LD E,0
  561.                 LD HL,PAGES_7FFD_ALL
  562.                 JR NZ,SET7FFD1
  563.                 AND 0xE0
  564.                 RRCA
  565.                 RRCA
  566.                 LD E,A
  567. SET7FFD1        LD A,D
  568.                 AND 7
  569.                 OR E
  570.                 LD E,A
  571.                 LD D,0
  572.                 ADD HL,DE
  573.                 LD A,(HL)
  574.                 OUT (C),A
  575.                 RET
  576.  
  577. XXF7_7FFD       MACRO B
  578. PLUSIK := B
  579.                 REPT 8
  580.                 DB PLUSIK
  581. PLUSIK := PLUSIK-1
  582.                 ENDM
  583.                 ENDM
  584.  
  585. PAGES_7FFD_ALL  XXF7_7FFD 0xFF
  586.                 XXF7_7FFD 0xEF
  587.                 XXF7_7FFD 0xDF
  588.                 XXF7_7FFD 0xCF
  589.  
  590.                 XXF7_7FFD 0xF7
  591.                 XXF7_7FFD 0xE7
  592.                 XXF7_7FFD 0xD7
  593.                 XXF7_7FFD 0xC7
  594.  
  595. MAINPAGE3_TAP   LD HL,B1_CPU3
  596.                 CALL SELECT_MAPPER
  597.                 CALL MAINMEM3
  598.                 JR SET_7FFD
  599.  
  600. MAINMEM3        LD C,LOW (WIN_A0)
  601.                 LD E,(HL)
  602.                 INC HL
  603.                 LD A,8
  604.                 AND (HL)
  605.                 LD A,E
  606.                 JR Z,MAINMEM4
  607.                 OR 0xC0
  608. MAINMEM4        LD E,A
  609.                 LD A,(HL)
  610.                 OR 0x3F
  611.                 LD B,A
  612.                 LD A,0x40
  613.                 OUT (C),A
  614.                 RES 3,B
  615.                 INC HL
  616.                 OUT (C),E
  617. INT_ONLY_RET    RET
  618.  
  619. ; конверсия считанных значений из портов конфигурации
  620. ; HL = адрес откуда брать считанные значения для конверсии
  621. ; DE = биты 7,6 для декодирования
  622. ; BC = куда складывать декодированное
  623. ;  A = считанное значение для конверсии для порта xx77
  624. CONVERT_BPORT   LD A,(HL)
  625.                 PUSH AF
  626.                 INC HL
  627.                 INC HL
  628.                 INC HL
  629.                 LD E,(HL)
  630.                 INC HL
  631.                 LD D,(HL)
  632.                 LD BC,8
  633.                 LD A,C                          ; конвертить 8 байт
  634.                 ADD HL,BC
  635.                 LD BC,B0_CPU0
  636.                 LD IYL,HIGH (WIN_A3)&0xF8
  637. CBPORT03        EX AF,AF'
  638.                 LD A,(HL)
  639.                 CP 0xC0
  640.                 JR NC,CBPORT01
  641. ; если число менее, то восстанавливать в порты x7F7
  642.                 LD (BC),A                       ; номер страницы для записи в порт при восстановлении
  643.                 INC BC
  644.                 LD A,IYL
  645.                 ADD A,0x40
  646.                 LD IYL,A
  647.                 AND 0xF0
  648.                 SRL E
  649.                 SRL D
  650.                 LD (BC),A                       ; старший байт адреса порта
  651.                 INC BC
  652.                 JR CBPORT02
  653.  
  654. ; если число больше, то восстанавливать в порты xFF7
  655. CBPORT01        LD A,(HL)
  656.                 RLCA
  657.                 RLCA
  658.                 SRL D
  659.                 RRA
  660.                 SRL E
  661.                 RRA
  662.                 LD (BC),A                       ; номер страницы для записи в порт при восстановлении
  663.                 INC BC
  664.                 LD A,IYL
  665.                 ADD A,0x40
  666.                 LD IYL,A
  667.                 LD (BC),A                       ; старший байт адреса порта
  668.                 INC BC
  669. CBPORT02        DEC HL
  670.                 EX AF,AF'
  671.                 DEC A
  672.                 JR NZ,CBPORT03
  673.                 POP HL
  674.                 LD L,0xBC
  675.                 LD A,H
  676.                 AND 0x0F
  677.                 OR 0xA0
  678.                 LD (BC),A                       ; байт для записи в порт при восстановлении
  679.                 INC BC
  680.                 LD A,H
  681.                 AND 0x80
  682.                 RRCA
  683.                 OR L
  684.                 LD L,A
  685.                 LD A,H
  686.                 AND 0x60
  687.                 RLCA
  688.                 RLCA
  689.                 RLCA
  690.                 OR L
  691.                 LD (BC),A                       ; старший байт адреса порта
  692.                 RET
  693.  
  694. READ_KEYS
  695.                 RET
  696.  
  697. ; драйвера
  698.                 include fat/mounter.a80
  699.                 include fat/dev_drv.a80
  700.                 include fat/ngs_sd_drv.a80
  701.                 include fat/z_sd_drv.a80
  702.                 include fat/nemo_drv.a80
  703.                 include fat/read_fat.a80
  704.                 include fat/usb_drv.a80
  705.  
  706. STORE_AY        LD BC,0xFFFD
  707.                 LD A,0xFE
  708.                 OUT (C),A
  709. ;               LD HL,AY_REGS2
  710.                 CALL .L1
  711.                 LD BC,0xFFFD
  712.                 LD A,0xFF
  713.                 OUT (C),A
  714. ;               LD HL,AY_REGS1
  715. .L1             LD DE,0xFFBF;C0
  716. ;               LD A,0x0D
  717. ;.L2            LD B,D
  718. ;               OUT (C),A
  719. ;               LD B,E
  720. ;               INI
  721. ;               DEC A
  722. ;               JP P,.L2
  723. ;               DEC E
  724.                 LD H,0
  725.                 LD A,0x0D
  726. .L3             LD B,D
  727.                 OUT (C),A
  728.                 LD B,E
  729.                 OUT (C),H
  730.                 DEC A
  731.                 JP P,.L3
  732.                 RET
  733.  
  734. ;RESTORE_AY     LD BC,0xFFFD
  735. ;               LD A,0xFE
  736. ;               OUT (C),A
  737. ;               LD HL,AY_REGS2
  738. ;               CALL .L1
  739. ;               LD BC,0xFFFD
  740. ;               LD A,0xFF
  741. ;               OUT (C),A
  742. ;               LD HL,AY_REGS1
  743. ;.L1            LD DE,0xFFC0
  744. ;               LD C,0xFD
  745. ;               LD A,0x0D
  746. ;.L2            LD B,D
  747. ;               OUT (C),A
  748. ;               LD B,E
  749. ;               OUTI
  750. ;               DEC A
  751. ;               JP P,.L2
  752. ;               RET
  753.  
  754. SYMS4SORT       DB ".!#$%&'()-0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`{}~",0x7F
  755.                 DB "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯЁ",0
  756.  
  757. X_OFFSET        EQU 63
  758. Y_OFFSET        EQU 2
  759. TEXT_PORTREGS   DB 0x17,MAGIC_COLOR
  760.                 DB 0x16,Y_OFFSET+0x01,X_OFFSET+0,"SP:      PC:"
  761.                 DB 0x16,Y_OFFSET+0x02,X_OFFSET+0,"IR:"
  762.                 DB 0x16,Y_OFFSET+0x03,X_OFFSET+0,"AF:     AF':"
  763.                 DB 0x16,Y_OFFSET+0x04,X_OFFSET+0,"BC:     BC':"
  764.                 DB 0x16,Y_OFFSET+0x05,X_OFFSET+0,"DE:     DE':"
  765.                 DB 0x16,Y_OFFSET+0x06,X_OFFSET+0,"HL:     HL':"
  766.                 DB 0x16,Y_OFFSET+0x07,X_OFFSET+0,"IX:      IY:"
  767.                 DB 0x16,Y_OFFSET+0x08,X_OFFSET+0," INT      IM"
  768.                 DB 0x16,Y_OFFSET+0x0A,X_OFFSET+0,"  MAP  0 1"
  769.                 DB 0x16,Y_OFFSET+0x0B,X_OFFSET+0,"CPU3:"
  770.                 DB 0x16,Y_OFFSET+0x0C,X_OFFSET+0,"CPU2:"
  771.                 DB 0x16,Y_OFFSET+0x0D,X_OFFSET+0,"CPU1:"
  772.                 DB 0x16,Y_OFFSET+0x0E,X_OFFSET+0,"CPU0:"
  773.                 DB 0x16,Y_OFFSET+0x10,X_OFFSET+0,"7FFD:   FF:"
  774.                 DB 0x16,Y_OFFSET+0x11,X_OFFSET+0,"EFF7:   7F:"
  775.                 DB 0x16,Y_OFFSET+0x12,X_OFFSET+0,"  77:   5F:"
  776.                 DB 0x16,Y_OFFSET+0x13,X_OFFSET+0,"  BF:   3F:"
  777.                 DB 0x16,Y_OFFSET+0x14,X_OFFSET+0," DOS:   1F:"
  778.                 DB 0x16,Y_OFFSET+0x15,X_OFFSET+0,"BREAK: "
  779.                 DB 0x16,Y_OFFSET+0x16,X_OFFSET+0,"TURBO: "
  780.                 DB 0x16,1,0x10,0x17,0x32," EVO Magic Service beta ",0
  781.  
  782. TXT_VERIFY_FONT DB 0x16,0x18,0,0x17,0x22,"  VERIFY READING FONT ",0
  783. TXT_VERIFY_OK   DB " OK    ",0
  784. TXT_VERIFY_ERR  DB "ERROR  ",0
  785.  
  786. ; проверка считанного фонта
  787.         IF _CMP_FONT=1
  788. CMP_FONT        LD H,CMOS_BYTE_00
  789.         ROMCALL READCMOS,ROM_RST82
  790.                 AND M_TYPE_FONT
  791.                 LD HL,CP866_FONT
  792.                 JR NZ,CMPFONT1
  793.                 LD HL,ATM_FONT
  794. CMPFONT1        LD DE,CPU1+OFFSET_BUFSYM
  795.                 PUSH DE
  796.         ROMCALL UNPACK,ROM_RST80
  797.                 POP DE
  798.                 INC D
  799.                 LD BC,0x700
  800.                 LD HL,CPU1+OFFSET_FNTSAVE+0x100
  801. CMPFONT2        LD A,(DE)
  802.                 INC DE
  803.                 CP (HL)
  804.                 SCF
  805.                 RET NZ
  806.                 CPI
  807.                 JP PE,CMPFONT2
  808.                 XOR A
  809.                 RET
  810.         ENDIF
  811.  
  812. CMP_SCRMODE     LD HL,FLAGS
  813.                 RES B_VIDEO_MODE,(HL)
  814.                 AND 7
  815.                 CP 3
  816.                 RET Z
  817.                 SET B_VIDEO_MODE,(HL)
  818.                 RET
  819.  
  820. SD_CARD_LOST    LD HL,FLAGS_DRV
  821.                 LD A,B_NEW_SD
  822.                 OR (HL)
  823.                 LD (HL),A
  824.         PEC_ON M_SHADOW_BF
  825.                 CALL MAIN_MEM13
  826.                 LD IX,SDCARD_LOST
  827.         ROMCALL IWINW,ROM_RST82
  828.                 JR $
  829.  
  830.                 include math.a80
  831.                 include sortfiles.a80
  832.  
  833. FREE_MAIN       EQU 0x3FF6-$
  834.  
  835.                 DUPL FREE_MAIN,0xFF
  836.                 DW FREE_MAIN                    ; размер свободного места
  837.                 DB "RST_08"
  838.                 DW DATA_VERS
  839.         DEPHASE
  840.  
  841.                 include addons.a80
  842.                 include addon1.a80
  843.                 include addon2.a80
  844.                 include mainmenu.a80
  845.